• Nginx SSL TLS部署最佳实践


    本文介绍nginx在提供HTTPS时使用的一些其他配置选项。 虽然这些功能有助于优化nginx的SSL和TLS,但这不是一个完整对加固nginx的介绍。 确保您的服务器安全的最佳方法是不仅需要正确的配置,而且需要始终遵循最佳安全的设置实践。

    关闭nginx版本显示

    <br>
    默认情况下,nginx与任何连接到服务器的客户端共享其版本号。 例如,如果没有找到目录,nginx将返回包含其版本号的404错误。 关闭nginx版本显示使得攻击者无法清楚的得到具体版本,因此可以阻止他进行特定于版本的漏洞攻击。
    1.要禁用server_tokens,请打开/etc/nginx/nginx.conf文件。 在http块中,附加或取消注释以下行:

    1. server_tokens       off;

    2.保存更改并重启nginx

    1. systemctl restart nginx

    启用HTTP/2支持

    <br>
    2010年9月,Google发布了适用于Chrome 6所有版本的的SPDY协议.SPDY目前正在逐步淘汰,以支持HTTP/2。 nginx在2016年5月删除了对Chrome中SPDY的支持。仅在nginx 1.8.x或更早版本中支持SPDY,而从1.9.5开始的版本开始支持HTTP/2。 检查你的nginx版本:
    nginx -v
    HTTP/2是HTTP标准的新版本,替代HTTP/1.1以减少页面加载时间。 传统上,当用户访问网页时,需要建立单独的HTTP连接以加载每个资源(例如HTML,CSS,JavaScript或图像)。 HTTP/2允许在单个连接上并发请求资源。 服务器还会在将资源发送到客户端之前对其进行压缩,这有利用减少的传输带宽。
    1.要启用HTTP/2,请打开nginx SSL虚拟主机配置文件。 根据你安装nginx方式,这可能位于/etc/nginx/sites-enabled/default或/etc/nginx/conf.d/example_ssl.conf。 在“SSL配置”中查找listen行。 如果需要,取消注释以下行,并将http2添加到分号前的结尾。
    /etc/nginx/conf.d/example_ssl.conf:

    1. listen       443 ssl http2;

    2.保存修改并重启nginx

    1. systemctl restart nginx

    3.打开https://tools.keycdn.com/http2-test网站,输入域名测试是否正确支持HTTP/2。

    重定向HTTP到HTTPS

    <br>
    Google现在对搜索结果中使用HTTPS加密连接的网站进行优先排名,因此将HTTP请求重定向到HTTPS是提高网页排名的一种可能方法。 然而,在遵循这些步骤之前,请务必研究旧版浏览器可能出现的兼容性问题。
    1.打开您的HTTP nginx虚拟主机配置文件,可能位于/etc/nginx/conf.d/default.conf,/etc/nginx/nginx.conf或/etc/nginx/sites-enabled/default,具体取决于您安装nginx的方式。 更改example.com以匹配您的服务器的域名或主机名:
    /etc/nginx/conf.d/default.conf:

    1. server_name example.com

    2.在server_name行下面附加以下行。
    /etc/nginx/conf.d/default.conf:

    1. rewrite        ^ https://$server_name$request_uri? permanent;

    3.注释掉(放置#在前面)所有其他行,所以你的配置看起来像这样:
    /etc/nginx/conf.d/default.conf:

    1. server {
    2.     listen       80;
    3.     server_name  example.com;
    4.     rewrite      ^ https://$server_name$request_uri? permanent;
    5. }

    4.保存更改并重启nginx

    1. systemctl restart nginx

    OCSP Stapling

    <br>
    创建在线证书状态协议(OCSP)是为了加速操作系统和浏览器用于检查证书吊销的过程。 例如,当您在Windows计算机上使用Internet Explorer或Google Chrome时,Windows默认配置为检查证书吊销。 在OCSP之前,您的操作系统或浏览器将下载证书吊销列表(CRL)。 CRL已经变得非常大,以至于浏览器厂商正在创建自己的CRL并将其分发给用户。
    OCSP的问题是,用户在使用由同一供应商或证书颁发机构提供的证书的网站跳转时,证书颁发机构可以跟踪用户这种行为。 为了防止这种情况,可以启用OCSP stapling。
    当启用OCSP stapling时,服务器上的nginx将向客户端发出OCSP请求。 从OCSP服务器收到的响应被添加到nginx对用户的响应中。 这消除了用户连接到OCSP服务器以检查服务器证书的撤销状态的需要。
    1.打开您的HTTPS nginx虚拟主机配置文件,可能位于/etc/nginx/conf.d/example_ssl.conf或/etc/nginx/sites-enabled/default,具体取决于您如何安装和配置nginx。 在server块中添加以下行:
    /etc/nginx/conf.d/example_ssl.conf:

    1. ssl_stapling on;
    2. ssl_stapling_verify on;
    3. ssl_trusted_certificate /etc/ssl/nginx/ca.pem;

    2.保存更改并重启nginx

    1. systemctl restart nginx

    3.打开https://www.ssllabs.com/ssltest/,检查OCSP stapling是否正确开启。

    强制HTTP使用HTTPS(HSTS)

    <br>
    Google Chrome,Mozilla Firefox,Opera和Safari目前支持HSTS标头。 HSTS用于强制浏览器仅使用安全加密连接进行连接。 这意味着您的网站将无法再通过HTTP访问。 当HSTS启用并且有效的HSTS头存储在用户浏览器缓存中时,如果显示由不受信任的证书颁发机构颁发的自签名,过期或SSL证书,则用户将无法访问您的网站。 用户也将无法绕过任何证书警告,除非您的HSTS标头过期或浏览器缓存已清除。
    将所有流量从HTTP重定向到HTTPS后,您可能需要允许用户仅使用HTTPS进行连接。 在启用HSTS之前,请确保您了解与旧版浏览器的兼容性的潜在影响。
    如果您希望用户能够通过HTTP访问您的网站,请不要按照这些步骤操作!
    1.打开您的nginx HTTPS虚拟主机配置文件。 这可能位于/etc/nginx/sites-enabled/default或/etc/nginx/conf.d/example_ssl.conf。 在您的server块中附加以下行:
    /etc/nginx/conf.d/example_ssl.conf:

    1. add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

    max-age属性以秒为单位设置此标头的到期日期; 在上述配置中,报头将在1年后过期。 您可以将其配置为更长或更短,但对Qualys测试,少于180天的时间被认为太短了。 includeSubdomains参数在所有子域上强制执行HSTS。
    2.保存更改并重启nginx

    1. systemctl restart nginx

    3.打开https://www.ssllabs.com/ssltest/,测试配置是否生效。

    禁用内容嗅探

    <br>
    内容嗅探允许浏览器检查字节流以便“猜测”其内容的文件格式。 它通常用于帮助不能正确识别其Web内容的MIME类型的网站,但它也导致出现了跨站点脚本和其他攻击的漏洞。 要禁用内容嗅探,请在server块中的nginx SSL配置文件中添加以下行:
    /etc/nginx/conf.d/example_ssl.conf:

    1. add_header X-Content-Type-Options nosniff;

    禁用或限制嵌入

    <br>
    HTTPS响应头X-Frame-Options可以指定页面是否能够在框架,iframe或对象中呈现。 如果未设置,您的网站的内容可能会在clickjacking攻击中嵌入到其他网站的HTML代码中。 要禁用嵌入内容,请将以下行添加到server块中的SSL配置文件中:
    /etc/nginx/conf.d/example_ssl.conf:

    1. add_header X-Frame-Options DENY;

    如果您希望限制嵌入而不是完全禁用它,则可以用SAMEORIGIN替换DENY。 这将允许您在框架中使用您的页面,只要是在同一网站中。

    创建自定义Diffie-Hellman密钥交换

    <br>
    我们使用4096位RSA私钥来签署Diffie-Hellman密钥交换,但是Diffie-Hellman的默认参数只指定1024位,通常使其成为SSL密码套件中最弱的链路。 我们应该为密钥交换生成自己的自定义参数,以提供更高的安全性。
    1.切换到certs目录

    1. cd /etc/ssl/certs

    2.为TLS握手创建自定义参数。 这里我们将使用4096位密钥来实现高安全性:

    1. openssl dhparam -out dhparam.pem 4096

    3.通过将以下行添加到server块中的nginx SSL配置文件中来指定新参数:
    /etc/nginx/conf.d/example_ssl.conf:

    1. ssl_dhparam /etc/ssl/certs/dhparam.pem;

    4.保存更改并重启nginx

    1. systemctl restart nginx

    测试配置

    <br>
    你的/etc/nginx/conf.d/example_ssl.conf现在应该看起来类似于:
    /etc/nginx/conf.d/example_ssl.conf:

    1. # HTTPS server
    2. #
    3. server {
    4.     listen       443 ssl http2;
    5.         
    6.     add_header   Strict-Transport-Security "max-age=31536000; includeSubdomains";
    7.     add_header   X-Content-Type-Options nosniff;
    8.     add_header   X-Frame-Options DENY;
    9.         
    10.     server_name  example.com;
    11.  
    12.     ssl_certificate      /etc/ssl/nginx/nginx.crt;
    13.     ssl_certificate_key  /etc/ssl/nginx/server.key;
    14.  
    15.     ssl_session_cache shared:SSL:10m;
    16.     ssl_session_timeout  5m;
    17.  
    18.     ssl_ciphers  "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH !RC4";
    19.     ssl_prefer_server_ciphers   on;
    20.  
    21.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    22.  
    23.     ssl_stapling on;
    24.     ssl_stapling_verify on;
    25.     ssl_trusted_certificate /etc/nginx/ca.pem;
    26.  
    27.     ssl_dhparam /etc/ssl/certs/dhparam.pem;
    28.  
    29.     location / {
    30.         root   /usr/share/nginx/html;
    31.         index  index.html index.htm;
    32.     }
    33. }

    打开https://www.ssllabs.com/ssltest/,测试SSL。

  • 相关阅读:
    BZOJ2734 [HNOI2012]集合选数
    BZOJ2288:[POJ Challenge]生日礼物
    浅谈堆
    BZOJ1150:[CTSC2007]数据备份
    POJ2442:Sequence
    POJ1442:Black Box
    POJ3784:Running Median
    洛谷【P1090】合并果子&&洛谷【P1334】瑞瑞的木板
    BZOJ1345:[Baltic2007]序列问题
    浅谈栈
  • 原文地址:https://www.cnblogs.com/felixzh/p/6283797.html
Copyright © 2020-2023  润新知