介绍
需要强大的安全设置来保护 Web 服务器免受网络攻击。
我们使用漏洞诊断工具验证了 NGINX 安全设置所需的项目。
相关术语回顾
什么是 NGINX?
摘自维基百科
- 免费和开源的网络服务器
- 开发时专注于处理性能、高并发和小内存使用
- 具有 HTTP、HTTPS、SMTP、POP3 和 IMAP 的反向代理功能
- 它还具有负载均衡器和HTTP缓存等功能
什么是漏洞扫描器(简称VS)?
摘自维基百科
- 用于测试计算机安全性的程序集合
- 模拟用于计算机安全的各种入侵的攻击方法
- 通常打包并用于评估产品或原型软件
首先,让我们使用 NGINX 的默认设置进行漏洞诊断。
这一次,作为 Web 漏洞诊断工具,OWASP ZAP使用。
-
安装 OWASP ZAP
- 需要 Java 8 或更高版本
- 从以下位置下载并安装
-
启动 OWASP ZAP
-
扫描待验证网站(点击
攻撃
按钮)- 然后报告了三个漏洞警告(所有关于缺少安全标头的警告)
- 然后报告了三个漏洞警告(所有关于缺少安全标头的警告)
接下来,配置 NGINX 安全设置 (nginx.conf
)
在 Red Hat Enterprise Linux 安全指南中提到 NGINXのセキュリティ保護
时,
将安全项添加到nginx.conf
(设置后重新加载nginx.conf
)。
解决方案 1. 添加与安全相关的 HTTP 标头
添加标头以缓解已知的 Web 应用程序漏洞。
-
X-Frame-Options SAMEORIGIN
- 目的
- 有效缓解点击劫持攻击
- 设置
-
将
add_header X-Frame-Options SAMEORIGIN;
添加到server
块
-
将
- 目的
-
X-Content-Type-Options nosniff
- 目的
- 在某些较旧的浏览器中防止 MIME 类型嗅探
- 设置
-
将
add_header X-Content-Type-Options nosniff;
添加到server
块
-
将
- 目的
-
X-XSS-Protection
- 目的
- 启用跨站点脚本 (XSS) 过滤
- 设置
-
将
add_header X-XSS-Protection "1; mode=block";
添加到server
块
-
将
- 目的
-
Content-Security-Policy
- 目的
- 缓解跨站点脚本 (XSS) 和数据注入等攻击
- 设置
-
将
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none'; form-action 'none'; " always;
添加到server
块
-
将
- 目的
我会用漏洞诊断工具OWASP ZAP
再次扫描,看看设置是否有效。
这次没有告警,漏洞诊断结果OK。
措施 2. 隐藏 NGINX 版本
- 目的
- 防止攻击者检测 NGINX 版本并利用版本特定的漏洞
- 设置
-
将
server_tokens off;
添加到http
块
-
将
- 确认
- 版本信息消失(设置前:
Server: nginx/1.23.1
)
- 版本信息消失(设置前:
# curl -sI http://172.20.218.208 | grep Server
Server: nginx
对策3.隐藏Etag
- 目的
- 防止滥用用于验证缓存的
Etag
值
- 防止滥用用于验证缓存的
- 设置
-
将
etag off;
添加到http
块
-
将
- 确认
- 响应将不再包含
Etag
值
- 响应将不再包含
解决方案 4. 禁用不必要的 HTTP 方法
- 目的
- 防止攻击者利用 HTTP 方法
- 设置(仅允许 GET 和 POST 方法的示例)
if ( $request_method !~ ^(GET|POST)$ ) {
return 403;
}
- 确认
- 使用不允许的 PUT 方法发出的请求将被拒绝
# curl -XPUT http://172.20.218.208
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.23.1</center>
</body>
</html>
解决方案 5. 删除未使用的 NGINX 模块
- 目的
- 删除未使用的模块以防止被攻击者利用
- 设置(例如,注释掉或删除未使用的
ngx_http_xxx.so
模块)
# load_module modules/ngx_http_xxx.so;
- 确认
- 确认模块的功能不可用
措施 6. 仅允许包含特定标头的请求
- 目的
- 拒绝不包含某些标头的请求以提高安全性
- 设置(例如拒绝不包含自定义标头
X-My-Header
的请求)
if ($http_x_my_header = "") {
return 403;
}
- 确认
- 没有自定义标头X-My-Header
的请求将被拒绝
# curl http://172.20.218.208
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.23.1</center>
</body>
</html>
- 允许带有自定义标头X-My-Header
的请求
# curl -H "X-My-Header: test" http://172.20.218.208
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
... ...
<body>
<h1>Welcome to nginx!</h1>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
解决方案 7. 限制客户端缓冲区大小
- 目的
- 限制客户端缓冲区大小以防止缓冲区溢出攻击
- 设置(例如,如果正文大小超过 4KB,则拒绝)
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 4k;
large_client_header_buffers 2 1k;
- 确认
- 准备 1:NGINX 不允许在静态页面上进行 POST
-
将
error_page 405 =200 $uri;
添加到server
块以暂时允许POST
-
将
- 准备2:为POST body准备两个JSON文件
-
small.json
: 1KB -
large.json
: 8KB
-
- 准备 1:NGINX 不允许在静态页面上进行 POST
- 允许发布小于 4KB 的 JSON 文件
# curl -XPOST -H "X-My-Header: test" -H "accept: application/json" -H "Content-
Type: application/json" -d @small.json http://172.20.218.208
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
... ...
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>
- POST 大于 4KB 的 JSON 文件将被拒绝
# curl -XPOST -H "X-My-Header: test" -H "accept: application/json" -H "Content-
Type: application/json" -d @body.json http://172.20.218.208
<html>
<head><title>413 Request Entity Too Large</title></head>
<body>
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>nginx/1.23.1</center>
</body>
</html>
解决方案 8. 只允许特定的用户代理
- 目的
- 只允许来自特定用户代理的请求
- 设置(例如,只允许通过
curl
命令请求)
if ($http_user_agent !~ ^curl.*) {
return 403;
}
- 确认
- 允许使用curl
命令发出的请求
# curl -H "X-My-Header: test" http://172.20.218.208
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
... ...
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>
- 从浏览器访问网站时出现403 Forbidden
措施 9. 使用 HTTPS 协议(SSL 通信)
- 目的
- 保护由 NGINX Web 服务器提供的数据及其通信路径
- 设置
- 配置 SSL 设置
- 确认
- 检查是否可以使用 https 连接
综上所述
我尝试验证 NGINX 安全设置。
我使用了一个漏洞诊断工具进行安全检查。
如果您可以参考,我将不胜感激。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308629961.html
查看更多关于【Nginx教程】的文章