nginx 是最流行的web 服务器之一,以其轻量级、高并发 闻名,通常作为Web服务、反代服务及电子邮件(IMAP/POP3)代理服务。它是也是 淘宝、WordPress.com 等高流量网站的首选 Web 服务器。本文将提供有关 nginx 服务器安全性的建议,供有需要的人参考以便加固其 Web 服务器的安全。

安装 nginx 后,可以在 nginx.conf 文件中看到很多默认的配置。这是 nginx 的主要配置文件,大多数安全优化都将使用此文件完成。默认情况下,您可以在 Windows 系统上的 [nginx 安装目录]/conf 中找到 nginx.conf,在 Linux 系统上,您可以在 /etc/nginx /usr/local/etc/nginx 中找到 nginx.conf 。通常还需要在虚拟主机配置文件进行一些更改。

1. 禁用任何不需要的 nginx 模块

安装 nginx 时,它会自动包含许多模块。目前,您无法在运行时选择模块。要禁用某些模块,您需要重新编译 nginx。我们建议您禁用任何不需要的模块,因为这将通过限制允许的操作来最大程度地降低潜在攻击的风险。 

为此,请在安装期间使用配置选项。在下面的示例中,我们禁用了自动生成目录列表的autoindex模块,然后重新编译 nginx。

./configure --without-http_autoindex_module
make
make install

2.隐藏版本号

认情况下,nginx 中的 server_tokens 指令显示 nginx 版本号。它在所有自动生成的错误页面中直接可见,但也出现在服务器标头中的所有 HTTP 响应中。

这就会导致 nginx 版本的信息的泄露,应该通过禁用 nginx 配置文件中的 server_tokens off指令。

http { 
    server_tokens off;
}

 3.控制缓冲大小,防止溢出攻击

为了防止对 nginx 的潜在 DoS 攻击,可以为所有客户端设置缓冲区大小限制。也可以使用以下命令在 nginx 配置文件中执行此操作:

  • client_body_buffer_size – 使用此指令指定客户端请求正文缓冲区大小。默认值为 8k 或 16k,但建议将其设置为低至 1k: client_body_buffer_size 1k
  • client_header_buffer_size – 使用此指令指定客户端请求标头的标头缓冲区大小。1k 的缓冲区大小足以满足大多数请求。
  • client_max_body_size – 使用此指令指定客户端请求的最大可接受正文大小。1k 指令应该足够了,但如果您通过 POST 方法接收文件上传,则需要增加它。
  • large_client_header_buffers – 使用此指令指定用于读取大型客户端请求标头的缓冲区的最大数量和大小。指令将large_client_header_buffers 2 1k缓冲区的最大数量设置为 2,每个最大大小为 1k。该指令将接受 2 kB 数据 URI。
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

4. 禁用任何不需要的 HTTP 请求

建议禁用任何不会使用且不需要在 Web 服务器上实现的 HTTP 方法。如果在 nginx 虚拟主机配置文件的 location 块中添加以下条件,服务器将只允许 GET、HEAD 和 POST 方法,并会过滤掉 DELETE 和 TRACE 等方法。

只允许 GET HEAD POST 请求,其他请求都拒绝。

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

另一种方法是将以下配置添加 Server 块中。其表示 nginx 收到不属于 GET HEAD POST 的请求后,不给任何答复,也不处理。(推荐使用)

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444; 
}

5.监控 nginx 访问日志和错误日​​志

监控访问日志,可以了解到服务器遇到了什么类型的访问、受到了那些攻击尝试、并注意任何遇到的错误。这将帮助我们采取哪些措施来优化服务及加固服务器安全,这里我们推荐 《Nginx 日志分析工具 GoAccess》

6.配置 Nginx 安全标头

为了进一步强化您的 nginx Web 服务器,您可以添加几个不同的 HTTP 标头。以下是我们推荐的一些选项。

X-Frame-Options

使用 X-Frame-Options HTTP 响应标头来指示是否应允许浏览器在<frame><iframe>中呈现页面。这可以防止劫持攻击。我强烈建议 nginx 服务器启用此选项。 

配置方式很简单,请将以下参数添加到添加到虚拟机配置文件中:

add_header X-Frame-Options "SAMEORIGIN";

严格的运输安全

HTTP 严格传输安全 (HSTS)是网站用来声明只能使用安全连接 (HTTPS) 访问它们的方法。如果网站声明了 HSTS 策略,浏览器必须拒绝所有 HTTP 连接并防止用户接受不安全的 SSL 证书。要将 HSTS 标头添加到您的 nginx 服务器,可以将以下指令添加到网站配置文件的的 Server 部分:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

CSP 和 X-XSS 保护

内容安全策略 (CSP) 可保护您的 Web 服务器免受某些类型的攻击,包括跨站点脚本攻击(XSS) 和数据注入攻击。您可以通过添加以下示例Content-Security-Policy标头来实现 CSP ,了解 CSP 可以参考我们自己发布的内容 《Nginx 配置内容安全策略CSP》,CSP 使网页资源加载比较严谨,正式环境请谨慎操作。

add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;

IE 和 Safari 支持HTTP X-XSS-Protection标头,如果您有强大的内容安全策略,则现代浏览器不需要此标头。但是,为了帮助在旧浏览器(尚不支持 CSP)的情况下防止 XSS,您可以将 X-XSS 保护标头添加到您的服务器部分:

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

7.配置 SSL 和 加密套件

nginx 的默认配置允许你使用不安全的旧版本的 TLS 协议 ssl_protocols TLSv1 TLSv1.1 TLSv1.2)。这可能会导致诸如BEAST 攻击之类的攻击。因此们建议您不要使用旧的 TLS 协议并更改您的配置以仅支持更新的、安全的 TLS 版本。

为此,请在 nginx 配置文件的server部分添加以下指令:

ssl_protocols TLSv1.2 TLSv1.3;

我们还建议您将以下指令添加到服务器部分:

ssl_prefer_server_ciphers on;

该指令将使服务器端而不是客户端决定使用哪些密码。

8.定期更新 Nginx 服务器

为了确保 Nginx 服务器的安全性,必须保持的 Web 服务器版本为最新。及时更新服务器应用的版本将解决预先存在的漏洞的补丁。如果忽略它们它们可能会被利用来攻击的服务器,如我们所见大多的漏洞、攻击都是因为未及时更新造成的。

除此之外,每次更新都会定期添加一些性能增强、安全修复和新功能。

结论

服务器保留在默认配置中绝对不是一种安全的做法,为了不让自己的服务器暴露在遭遇风险可能性下,采取上述安全措施来强化 Nginx Web 服务器绝地是有必要的。

如果你对 Nginx 服务器安全有任何想法或有相关问题,欢迎评论指出。