Nginx安全加固提示
根据你听说过Nginx的美好的事物,也许你决定试一试。 你可能已经喜欢它,所以考虑在通过一些关于我们在这个网站上发布的主题的文章后,用Nginx替换Apache安装。
如果是这样,我敢肯定,因为我们要覆盖12提示,以增加你的Nginx服务器的安全性 (从Nginx的保持了一路日期为使用TLS和HTTP重定向到你会欢迎这个指南张开双臂HTTPS),你会注意到,其中一些非常类似于你将使用Apache。
不要错过 :
25 Apache Htaccess技巧来保护Apache Web服务器
Nginx测试环境
我们将在本指南中使用以下环境:
- Debian GNU / Linux 8.1(jessie)。
- IP地址:192.168.0.25(youcllovesnginx.com)和192.168.0.26(nginxmeanspower.com),如在基于IP的虚拟主机部分中描述在
- Nginx版本:nginx / 1.6.2。
- 为方便起见,这里是最后的配置文件( 引擎收录链接 )。
记住这一点,让我们开始吧。
提示#1:保持Nginx最新
在写这篇文章的时候,最新的Nginx的版本CentOS的(在EPEL)和Debian仓库分别是1.6.3和1.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 youcllovesnginx.com www.youcllovesnginx.com; access_log /var/www/logs/youcllovesnginx.access.log; error_log /var/www/logs/youcllovesnginx.error.log error; root /var/www/youcllovesnginx.com/public_html; index index.html index.htm; }
重新启动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,并且所有与上述字符串匹配的用户代理将被阻止访问您的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中的用户代理
提示#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请求
提示#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中设置缓冲区大小
提示#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请求数
一个简单的测试与Apache的基准(Nginx的执行负载) ,其中10
总连接与制作2
并发请求将帮助我们证明我们的观点:
# ab -n 10 -c 2 http://192.168.0.25/index.html
有关详细信息,请参阅下一个提示。
提示#8:设置Nginx的监视日志
执行上一提示中所述的测试后,请检查为服务器块定义的错误日志:
Nginx错误日志
您可能需要使用grep来过滤在TIP#7所定义的加上 R区提出请求失败的日志:
# grep addr /var/www/logs/youcllovesnginx.error.log --color=auto
Nginx日志监控
同样,您可以过滤访问日志以获取感兴趣的信息,例如:
- 客户端IP
- 浏览器类型
- HTTP请求类型
- 请求资源
- 服务器块回答请求(如果多个虚拟主机正在记录到同一个文件,则很有用)。
如果您检测到任何异常或不需要的活动,请采取适当的措施。
提示#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.youcl.com/uploadshttp://192.168.0.25/img/nginx.png”/> </ body> </ html> |
<!DOCTYPE html> <html> <head> <meta charset =“utf-8”> <title> youcl喜欢Nginx </ title> </ head> <body> <h1> youcl喜欢Nginx!</ h1> <img src =“img / nginx.png”/> </ body> </ html> |
现在,浏览各个网站,正如你所看到的,图像正确显示在192.168.0.25而是由192.168.0.26 403响应代替:
禁用Nginx图像热链接
请注意,此提示取决于远程浏览器发送Referer字段。
提示#10:禁用SSL,并仅在Nginx中启用TLS
只要有可能,尽一切可能避免SSL在任何版本和使用TLS来代替。 以下ssl_protocols
应放置在服务器或HTTP上下文在虚拟主机文件或通过include指令一个单独的文件(有些人使用一个名为ssl.conf
,但它是完全由你):
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
例如:
在Nginx中禁用SSL和启用TLS
提示#11:在Nginx中创建证书
首先,生成密钥和证书。 如果你想要,可以随意使用不同类型的加密:
# openssl genrsa -aes256 -out youcllovesnginx.key 1024 # openssl req -new -key youcllovesnginx.key -out youcllovesnginx.csr # cp youcllovesnginx.key youcllovesnginx.key.org # openssl rsa -in youcllovesnginx.key.org -out youcllovesnginx.key # openssl x509 -req -days 365 -in youcllovesnginx.csr -signkey youcllovesnginx.key -out youcllovesnginx.crt
然后添加一个单独的服务器块内以下行,准备下一个技巧( http --> https
重定向),移动SSL相关的指令,以新的块,以及:
server { listen 192.168.0.25:443 ssl; server_tokens off; server_name youcllovesnginx.com www.youcllovesnginx.com; root /var/www/youcllovesnginx.com/public_html; ssl_certificate /etc/nginx/sites-enabled/certs/youcllovesnginx.crt; ssl_certificate_key /etc/nginx/sites-enabled/certs/youcllovesnginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
在下一个提示中,我们将验证我们的网站如何使用自签名证书和TLS。
提示#12:在Nginx中将HTTP流量重定向到HTTPS
将以下行添加到第一个服务器块:
return 301 https://$server_name$request_uri;
在Nginx中将HTTP重定向到HTTPS
上述指令将返回301(永久移动)响应,这是用于永久URL重定向每当一个请求发送到您的虚拟主机的端口80发,并将请求重定向到我们在前面的技巧添加的服务器模块。
下图显示了重定向并确认我们正在使用TLS 1.2和AES-256加密的事实:
验证TLS Nginx加密
概要
在这篇文章中,我们分享了一些技巧来保护您的Nginx Web服务器。 我们很乐意听到您的想法,如果您有其他提示,您想与社区的其他人分享,请随时通过发送一个注释使用下面的评论表格让我们知道。