Nginx 安全加固:防止常见攻击的最佳实践


搞网站的兄弟们,Nginx 肯定都不陌生。它快、稳,还能抗,简直是建站神器。但是,光会用还不够,安全这根弦咱得时刻绷紧了。别等到网站被黑了,数据被拖库了,才追悔莫及。

今天,咱就来聊聊 Nginx 的安全加固,用大白话讲讲怎么配置,让你的网站固若金汤。文章里会有代码,有解析,还有实际案例,保证干货满满,让你一看就懂,一学就会。

为啥要给 Nginx “穿盔甲”?

你想啊,Nginx 作为我们网站的门户,所有流量都得从它这儿过。这就意味着,它也是黑客攻击的第一目标。一旦 Nginx 被攻破,后面的应用、数据库就都危险了。给 Nginx 做安全加固,就像是给咱们的网站穿上一层盔甲,能有效抵御大部分常见的网络攻击。

常见攻击手法与防御之道

咱们先来看看黑客们一般都用哪些招数,然后对症下药,逐个击破。

1. 信息泄露:别让“版本号”出卖了你

默认情况下,Nginx 会在响应头里或者出错页面上显示自己的版本号。 这看似不起眼,但黑客可以利用这个信息,去查找特定版本的漏洞,然后精准打击。

防御代码:

在你的 nginx.conf 文件的 http 块中,加入下面这行配置:

http {
    server_tokens off;
}

解析:

server_tokens off; 这行代码的作用就是关闭 Nginx 的版本信息显示。 配置之后,响应头里的 Server 字段就只会显示 nginx,而不会带上具体的版本号了。

案例:

没加固前,你用浏览器的开发者工具看网络请求,可能会看到 Server: nginx/1.20.1 这样的信息。加固后,就只会显示 Server: nginx

2. 蛮力破解和 DDoS 攻击:限流是关键

总有些不怀好意的人,用程序疯狂地请求你的登录接口,想试出密码,这就是“蛮力破解”。或者用海量的请求把你服务器的带宽占满,让正常用户无法访问,这就是“DDoS 攻击”。

防御代码:

我们可以用 Nginx 的 limit_req_zonelimit_req 模块来限制请求速率。

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

    server {
        location /login.html {
            limit_req zone=mylimit burst=5 nodelay;
            # ... 其他配置
        }
    }
}

解析:

  • limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;:这行定义了一个名为 mylimit 的限流区域。$binary_remote_addr 表示以客户端 IP 地址作为限流的依据。10m 是这个区域的大小,rate=10r/s 表示允许每个 IP 地址每秒最多 10 个请求。
  • limit_req zone=mylimit burst=5 nodelay;:这行应用了我们定义的 mylimit 限流规则。burst=5 意思是,允许客户端在超过速率限制的情况下,还能有 5 个请求的“突发”能力,这 5 个请求会被立即处理。nodelay 告诉 Nginx 不要延迟处理这些突发的请求。

案例:

配置了这个规则后,如果同一个 IP 地址在 1 秒内访问 /login.html 超过 15 次(10个正常请求 + 5个突发请求),后续的请求就会被拒绝,通常会返回一个 503 Service Temporarily Unavailable 的错误。

3. 点击劫持:你的网页里被套了个“框”

“点击劫持”是一种视觉欺骗手段。黑客会用一个透明的 <iframe> 把你的网站嵌入到他们自己的恶意网站里,然后诱导用户在这个透明的 <iframe> 上点击,实际上用户点击的是恶意网站上的按钮。

防御代码:

server 块里添加一个响应头:

server {
    add_header X-Frame-Options "SAMEORIGIN";
    # ... 其他配置
}

解析:

X-Frame-Options 是一个 HTTP 响应头,用来告诉浏览器这个页面是否允许在 <frame>, <iframe>, <embed> 或者 <object> 中展示。

  • "SAMEORIGIN":表示页面只能被同源的页面嵌入。
  • "DENY":表示页面不允许被任何页面嵌入。
  • "ALLOW-FROM uri":表示页面可以被指定的 URI 嵌入。

通常情况下,设置为 "SAMEORIGIN" 就能有效防止点击劫持。

4. 跨站脚本攻击 (XSS):防止恶意代码注入

XSS 攻击是指黑客往你的网站里注入恶意的脚本代码,当其他用户访问这个页面时,这些脚本就会在用户的浏览器里执行,从而盗取用户信息等。

防御代码:

添加 X-XSS-Protection 响应头:

server {
    add_header X-XSS-Protection "1; mode=block";
    # ... 其他配置
}

解析:

X-XSS-Protection 是一个主要用于旧版浏览器的特性,用来开启浏览器的 XSS 过滤器。

  • 1; mode=block:表示启用 XSS 过滤。如果检测到 XSS 攻击,浏览器将不会渲染页面,而是直接阻止。

虽然现在很多现代浏览器已经内置了更强大的 XSS 防护机制,并且不再支持这个响应头,但为了兼容老版本浏览器,加上总比不加好。

更现代、更强大的方式是使用 Content-Security-Policy (CSP)。

server {
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-scripts.com;";
    # ... 其他配置
}

解析:

Content-Security-Policy (CSP) 是一个更强大、更灵活的安全策略。 上面的例子表示:

  • default-src 'self': 默认情况下,只允许加载来自同源的资源。
  • script-src 'self' https://trusted-scripts.com;: 只允许加载来自同源和 https://trusted-scripts.com 的脚本。

CSP 的配置比较复杂,需要根据你网站的实际情况来定,但效果也是最好的。

5. 不安全的 SSL/TLS 配置:加强数据加密

现在网站上 HTTPS 已经是标配了。但是,如果你的 SSL/TLS 配置不当,比如用了过时的协议版本或者不安全的加密套件,那么加密传输就形同虚设。

防御代码:

一个比较推荐的 SSL/TLS 配置示例如下:

server {
    listen 443 ssl http2;
    server_name your_domain.com;

    ssl_certificate /path/to/your/fullchain.pem;
    ssl_certificate_key /path/to/your/privkey.pem;

    # 推荐的协议
    ssl_protocols TLSv1.2 TLSv1.3;

    # 推荐的加密套件
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;

    # 开启 HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

解析:

  • ssl_protocols TLSv1.2 TLSv1.3;: 只启用 TLS 1.2 和 TLS 1.3 这两个目前被认为是安全的协议版本。
  • ssl_ciphers ...;: 指定了一组强壮的加密算法套件。
  • ssl_prefer_server_ciphers on;: 告诉客户端,优先使用服务器端指定的加密套件。
  • add_header Strict-Transport-Security ...;: 开启 HTTP Strict Transport Security (HSTS)。这个响应头会告诉浏览器,在接下来的一段时间内(这里是 max-age 指定的秒数),所有对这个网站的访问都必须使用 HTTPS。

总结:安全无小事,持续加固是王道

Nginx 的安全加固是一个持续的过程,而不是一劳永逸的事情。除了上面提到的这些,还有很多其他的安全措施,比如:

  • 及时更新 Nginx 版本:官方会不断修复已知的漏洞,保持更新是基本操作。
  • 最小权限原则:以一个没有特权的普通用户身份运行 Nginx。
  • 禁用不必要的模块:Nginx 是模块化的,只编译和加载你需要的模块,可以减小攻击面。
  • 保护好配置文件和日志文件:设置合理的文件权限,防止未授权的访问和修改。
  • 定期审计配置:定期检查你的 Nginx 配置,看看有没有可以优化或者需要加固的地方。

希望这篇文章能帮你把你的 Nginx 服务器武装得更强。记住,在网络世界里,多一分谨慎,就多一分安全。


  目录