Nginx Web服务器的安全,保护和提高性能的终极指南

在本指南中,我们将涵盖12个提示,以增加安全性和提高您的Nginx服务器的性能(从保持Nginx到最新

Nginx安全加固提示

Nginx安全加固提示

根据你听说过Nginx的美好的事物,也许你决定试一试。 你可能已经喜欢它,所以考虑在通过一些关于我们在这个网站上发布的主题的文章后,用Nginx替换Apache安装。

如果是这样,我敢肯定,因为我们要覆盖12提示,以增加你的Nginx服务器的安全性 (从Nginx的保持了一路日期为使用TLS和HTTP重定向到你会欢迎这个指南张开双臂HTTPS),你会注意到,其中一些非常类似于你将使用Apache。

不要错过

13 Apache Web服务器安全和强化提示

25 Apache Htaccess技巧来保护Apache Web服务器

Nginx测试环境

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

  1. Debian GNU / Linux 8.1(jessie)。
  2. IP地址:192.168.0.25(howtoinglovesnginx.com)192.168.0.26(nginxmeanspower.com),如在基于IP的虚拟主机部分中描述在
    1. 如何设置基于名称的和基于IP的虚拟主机(服务器模块)与Nginx的
  3. Nginx版本:nginx / 1.6.2。
  4. 为方便起见,这里是最后的配置文件( 引擎收录链接 )。

记住这一点,让我们开始吧。

提示#1:保持Nginx最新

在写这篇文章的时候,最新的Nginx的版本CentOS的(在EPEL)和Debian仓库分别是1.6.31.6.2-5。

不要错过: 从库和源中安装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指令,设定好像在关闭服务器块内:

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

重新启动nginx并验证更改:

隐藏Nginx版本信息

隐藏Nginx版本信息

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

HTTP用户代理是用于与web服务器进行内容协商的软件。 这还包括可能最终通过浪费系统资源影响Web服务器性能的恶意软件bot和爬网程序。

为了更轻松地维护用户不需要的代理列表,创建一个文件( /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中的用户代理

禁用Nginx中的用户代理

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

# wget http://192.168.0.25/index.html
# wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 
阻止Nginx中的用户代理

阻止Nginx中的用户代理

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

也称为动词,HTTP方法指示对由Nginx提供的资源执行的期望操作。 对于一般的网站和应用程序,你应该只允许GET,POST,HEAD并禁用所有其他人。

为此,将以下行放在服务器块中。 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 
在Nginx中禁用不需要的HTTP请求

在Nginx中禁用不需要的HTTP请求

提示#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;
在Nginx中设置缓冲区大小

在Nginx中设置缓冲区大小

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

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

但是,请记住,并非所有连接都被计数,而是只有那些由服务器处理的请求及其整个请求头已读取。

例如,我们的最大连接数设置为1 (是的,这是夸张,但它会做的工作只是在这种情况下罚款)在名为区域地址(你可以将此设置为你希望的任何名称):

limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;
限制Nginx中的HTTP请求数

限制Nginx中的HTTP请求数

一个简单的测试与Apache的基准(Nginx的执行负载) ,其中10总连接与制作2并发请求将帮助我们证明我们的观点:

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

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

提示#8:设置Nginx的监视日志

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

Nginx错误日志

Nginx错误日志

您可能需要使用grep来过滤在TIP#7所定义的加上 R区提出请求失败的日志:

# grep addr /var/www/logs/howtoinglovesnginx.error.log --color=auto
Nginx日志监控

Nginx日志监控

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

  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的意思是</ title>
</ head>
<body>
<h1> Nginx意味着电源!</ h1>
<img src =“https://www.howtoing.com/wp-content/uploadshttp://192.168.0.25/img/nginx.png”/>
</ body>
</ html>
<!DOCTYPE html>
<html>
<head>
<meta charset =“utf-8”>
<title> Howtoing喜欢Nginx </ title>
</ head>
<body>
<h1> Howtoing喜欢Nginx!</ h1>
<img src =“img / nginx.png”/>
</ body>
</ html>

现在,浏览各个网站,正如你所看到的,图像正确显示在192.168.0.25而是由192.168.0.26 403响应代替:

禁用Nginx图像热链接

禁用Nginx图像热链接

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

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

只要有可能,尽一切可能避免SSL在任何版本和使用TLS来代替。 以下ssl_protocols应放置在服务器或HTTP上下文在虚拟主机文件或通过include指令一个单独的文件(有些人使用一个名为ssl.conf ,但它是完全由你):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

例如:

在Nginx中禁用SSL和启用TLS

在Nginx中禁用SSL和启用TLS

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

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

# openssl genrsa -aes256 -out howtoinglovesnginx.key 1024
# openssl req -new -key howtoinglovesnginx.key -out howtoinglovesnginx.csr
# cp howtoinglovesnginx.key howtoinglovesnginx.key.org
# openssl rsa -in howtoinglovesnginx.key.org -out howtoinglovesnginx.key
# openssl x509 -req -days 365 -in howtoinglovesnginx.csr -signkey howtoinglovesnginx.key -out howtoinglovesnginx.crt

然后添加一个单独的服务器块内以下行,准备下一个技巧( http --> https重定向),移动SSL相关的指令,以新的块,以及:

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

在下一个提示中,我们将验证我们的网站如何使用自签名证书和TLS。

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

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

return 301 https://$server_name$request_uri;
在Nginx中将HTTP重定向到HTTPS

在Nginx中将HTTP重定向到HTTPS

上述指令将返回301(永久移动)响应,这是用于永久URL重定向每当一个请求发送到您的虚拟主机的端口80发,并将请求重定向到我们在前面的技巧添加的服务器模块。

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

验证TLS Nginx加密

验证TLS Nginx加密

概要

在这篇文章中,我们分享了一些技巧来保护您的Nginx Web服务器。 我们很乐意听到您的想法,如果您有其他提示,您想与社区的其他人分享,请随时通过发送一个注释使用下面的评论表格让我们知道。