http { server_tokens off; }
常常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,固然最重要的是及时升级修复漏洞html
server { listen 443; server_name ops-coffee.cn; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; }
白名单配置nginx
location /admin/ { allow 192.168.1.0/24; deny all; }
上边表示只容许192.168.1.0/24网段的主机访问,拒绝其余全部web
也能够写成黑名单的方式禁止某些地址访问,容许其余全部,例如算法
location /ops-coffee/ { deny 192.168.1.0/24; allow all; }
更多的时候客户端请求会通过层层代理,咱们须要经过$http_x_forwarded_for来进行限制,能够这样写浏览器
set $allow false; if ($http_x_forwarded_for = "211.144.204.2") { set $allow true; } if ($http_x_forwarded_for ~ "108.2.66.[89]") { set $allow true; } if ($allow = false) { return 404; }
server { location / { auth_basic "please input user&passwd"; auth_basic_user_file key/auth.key; } }
if ($request_method !~ ^(GET|POST)$ ) { return 405; }
$request_method可以获取到请求nginx的method缓存
配置只容许GETPOST方法访问,其余的method返回405安全
if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl) { return 444; }
可能有一些不法者会利用wget/curl等工具扫描咱们的网站,咱们能够经过禁止相应的user-agent来简单的防范服务器
Nginx的444状态比较特殊,若是返回444那么客户端将不会收到服务端返回的信息,就像是网站没法链接同样cookie
location /images/ { valid_referers none blocked www.ops-coffee.cn ops-coffee.cn; if ($invalid_referer) { return 403; } }
valid_referers: 验证referer,其中none容许referer为空,blocked容许不带协议的请求,除了以上两类外仅容许referer为www.ops-coffee.cn或ops-coffee.cn时访问images下的图片资源,不然返回403并发
固然你也能够给不符合referer规则的请求重定向到一个默认的图片,好比下边这样
location /images/ { valid_referers blocked www.ops-coffee.cn ops-coffee.cn if ($invalid_referer) { rewrite ^/images/.*.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last; } }
能够经过ngx_http_limit_conn_module模块限制一个IP的并发链接数
http { limit_conn_zone $binary_remote_addr zone=ops:10m; server { listen 80; server_name ops-coffee.cn; root /home/project/webapp; index index.html; location / { limit_conn ops 10; } access_log /tmp/nginx_access.log main; } }
limit_conn_zone: 设定保存各个键(例如$binary_remote_addr)状态的共享内存空间的参数,zone=空间名字:大小
大小的计算与变量有关,例如$binary_remote_addr变量的大小对于记录IPV4地址是固定的4 bytes,而记录IPV6地址时固定的16 bytes,存储状态在32位平台中占用32或者64 bytes,在64位平台中占用64 bytes。1m的共享内存空间能够保存大约3.2万个32位的状态,1.6万个64位的状态
limit_conn: 指定一块已经设定的共享内存空间(例如name为ops的空间),以及每一个给定键值的最大链接数
上边的例子表示同一IP同一时间只容许10个链接
当有多个limit_conn指令被配置时,全部的链接数限制都会生效
http { limit_conn_zone $binary_remote_addr zone=ops:10m; limit_conn_zone $server_name zone=coffee:10m; server { listen 80; server_name ops-coffee.cn; root /home/project/webapp; index index.html; location / { limit_conn ops 10; limit_conn coffee 2000; } } }
上边的配置不只会限制单一IP来源的链接数为10,同时也会限制单一虚拟服务器的总链接数为2000
缓冲区溢出*** 是经过将数据写入缓冲区并超出缓冲区边界和重写内存片断来实现的,限制缓冲区大小可有效防止
client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k;
同时须要修改几个超时时间的配置
client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10;
经过如下设置可有效防止XSS***
add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff";
在一般的请求响应中,浏览器会根据Content-Type来分辨响应的类型,但当响应类型未指定或错误指定时,浏览会尝试启用MIME-sniffing来猜想资源的响应类型,这是很是危险的
例如一个.jpg的图片文件被恶意嵌入了可执行的js代码,在开启资源类型猜想的状况下,浏览器将执行嵌入的js代码,可能会有意想不到的后果
Content-Security-Policy: 定义页面能够加载哪些资源,
add_header Content-Security-Policy "default-src 'self'";
上边的配置会限制全部的外部资源,都只能从当前域名加载,其中default-src定义针对全部类型资源的默认加载策略,self容许来自相同来源的内容
Strict-Transport-Security: 会告诉浏览器用HTTPS协议代替HTTP来访问目标站
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
上边的配置表示当用户第一次访问后,会返回一个包含了Strict-Transport-Security响应头的字段,这个字段会告诉浏览器,在接下来的31536000秒内,当前网站的全部请求都使用https协议访问,参数includeSubDomains是可选的,表示全部子域名也将采用一样的规则