参考: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