网站搜索

保护、强化和提高 Nginx Web 服务器性能的终极指南


基于您听说过的有关 Nginx 的精彩内容,也许您决定尝试一下。您可能非常喜欢它,以至于在阅读了我们在此站点上发布的有关该主题的一些文章后,正在考虑用 Nginx 替换您的 Apache 安装。

如果是这样,我相信您会张开双臂欢迎本指南,因为我们将介绍提高 Nginx 服务器安全性的 12 条技巧(从保持 Nginx 一直更新到使用 TLS 并将 HTTP 重定向到 HTTPS),您会注意到其中一些与您使用 Apache 所做的非常相似。

不要错过

13 个 Apache Web 服务器安全和强化技巧

保护 Apache Web 服务器安全的 25 个 Apache Htaccess 技巧

Nginx测试环境

我们将在本指南中使用以下环境:

  1. Debian GNU/Linux 8.1(杰西)。
  2. IP 地址:192.168.0.25 (howtoinglovesnginx.com) 和 192.168.0.26 (nginxmeanspower.com),如基于 IP 的虚拟中所述主机部分位于

    1. “如何使用 Nginx 设置基于名称和基于 IP 的虚拟主机(服务器块)“
  3. Nginx 版本:nginx/1.6.2。
  4. 为了您的方便,这里是最终的配置文件(Pastebin 链接)。

考虑到这一点,让我们开始吧。

提示 #1:使 Nginx 保持最新状态

在撰写本文时,CentOS(EPEL)和 Debian 存储库中的最新 Nginx 版本为 1.6.31.6.2-5分别是.strong>。

不要错过:从存储库和源安装 Nginx 的最新稳定版本

虽然从存储库安装软件比从源代码编译程序更容易,但最后一个选项有两个优点:1)它允许您在 Nginx 中构建额外的模块(例如 mod_security),2)它将始终提供更新的版本比存储库(截至今天的 1.9.9)。发行说明始终可以在 Nginx 网站上找到。

不要错过

使用 Mod_Security 和 Mod_Evasive 保护 Apache 免受暴力破解和 DDoS 攻击

提示 #2:删除 Nginx 中不必要的模块

要在从源安装时显式从 Nginx 中删除模块,请执行以下操作:

./configure --without-module1 --without-module2 --without-module3

例如:

./configure  --without-http_dav_module --withouthttp_spdy_module 

您可能会猜到,从源代码中删除以前的 Nginx 安装中的模块需要再次执行编译。

注意一点:配置指令由模块提供。确保您没有禁用包含您将来需要的指令的模块!在决定禁用模块之前,您应该检查 nginx 文档以获取每个模块中可用的指令列表。

提示 #3:在 Nginx 中禁用 server_tokens 指令

server_tokens 指令告诉 Nginx 在错误页面上显示其当前版本。这是不可取的,因为您不想与全世界共享该信息,以防止该特定版本中的已知漏洞对您的 Web 服务器造成攻击。

要禁用 server_tokens 指令,请在服务器块内将 if 设置为 off:

server {
    listen       192.168.0.25:80;
    server_tokens        off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    access_log  /var/www/logs/tecmintlovesnginx.access.log;
    error_log  /var/www/logs/tecmintlovesnginx.error.log error;
        root   /var/www/tecmintlovesnginx.com/public_html;
        index  index.html index.htm;
}

重新启动 nginx 并验证更改:

提示 #4:在 Nginx 中拒绝 HTTP 用户代理

HTTP 用户代理是一种用于针对 Web 服务器进行内容协商的软件。这还包括恶意软件机器人和爬虫程序,它们最终可能会浪费系统资源,从而影响您的网络服务器的性能。

为了更轻松地维护不需要的用户代理列表,请创建一个包含以下内容的文件(例如 /etc/nginx/blockuseragents.rules):

map $http_user_agent $blockedagent {
        default         0;
        ~*malicious     1;
        ~*bot           1;
        ~*backdoor      1;
        ~*crawler       1;
        ~*bandit        1;
}

接下来,将以下行放在服务器块定义之前:

include /etc/nginx/blockuseragents.rules;

如果用户代理字符串位于上面定义的黑名单中,则返回 403 响应的 if 语句:

重新启动 nginx,所有与上述字符串匹配的用户代理将被阻止访问您的 Web 服务器。将 192.168.0.25 替换为服务器的 IP,并随意为 wget--user-agent 开关选择不同的字符串:

wget http://192.168.0.25/index.html
wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 

提示 #5:禁用 Nginx 中不需要的 HTTP 方法

HTTP 方法也称为动词,指示对 Nginx 提供的资源执行的所需操作。对于常见的网站和应用程序,您应该只允许 GETPOSTHEAD,并禁用所有其他网站和应用程序。

为此,请将以下行放置在服务器块内。 444 HTTP 响应意味着空响应,通常在 Nginx 中用于欺骗恶意软件攻击:

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

要进行测试,请使用 curl 发送 DELETE 请求,并将输出与发送常规 GET 时的输出进行比较:

curl -X DELETE http://192.168.0.25/index.html
curl -X POST http://192.168.0.25/index.html 

提示 #6:在 Nginx 中设置缓冲区大小限制

要防止针对 Nginx Web 服务器的缓冲区溢出攻击,请在单独的文件中设置以下指令(例如,创建一个名为 /etc/nginx/conf.d/buffer.conf 的新文件):

client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

上述指令将确保向您的 Web 服务器发出的请求不会导致系统中的缓冲区溢出。再次,请参阅文档以获取有关它们每个功能的更多详细信息。

然后在配置文件中添加 include 指令:

include /etc/nginx/conf.d/*.conf;

TIP #7:在 Nginx 中通过 IP 限制连接数

为了通过 IP 限制连接,请使用 limit_conn_zone (在 http 上下文中或至少在服务器块之外)和 limit_conn (在 http、服务器块或位置上下文中)指令。

但是,请记住,并非所有连接都会被计算在内,而只会计算那些有服务器处理请求且其整个请求标头已被读取的连接。

例如,让我们将名为 addr 的区域中的最大连接数设置为 1 (是的,这是夸张的,但在本例中它可以很好地完成工作)(您可以将其设置为任何值)你想要的名字):

limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;

使用 Apache Benchmark(执行 Nginx 负载)进行简单测试,其中使用 2 个并发请求建立了 10 总连接,这将帮助我们证明我们的观点:

ab -n 10 -c 2 http://192.168.0.25/index.html

有关更多详细信息,请参阅下一个提示。

提示 #8:设置 Nginx 监控日志

执行上一技巧中描述的测试后,请检查为服务器块定义的错误日志:

您可能需要使用 grep 来过滤对 TIP #7 中定义的 addr 区域发出的失败请求的日志:

grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto

同样,您可以过滤访问日志以获取感兴趣的信息,例如:

  1. 客户端IP
  2. 浏览器类型
  3. HTTP 请求类型
  4. 请求资源
  5. 服务器块应答请求(如果多个虚拟主机记录到同一文件,则很有用)。

如果您发现任何异常或不需要的活动,请采取适当的措施。

提示 #9:防止 Nginx 中的图像热链接

当某人在另一个网站上显示您托管的图像时,就会发生图像热链接。这会导致您的带宽使用量增加(您需要为此付费),而其他人则高兴地显示图像,就好像这是他或她的财产一样。换句话说,这对你来说是双重损失。

例如,假设您的服务器块中有一个名为 img 的子目录,其中存储该虚拟主机中使用的所有图像。为了防止其他站点使用您的映像,您需要在虚拟主机定义中插入以下位置块:

location /img/ {
  valid_referers none blocked 192.168.0.25;
   if ($invalid_referer) {
     return   403;
   }
}

然后修改每个虚拟主机中的index.html文件如下:

192.168.0.26 192.168.0.25
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Tecmint loves Nginx</title>
</head>
<body>
<h1>Tecmint loves Nginx!</h1>
<img src=”img/nginx.png” />
</body>
</html>

现在浏览到每个站点,如您所见,图像在 192.168.0.25 中正确显示,但在 192.168.0.26 中被 403 响应替换强>:

请注意,此提示取决于发送 Referer 字段的远程浏览器。

提示 #10:在 Nginx 中禁用 SSL 并仅启用 TLS

只要有可能,尽一切努力避免在其任何版本中使用 SSL 并改用 TLS。以下 ssl_protocols 应放置在虚拟主机文件中的服务器或 http 上下文中,或者通过 include 指令作为单独的文件(有些人使用名为 ssl.conf 的文件) ,但这完全取决于你):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

例如:

提示 #11:在 Nginx 中创建证书

首先,生成密钥和证书。如果您愿意,可以随意使用不同类型的加密:

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

然后在单独的服务器块中添加以下行,为下一个技巧(http --> https 重定向)做准备,并将与 SSL 相关的指令也移动到新块:

server {
    listen 192.168.0.25:443 ssl;
    server_tokens off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    root   /var/www/tecmintlovesnginx.com/public_html;
    ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
    ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
}

在下一篇技巧中,我们将验证我们的网站现在如何使用自签名证书和 TLS。

提示 #12:在 Nginx 中将 HTTP 流量重定向到 HTTPS

将以下行添加到第一个服务器块:

return 301 https://$server_name$request_uri;

上述指令将返回 301(永久移动)响应,每当向虚拟主机的端口 80 发出请求时,该响应将用于永久 URL 重定向,并将请求重定向到我们的服务器块。在之前的提示中添加了。

下图显示了重定向并确认了我们使用 TLS 1.2AES-256 进行加密的事实:

概括

在本文中,我们分享了一些保护 Nginx Web 服务器安全的技巧。我们很想听听您的想法,如果您有其他提示想与社区其他人分享,请随时使用下面的评论表向我们发送注释,让我们知道。