Nginx 是最广泛使用的免费和开源 Web 服务器之一,它以其稳定性、一流的性能、低资源消耗和精益配置而闻名。虽然功能强大且稳定,但默认配置并不安全,需要额外的调整来加强安全设置,以防止攻击和破坏。
在这篇文章中,我们将介绍一些步骤,从而加强和保护你的 Nginx Web 服务器。
1) 配置 SSL 证书
SSL 证书是一种加密数字证书,用于加密您的 web 服务器和站点访问者的 web 浏览器之间的流量。它还迫使您的站点使用安全的 HTTPS 协议,并放弃以纯文本发送流量的 HTTP。通过这样做,来回通信是安全的,防止黑客试图窃听和窃取机密信息,如用户名、密码和信用卡信息。
您可以使用易于安装和配置的 Let's Encrypt SSL 证书,不过有效期只有90天。安装后,您可以在 SSL Labs 上来验证 SSL 加密的强度,结果如下所示。
正如您所看到的,我们正在使用的域名得分为 B 级,这是由于协议支持较弱,用黄色突出显示。我们仍然需要做一些调整,以使其达到 A 级,让我们看看下一步如何改进协议支持。
2) 禁用弱 SSL / TLS 协议
正如您从结果中看到的,实现 SSL 并不一定意味着您的站点是完全安全的。已弃用的版本,如 TLS 1.0, TLS 1.1 和 SSL 3 被认为是脆弱的,并且存在黑客可以利用并最终危及您的 web 服务器的漏洞。这些协议容易出现 POODLE、BEAST、CRIME 等漏洞。
In fact, most popular and widely used web browsers have announced the end of support for TLS 1.0 and TLS 1.1 within the deadlines shown.
事实上,大多数网络浏览器已经宣布在所示的最后期限内结束对 TLS 1.0 和 TLS 1.1 的支持。
Browser Name | Date |
---|---|
Google Chrome | January 2020 |
Mozilla Firefox | March 2020 |
Safari/Webkit | March 2020 |
Microsoft Edge | June 2020 |
要使用 TLS 1.2 和 TLS 1.3,请编辑以下两个文件
- /etc/nginx/nginx.conf - nginx 主配置文件
- /etc/nginx/sites-available/example.com (or /default) - 站点配置文件
如果使用 Let ' s Encrypt SSL,请编辑以下两个文件
- /etc/nginx/nginx.conf
- /etc/letsencrypt/options-ssl-nginx.conf
使用以下步骤禁用弱 SSL / TLS 协议
Step 1) 编辑 nginx.conf 文件
请先备份 /etc/nginx/nginx.conf 文件,然后打开文件
$ sudo vi /etc/nginx/nginx.conf
找到下面的行
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
如果要禁用弱协议,只需删除 TLSv1 和 TLSv1.1 协议,并在最后添加 TLSv1.2 和 TLSv1.3 协议即可。
ssl_protocols TLSv1.2 TLSv1.3 ; # Dropping SSLv3, ref: POODLE
保存并退出配置文件
Step 2) 编辑站点配置文件
过时的协议可能仍然在您的 NGINX 站点配置文件中,编辑站点配置文件,如下所示
$ sudo vi /etc/nginx/sites-available/example.com
OR
$ sudo vi /etc/nginx/sites-available/default
和前面一样,找到下面的行
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
和前面一样,删除 TLSv1 和 TLSv1.1 协议,并在最后添加 TLSv1.2 和 TLSv1.3 协议。
注意: 如果使用 Let s Encrypt SSL,请修改 以下 SSL 文件
$ sudo vi /etc/letsencrypt/options-ssl-nginx.conf
重新启动 Nginx Web 服务器
$ sudo systemctl restart nginx
转到 SSL 实验室测试,再次测试您的域名,你应该得到如图所示的 A 评级。
3) 防止信息泄露
加固服务器的一部分包括尽可能限制 web 服务器上的信息披露。信息可以通过 HTTP 报头或错误报告泄露,其中一些信息包括你正在运行的 Nginx 版本。
默认情况下,Nginx 显示的 HTTP 报头信息
$ curl -I http://localhost
从第二行输出,你可以看到 Nginx 的版本和它所运行的操作系统
Server: nginx/1.14.0 (Ubuntu)
The version would also be displayed on a web browser if an error page such as a 404-error page is displayed as shown.
如果产生 404 错误,Nginx 版本也将显示在 web 浏览器上。
为了避免这种信息泄露,编辑 nginx.conf 文件,在 http 配置块下,取消下面一行的注释
server_tokens off;
保存并退出,然后重新启动服务器
$ sudo systemctl restart nginx
现在重新加载错误页面,Nginx 运行的版本和操作系统不见了。
此外,您也可以通过访问 Server Signature Site 检查您的域名。
4) 禁用不需要的 HTTP 方法
另一个合理的做法是禁用 web 服务器不需要的协议。下面的代码行允许实现 GET、POST 和 HEAD 方法,并排除所有其他方法,包括 TRACE 和 DELETE。在服务器 Server Block 中添加以下行。
location / {
limit_except GET HEAD POST { deny all; }
}
5) 禁用弱密码套件
除了 配置 SSL 证书,我们还需要禁用弱和不安全的密码,包括 RC4 密码。默认情况下,这些绑定仅仅是为了向后兼容以前的 Nginx 版本,它们是可以被利用的潜在漏洞。因此,在 ssl.conf 文件中,使用以下安全密码套件。
'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
6) 移除不需要的模块
为了进一步减少威胁,建议从默认服务器设置中删除任何不必要的模块。最佳实践要求您保持精简配置文件,只启用用于从 web 服务器提供内容的模块。但是要小心,不要卸载或删除您可能需要的模块。建议在 QA 或测试环境中执行测试,然后再决定哪些模块应该禁用,哪些模块对于 web 服务器是必需的。
7) 防止溢出
在内存管理中,缓冲区是暂时容纳数据的存储位置,因为数据开始从一个内存位置转移到另一个内存位置。
当数据量超过内存缓冲区的容量时,缓冲区溢出。换句话说,当程序在它可以容纳或处理的内存块上写入更多数据时,就会发生缓冲区溢出。
攻击者可以利用此漏洞发送可能危及系统的恶意代码。建议对 Web 服务器进行一些调整以减少此类问题,将下面的代码行添加到 nginx.conf 文件中。
##buffer policy
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
##end buffer policy
8) 防止 XSS 攻击
XSS (cross-site scripting) 攻击是指黑客使用 web 应用程序将恶意代码或浏览器端脚本注入可信站点的攻击。当站点的访问者访问站点时,脚本被下载,并可以访问各种浏览器资源,如 cookie 和会话令牌。
针对这类攻击的一种预防措施是在 ssl.conf 文件中添加下行
add_header X-XSS-Protection "1; mode=block";
9) 避免点击劫持攻击
为了避免点击劫持攻击,在 nginx.conf 文件中添加如下行
add_header X-Frame-Options "SAMEORIGIN";
保存并重新启动 Nginx 服务器
10) 拒绝自动用户
为了保证服务器的安全,攻击者可能会部署机器人和其他自动脚本从您的站点检索信息,要谨慎地明确拒绝特定的用户,在 nginx.conf 文件中添加如下行。
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}
11) 防止盗链图片
用户将图像链接到您的网站,而不是直接在他们的网站上上传图像。当这种情况发生时,你的图像出现在他们的网站上,另一方面是你最终需要支付额外的带宽。
为了防止这种情况发生,在 Nginx 配置文件中添加如下行
# Stop deep linking or hot linking
location /images/ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
return 403;
}
}
您还可以指定图像扩展名
valid_referers blocked www.example.com example.com;
if ($invalid_referer) {
rewrite ^/images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.example.com/banned.jpg last
}
12) 保持 Nginx 更新
让你 Web 服务器保持最新是保护你的服务器的方法之一。更新您的 Web 服务器将应用所需的补丁来解决可能被黑客利用来破坏您的服务器的预先存在的漏洞。