Nginx网络服务器安全和加固指南

blank

Nginx安全最佳实践。

Nginx是业内增长最快的网络服务器,目前在市场份额中排名第二。

它最初于2004年发布,并且自那时以来赢得了极佳的声誉,并在百万最繁忙的站点中使用。

blank

这是有原因的-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证书已成功实施。

blank

SSL/TLS优化

拥有SSL并不意味着它是完全安全的,作为Web安全专家,您需要应用配置来保护Web服务器。

首先,我建议运行一个SSL scan来针对网站进行评分和查找关键漏洞。

blank

因此,当前的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

blank

  • 保存文件并重新启动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以查看评级。

blank

哇喔!现在你可以看到它的评级是“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应用程序防火墙ModSecurityOWASP Core Rule Set.,增加额外的安全层。

另外,如果您考虑在Nginx服务器前使用基于云的安全性,可以使用SUCURI

保持Nginx更新

最后,您需要保持Nginx的更新,因为有许多性能增强、安全修复和新功能正在添加。

希望这些对您保持Nginx安全有所帮助。

接下来,您可能对学习build Nginx for high-performance from scratch感兴趣。

类似文章