Nginx网络服务器安全和加固指南
Nginx安全最佳实践。
Nginx是业内增长最快的网络服务器,目前在市场份额中排名第二。
它最初于2004年发布,并且自那时以来赢得了极佳的声誉,并在百万最繁忙的站点中使用。
这是有原因的-Nginx速度非常快。
在本文中,我将谈论一些保护Nginx for a production environment的基本指南。所以让我们开始吧。
SSL/TLS
实施SSL证书
Web安全的第一步是实施SSL,以便您可以使用https访问Web应用程序,并在通信中增加一层加密。
- 使用OpenSSL生成具有2048位和sha-2的CSR
openssl req -nodes -new -sha256 -newkey rsa:2048 -keyout bestflare.key -out bestflare.csr
- 上述命令将在当前工作目录生成CSR和密钥文件。不要忘记更改.csr和.key文件名。
通过证书颁发机构签署CSR,一旦获得签名证书,您可以在Nginx中实施它们,如下所示。
- 登录到Nginx服务器
- 进入具有ssl.conf文件的conf文件夹。
注意:在Linux中的默认安装中,您将在/etc/nginx/conf.d下找到此文件。
- 编辑文件并添加以下内容,这将使Nginx监听443端口
server {
listen 443 ssl;
server_name bestflare.com;
ssl on;
ssl_certificate /opt/cert/bestflare.pem;
ssl_certificate_key /opt/cert/bestflare.key;
}
注意:不要忘记更改证书和密钥文件路径。
- 保存配置并重新启动Nginx。SSL证书已成功实施。
SSL/TLS优化
拥有SSL并不意味着它是完全安全的,作为Web安全专家,您需要应用配置来保护Web服务器。
首先,我建议运行一个SSL scan来针对网站进行评分和查找关键漏洞。
因此,当前的SSL Labs评分为“C”,目标是将其提升为“A”。
禁用弱SSL/TLS协议
SSL 3、TLS 1.0和TLS 1.1是有漏洞的,我们只允许强大的TLS 1.2协议。
- 编辑ssl.conf文件并在服务器块中添加以下内容
ssl_protocols TLSv1.2;
- 保存ssl.conf文件并重新启动Nginx
禁用弱密码套件
弱密码套件可能会导致漏洞,例如heartbleed,因此我们需要仅允许强密码。
- 在ssl.conf文件的服务器块中添加以下内容
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
- 保存文件并重新启动Nginx
安装链证书
没有链证书也会影响整体评分,这可能会在现代浏览器(如Chrome)中浏览时显示错误。您需要从权威机构获取链证书。您通常可以在其网站上找到或使用谷歌搜索。
- 将链证书内容添加到网站证书中,如以下所示。在我的示例中,它将是/opt/cert/bestflare.pem
- 保存文件并重新启动Nginx
为TLS安全使用Diffie-Hellman
Diffie-Hellman比之前认为的不安全。最近在一项最佳实践中添加的一项是保护Diffie-hellman。生成唯一的DH GROUP并在ssl.conf文件中添加ssl_dhparam可以实现这一点。
- 使用OpenSSL生成唯一的DH Group
openssl dhparam -out dhparams.pem 4096
- 这将需要几分钟的时间,并在当前工作目录中生成一个名为dhparams.pem的文件
- 将dhparams.pem复制到cert文件夹
- 修改ssl.conf文件并在服务器块中添加以下内容
ssl_dhparam /opt/cert/dhparams.pem;
- 保存文件并重新启动Nginx
这应该足够进行SSL/TLS优化,让我们再次测试URL以查看评级。
哇喔!现在你可以看到它的评级是“A”。干得好!
以下是完整的ssl.conf文件
# HTTPS服务器配置
server {
listen 443 ssl;
server_name bestflare.com;
ssl on;
ssl_certificate /opt/cert/bestflare.pem;
ssl_certificate_key /opt/cert/bestflare.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_dhparam /opt/cert/dhparams.pem;
}
信息泄露
在默认的Nginx安装中,会有很多敏感信息被泄露,这可以帮助黑客为攻击做准备。
如果您正在处理PCI合规环境,则认为这是信息泄露漏洞,必须修复此项。
您必须使用server_tokens off来禁用信息泄露。我在之前的文章中已经解释过了。Remove Version from Server Header Banner in Nginx
Web应用程序安全
默认的Nginx配置并不完美,可能存在许多漏洞,因此我们加固它们以使其更安全。
禁用不需要的HTTP方法
大多数情况下,您的Web应用程序只需要GET、HEAD和POST HTTP请求。允许TRACE或DELETE是危险的,因为它可能允许跨站点追踪攻击,并潜在地允许黑客窃取Cookie信息。
- 修改nginx.conf文件并在服务器块中添加以下内容
if ($request_method !~ ^(GET|HEAD|POST)$ )
{
return 405;
}
保存文件并重新启动Nginx。现在,如果有人尝试使用TRACE、DELETE、PUT、OPTIONS,将显示405 Not Allowed。
Chandans-iMac:~ chandan$ telnet bestflare.com 80
Trying 128.199.100.162...
Connected to bestflare.com.
Escape character is '^]'.
TRACE / HTTP/1.1
Host: testing
HTTP/1.1 405 Not Allowed
Server: nginx
Date: Sat, 11 Jul 2015 06:04:34 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
点击劫持攻击
您可以在HTTP头中注入X-FRAME-OPTIONS来防止点击劫持攻击。
通过在nginx.conf文件中添加以下内容来实现
add_header X-Frame-Options "SAMEORIGIN";
上述头部将指示浏览器仅从同一来源加载资源。
X-XSS保护
注入带有X-XSS保护的HTTP头,以减轻跨站点脚本攻击。
- 修改nginx.conf文件以添加以下内容
add_header X-XSS-Protection "1; mode=block";
- 保存配置文件并重新启动Nginx。您可以在实施后使用Headers Test工具进行验证。
您可能还有兴趣实施OWASP推荐的安全头部,这些头部在here中有解释。
实施Mod Security WAF
通过实施Web应用程序防火墙ModSecurity和OWASP Core Rule Set.,增加额外的安全层。
另外,如果您考虑在Nginx服务器前使用基于云的安全性,可以使用SUCURI。
保持Nginx更新
最后,您需要保持Nginx的更新,因为有许多性能增强、安全修复和新功能正在添加。
希望这些对您保持Nginx安全有所帮助。
接下来,您可能对学习build Nginx for high-performance from scratch感兴趣。