安全,加固和提高Nginx Web服务器性能的终极指南


根据你所听到的关于 Nginx 的精彩内容,也许你决定尝试一下。您可能已经非常喜欢它,正在考虑在浏览我们在本网站上发布的主题的一些文章之后用Nginx替换您的Apache安装。

如果是这样,我相信你会张开双臂欢迎这本指南,因为我们将介绍 12提示,以提高Nginx 服务器的安全性(从保持Nginx一直到最新到使用TLS并将HTTP重定向到HTTPS),您会注意到其中一些与您使用Apache的方式非常相似。

红色

我们将在本指南中使用以下环境:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP address: 192.168.0.25 (tecmintlovesnginx.com) and 192.168.0.26 (nginxmeanspower.com), as described in the IP-based virtual hosts section at
    1. “How to Setup Name-based and IP-based Virtual Hosts (Server Blocks) with Nginx“

    考虑到这一点,让我们开始吧。

    提示#1:让Nginx保持最新状态

    在撰写本文时,CentOS中最新的Nginx版本(在 EPEL 中)和Debian存储库 1.6.3 1.6.2-5 ,分别。

    尽管从存储库安装软件比从源代码编译程序更容易,但最后一个选项有两个优点:1)它允许您在Nginx中构建额外的模块(例如mod_security),以及2)它将始终提供更新的版本比存储库( 1.9.9 截至今天)。发行说明始终在Nginx网站上提供。

    红色

    提示#2:删除Nginx中不必要的模块

    要从源代码安装时从Nginx中显式删除模块,请执行以下操作:

    # ./configure --without-module1 --without-module2 --without-module3
    

    例如:

    # ./configure  --without-http_dav_module --withouthttp_spdy_module 
    

    您可能会猜到,从源代码中删除先前Nginx安装中的模块需要再次执行编译。

    红色

    提示#3:在Nginx中禁用server_tokens指令

    server_tokens 指令告诉Nginx在错误页面上显示其当前版本。这是不可取的,因为您不希望与全世界共享该信息,以防止由该特定版本中的已知漏洞导致的Web服务器攻击。

    要禁用 server_tokens 指令,请在服务器块内设置if off:

    server {
        listen       192.168.0.25:80;
        Server_tokens        off;
        server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
        access_log  /var/www/logs/tecmintlovesnginx.access.log;
        error_log  /var/www/logs/tecmintlovesnginx.error.log error;
            root   /var/www/tecmintlovesnginx.com/public_html;
            index  index.html index.htm;
    }
    

    重新启动nginx并验证更改:

    提示#4:拒绝Nginx中的HTTP用户代理

    HTTP用户代理是用于针对Web服务器进行内容协商的软件。这还包括恶意软件机器人和爬虫程序,它们最终可能会通过浪费系统资源来影响Web服务器的性能。

    为了更轻松地维护不需要的用户代理列表,请使用以下内容创建一个文件(例如 /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;
    

    如果用户代理字符串在上面定义的黑名单中,则if语句返回403响应:

    重新启动nginx,将阻止其字符串与上述字符串匹配的所有用户代理访问您的Web服务器。将 192.168.0.25 替换为服务器的IP,并随意为 wget - user-agent 开关选择不同的字符串:

    # wget http://192.168.0.25/index.html
    # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 
    

    提示#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 
    

    提示#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;
    

    提示#7:在Nginx中限制IP连接数

    要通过IP限制连接,请使用 limit_conn_zone (在http上下文中或至少在服务器块外部)和limit_conn(在http,服务器块或位置上下文中)指令。

    但是,请记住,并非所有连接都被计算在内 - 但只有那些具有服务器处理请求及其整个请求标头的连接才被读取。

    例如,让我们在名为addr的区域中设置 1 的最大连接数(是的,这是夸张的,但在这种情况下它可以正常工作)(你可以将它设置为任何你希望的名字):

    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 1;
    

    使用Apache Benchmark(执行Nginx加载)进行简单测试,其中 10 2 同步请求的总连接将帮助我们证明我们的观点:

    # ab -n 10 -c 2 http://192.168.0.25/index.html
    

    有关详细信息,请参阅下一个提示。

    提示#8:设置监视器记录Nginx

    完成上一个技巧中描述的测试后,请检查为服务器块定义的错误日志:

    您可能希望使用 grep 过滤日志,以查看对提示#7 中定义的添加 r区域发出的失败请求:

    # grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
    

    同样,您可以过滤访问日志以获取感兴趣的信息,例如:

    1. Client IP
    2. Browser type
    3. HTTP request type
    4. Resource requested
    5. Server block answering the request (useful if several virtual hosts are logging to the same file).

    如果您发现任何异常或不需要的活动,请采取适当的措施。

    提示#9:防止Nginx中的图像热链接

    当一个人在另一个站点中显示托管在您的图像上时,就会发生图像链接。这会导致您的带宽使用量增加(您支付的费用),而另一个人则乐意将图像显示为他或她的财产。换句话说,这对你来说是双重损失。

    例如,假设您的服务器块中有一个名为 img 的子目录,您可以在其中存储该虚拟主机中使用的所有映像。要防止其他站点使用您的映像,您需要在虚拟主机定义中插入以下位置块:

    location /img/ {
      valid_referers none blocked 192.168.0.25;
       if ($invalid_referer) {
         return   403;
       }
    }
    

    然后修改每个虚拟主机中的 index.html 文件,如下所示:

    现在浏览到每个站点,如您所见,图像在 192.168.0.25 中正确显示,但在 192.168.0.26中被 403 响应替换

    请注意,此提示取决于发送Referer字段的远程浏览器。

    提示#10:禁用SSL并仅在Nginx中启用TLS

    在可能的情况下,尽一切可能避免在任何版本中使用 SSL ,而是使用 TLS 。以下 ssl_protocols 应放在虚拟主机文件中的服务器或http上下文中,或者通过include指令放在单独的文件中(有些人使用名为 ssl.conf 的文件) ,但这完全取决于你):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    例如:

    提示#11:在Nginx中创建证书

    首先,生成密钥和证书。如果您愿意,可以随意使用不同类型的加密:

    # openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
    # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
    # cp tecmintlovesnginx.key tecmintlovesnginx.key.org
    # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
    # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt
    

    然后在单独的服务器块中添加以下行以准备下一个提示( http - > https 重定向),并将与SSL相关的指令移动到新块:

    server {
        listen 192.168.0.25:443 ssl;
        server_tokens off;
        server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
        root   /var/www/tecmintlovesnginx.com/public_html;
        ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
        ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    }
    

    在下一篇技巧文章中,我们将验证我们的网站现在如何使用自签名证书和TLS。

    提示#12:在Nginx中将HTTP流量重定向到HTTPS

    将以下行添加到第一个服务器块:

    return 301 https://$server_name$request_uri;
    

    上面的指令将返回 301 (永久移动)响应,每当向虚拟主机的端口80发出请求时,该响应用于永久URL重定向,并将请求重定向到服务器块我们在上一个提示中添加了。

    下图显示了重定向,并确认我们使用 TLS 1.2 AES-256 进行加密:

    摘要

    在本文中,我们分享了一些保护您的Nginx Web服务器的技巧。我们很想听听您的想法,如果您有其他想要与社区其他人分享的提示,请随时通过下面的评论表向我们发送说明来告知我们。

版权所有。 © Linux-Console.net • 2019-2020