提高 nginx 服务器 安全性,稳定性、性能 --经验总结-持续更新

在日常工作中使用nginx遇到的问题总结:

  • 保持Nginx的及时升级

    因为通过查看官方的release note会发现修复了很多bug,不及时更新在生产环境会有更大的风险

  • 去掉不用的Nginx模块
    #在编译安装时,执行./configure方法时加上以下配置指令,可以显式的删除不用的模块
    #配置指令是由模块提供的。确保禁用的模块不包含需要使用的指令!在决定禁用模块之前,需要检查Nginx文档中每个模块可用的指令列表
    
    ./configure --without-http_dav_module --withouthttp_spdy_module
  • 在Nginx配置中禁用server_tokens

    server_tokens在打开的情况下会使404页面显示Nginx的当前版本号
    不法者会利用此信息尝试相应Nginx版本的漏洞,需要在nginx.conf中http模块设置server_tokens off,然后重启nginx

    server {
        listen 192.168.10.10;
        Server_tokens off;
        .....省略
    }
  • 禁止非法的HTTP User Agents
    if ($http_user_agent ~* (curl) ) {
        return 404;
    }

    user agent:用户代理是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好,通知服务器当前使用的是什么浏览器、工具等等,例如火狐、谷歌chrome、wget、curll;因为是HTTP协议中对浏览器的一种标识,所以禁止非法的User Agent可以阻止爬虫和扫描器的一些请求,防止这些请求大量消耗Nginx服务器资源

    #编辑nginx配置文件,以下内容放在http配置段,那么整个nginx都生效,如果放到server里,只对一个有效
    #禁止一个
    if ($http_user_agent ~* (curl) ) {
        return 404;
    }
    #禁止多个URL
    if ($http_user_agent ~* (curl) )     return 404;
    }
    
    #禁止非法的User Agent,将如下语句放入配置文件的server模块内:
    map $http_user_agent $blockedagent {
        default 0;
        ~*malicious 1;
        ~*bot 1;
        ~*backdoor 1;
        ~*crawler 1;
        ~*bandit 1;
    }
    include /etc/nginx/blockuseragents.rules;
    #并加入if语句设置阻止后进入的页面:
    server {
        if($blockuseragents){
           return 403;
        }
        .....省略
    }
  • 禁掉不需要的 HTTP 方法

    在web站点和应用中,有的方法只支持GET、POST和HEAD,在配置文件中的server模块中就可以加入如下方法可以阻止一些欺骗攻击

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 444;
    }
  • 设置缓冲区容量上限(可以阻止缓冲区溢出攻击(同样是Server模块))
    #设置后,不管多少HTTP请求都不会使服务器系统的缓冲区溢出了
    client_body_buffer_size 1k;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;
  • 限制最大连接数
    #在http模块内,server模块外设置limit_conn_zone,可以设置连接的IP 
    #在http,server或location模块设置limit_conn,可以设置IP的最大连接数
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 1;
  • 设置日志监控(access_log、error_log)
  • 阻止图片外链自你的服务器

    有一个img目录用来存储图片,IP是192.168.10.10,加入如下配置可以防止外链.来减轻服务器的带宽压力

    location /img/ {
        valid_referers none blocked 192.168.10.10;
            if ($invalid_referer) {
                return 403;
          }
    }
  • 禁止 SSL 并且只打开 TLS(在Server模块 添加:ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  • 做证书加密(HTTPS)(生成密钥和整数)
    # openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
    # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
    # cp tecmintlovesnginx.key tecmintlovesnginx.key.org
    # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
    # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt
    #配置Server模块
    server {
          ....省略
          ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
          ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
          ....省略
    }
  • 重定向HTTP请求到HTTPS
    #在server中添加
    return 301 https://$server_name$request_uri;
原文地址:https://www.cnblogs.com/qinxu/p/14200949.html