参考:https://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html
Nginx安全加固
隐藏nginx 版本信息
#如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息
#在http 或者 server 部分设置,如何设置在 http 区域表示全局
server_tokens off;
禁止通过 IP 来访问,只允许通过域名访问,防止基于IP地址的扫描
#在 server 区域加入如下内容
if ($host !~ ^(your_domain.com|www.your_domain.com|en.your_domain.com)$ ) { return 403; }
3、禁用自定义的扩展名访问
#在 server 区域加入如下内容,阻止以下面后缀结尾的页面
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ { rewrite ^/(.*)$ $host permanent; }
4、只允许 GET|HEAD|POST 三种类型的方法
#这一项未测试,不知道在wordpress中能否使用
## Only allow these request methods ## if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } ## Do not accept DELETE, SEARCH and other methods ##
通过控制buffer来抵御攻击
#可以在 http 部分设置,来对所有 server 生效 ## Start: Size Limits & Buffer Overflows ## client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; ## END: Size Limits & Buffer Overflows ## ## Start: Timeouts ## client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10; ## End: Timeouts ##
阻止特定的User-Agents
## Block download agents ## if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } ##
禁止其他网站 图片盗链
# Stop deep linking or hot linking location /images/ { valid_referers none blocked www.example.com example.com; if ($invalid_referer) { return 403; } }
对于目录的ip访问控制,可以控制允许哪些ip访问指定目录,例如在wordpress中可以控制哪些人可以访问后台
location /admin/ { ## allow anyone in 27.189.0.0/16 allow 27.189.0.0/16; allow 192.168.0.0/24; ## drop rest of the world deny all; } error_page 403 /error403.html; location = /error403.html { root /usr/share/nginx/html; }
基于密码保护访问目录
mkdir /etc/nginx/conf.d/.htpasswd/ htpasswd -c /etc/nginx/conf.d/.htpasswd/passwd test 然后按提示输入密码
### Password Protect /admin/ and /wp-admin/ directories ### location ~ /(admin/.*|wp-admin/.*) { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/conf.d/.htpasswd/passwd; }
#通过下面命令来增加或修改用户密码
htpasswd -c /etc/nginx/conf.d/.htpasswd/passwd huayu
防止XSS攻击
#避免点击劫持 add_header X-Frame-Options "SAMEORIGIN"; #启用跨站点脚本 (XSS) 过滤器 add_header X-XSS-Protection "1; mode=block"; #在某些浏览器上禁用内容类型嗅探 add_header X-Content-Type-Options "nosniff";
通过防火墙级限制每个IP的连接数
#如果 IP 在 60 秒内对端口 80 进行超过 100 次连接尝试,以下示例将丢弃进入的连接: /sbin/iptables -I INPUT -p tcp --dport 443 -i eth0 -m state --state NEW -m recent --set /sbin/iptables -I INPUT -p tcp --dport 443 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 100 -j DROP service iptables save
配置页面查看当前活动连接
vi /etc/nginx/conf.d/default.conf
#在 server 部分加入
location /nginx_status { stub_status on; access_log off; allow 192.168.0.0/24; allow 106.125.0.0/16; deny all; }
测试
http://your-domain-name-here/nginx_status
Active connections: 7
server accepts handled requests
58 58 128
Reading: 0 Writing: 6 Waiting: 1
7 – Number of all open connections
58 – 接受的连接数量
58 – 处理的连接数量
128 – 处理的请求数量r