本文概述
Nginx安全最佳实践。
Nginx是业界增长最快的Web服务器, 目前, 它在市场份额中排名第三。
它最初于2004年发布, 此后赢得了良好的声誉, 并在数百万个最繁忙的站点中使用。
这是有原因的-Nginx快速发展。
在本文中, 我将讨论保护Nginx Web服务器安全的一些基本指南。因此, 让我们开始吧。
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并不意味着它是完全安全的, 而作为网络安全专家, 你需要应用配置来保护网络服务器的安全。
首先, 我建议对网站进行SSL扫描, 以找到分数和基本漏洞。
因此, 当前的SSL Labs评级为” C”, 目标是使其达到” A”。
禁用SSL 3并仅保留TLS
SSL 3容易受到攻击, 我们将只允许使用强大的TLS协议。
- 编辑ssl.conf文件并在服务器块中添加以下内容
ssl_protocols TLSv1.2;
- 保存ssl.conf文件并重新启动Nginx
禁用弱密码套件
弱密码套件可能会导致类似logjam的漏洞, 这就是为什么我们只需要允许强密码的原因。
- 将以下内容添加到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之类的现代浏览器进行浏览时可能会显示错误。你需要从授权机构获得链证书。通常, 你会在他们的网站上找到, 或者只是在Google上找到它。
- 如下所示, 将链证书内容添加到网站证书中。在我的示例中, 它是/opt/cert/bestflare.pem
- 保存文件并重新启动Nginx
TLS的安全Diffie-Hellman
Diffie-Hellman的安全性不如人们想象的那样。最近添加到列表中的最佳实践之一是保护Diffie-hellman。生成唯一的DH GROUP并在ssl.conf文件中添加ssl_dhparam即可。
- 使用OpenSSL生成唯一的DH组
openssl dhparam -out dhparams.pem 4096
- 这将花费几分钟, 并将在当前工作目录中生成文件dhparams.pem
- 将dhparams.pem复制到cert文件夹
- 修改ssl.conf并在服务器块中添加以下内容
ssl_dhparam /opt/cert/dhparams.pem;
- 保存文件并重新启动Nginx
这足以进行SSL/TLS优化, 让我们再次测试URL以查看等级。
ho!现在, 你可以看到SSLLabs将其评为” A”级。做得好!
这是完整的ssl.conf
# HTTPS server configuration
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禁用信息泄漏。我已经在上一篇文章中对此进行了解释。从Nginx中的服务器标题横幅中删除版本
Web应用安全
默认的Nginx配置不是完美的, 并且可能存在许多漏洞, 这就是为什么我们对其进行强化以使其安全的原因。
禁用不需要的HTTP方法
大多数时候, 你在Web应用程序中只需要GET, HEAD和POST HTTP请求。允许TRACE或DELETE是有风险的, 因为它可以允许跨站点跟踪攻击, 并可能使黑客窃取cookie信息。
- 修改default.conf并在服务器块下添加以下内容
if ($request_method !~ ^(GET|HEAD|POST)$ )
{
return 405;
}
保存文件并重新启动Nginx。现在, 如果有人尝试使用TRACE, DELETE, PUT和OPTIONS, 这将显示405不允许。
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标头, 以缓解跨站点脚本攻击。
- 修改default.conf或ssl.conf文件以添加以下内容
add_header X-XSS-Protection "1; mode=block";
- 保存配置文件并重新启动Nginx。你可以使用标头测试工具在实施后进行验证。
你可能还对实现OWASP建议的安全标头感兴趣, 在此介绍了这些标头。
实施Mod Security WAF
通过使用OWASP Core Rule Set实施Web应用程序防火墙ModSecurity, 可以增加一层安全性。
或者, 如果你考虑在Nginx服务器之前使用基于云的安全性, 例如SUCURI。
保持Nginx为最新
最后但并非最不重要的一点是, 由于许多性能增强功能, 安全修复程序和新功能正在添加中, 因此你需要使Nginx保持最新。
我希望这可以帮助你确保Nginx的安全。
接下来, 你可能有兴趣学习从头开始构建Nginx以实现高性能。