:description:Nginx 配置安全非常重要,本文介绍一些常见的通过配置方式,实现nginx安全的措施。 :keywords:Nginx 配置安全,nginx 配置避免攻击

📌 术语定义

使用最新版本的Nginx

优先选择偶数版本(如 1.26.x), 而非功能开发版本(如 1.25.x),最新稳定版本。新版本修复了已知漏洞,并提高了安全性。

合理设置HTTP头部

确保在配置文件中设置 HTTP Header 时,标注 安全cookie,避免被三方脚本注入后获取,同时 header 的 value 部分避免直接插入未经处理的用户输入,使用变量时要特别小心。

add_header Set-Cookie "mycookie=value; HttpOnly; Secure";

使用安全头部增强安全性

通过Nginx配置添加一些安全相关的HTTP头部,增强安全性:

add_header X-Content-Type-Options nosniff;

防止MIME类型混淆攻击:阻止浏览器对响应内容进行MIME类型嗅探:

  • 攻击者尝试通过动态内容将恶意内容(如JavaScript)伪装成合法内容(如图片或文本文件)混淆MIME类型。

  • X-Content-Type-Options头部设置为nosniff,告知浏览器不得根据传输内容推测资源的类型,而应按服务器声明的Content-Type类型处理

  • 这可以防止攻击者上传伪装过MIME类型的图片,来欺骗用户浏览器执行恶意代码。

add_header X-Frame-Options SAMEORIGIN;

防止点击劫持攻击:告知浏览器页面是否允许被嵌入到frame、iframe、embed中。

攻击者将受害者诱导到一个包含恶意嵌入内容的页面中,造成用户在不知情的情况下进行恶意点击。

设置X-Frame-Options头为SAMEORIGIN,意味着该页面只能被同源网站的frame包含,不允许跨域嵌入。这有效防止了点击劫持攻击。

add_header X-XSS-Protection "1; mode=block";

启用浏览器的内置XSS过滤器,浏览器在检测到XSS攻击时阻止页面加载而不是清理脚本内容。提供了额外一层防护。

add_header Content-Security-Policy "default-src 'self'; script-src 'self'";

定义资源加载策略:指定哪些资源可以加载,防止不可信内容被加载。

跨站脚本攻击(XSS):限制资源加载源,有效防止未经授权的脚本代码被执行。 内容注入攻击:防止攻击者注入恶意内容(如恶意iframe、图片、样式等)。

通过CSP,浏览器只允许加载和执行在可信域中的资源,减少攻击面。

设置HTTP严格传输安全(HSTS)

强制客户端通过HTTPS访问,减少中间人攻击的风险:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
注意该配置建议在新网站初期调整小一点,避免证书过期等问题,小一点有利于运维,稳定后逐步调大。

限制请求的传入和大小

通过限制请求体的大小,可以减小某些攻击的潜在影响:

client_max_body_size 1m;

禁用不必要的HTTP方法

只允许必要的HTTP方法,禁用PUT、DELETE等不需要的方法:

location / {
    limit_except GET POST {
        deny all;
    }
}

设置安全的内容类型和编码

保证返回的内容带有正确的MIME类型:

default_type application/octet-stream;

使用模块检测和拦截恶意请求

使用Nginx的第三方模块,如ModSecurity,可以增强Nginx的应用防护能力:

先安装ModSecurity模块,然后启用
load_module modules/ngx_http_modsecurity_module.so;

http {
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
}

配置反向代理安全设置

如果Nginx作为反向代理服务器,确保配置不会转发不信任的头部:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

启用日志和监控

启用详细的日志和监控,及时发现和响应潜在的安全威胁:

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;

启用和配置相关安全模块

使用Nginx内置的安全模块(如 ngx_http_limit_req_module)来限制速率:

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        location /login {
            limit_req zone=one burst=5 nodelay;
        }
    }
}

总结

通过以上配置和安全实践,可以显著提高 Nginx 的安全性,防止常见的 Web 攻击。在实际应用中,结合应用层的安全措施和 Nginx 的配置,可以构建更完善的安全体系。


严格校验和过滤用户输入

在应用程序层面,严格校验和过滤所有用户输入,防止注入攻击。对于 HTTP 头部的生成,要使用可靠的库和方法。