介绍

需要强大的安全设置来保护 Web 服务器免受网络攻击。
我们使用漏洞诊断工具验证了 NGINX 安全设置所需的项目。

相关术语回顾

什么是 NGINX?

摘自维基百科

  • 免费和开源的网络服务器
  • 开发时专注于处理性能、高并发和小内存使用
  • 具有 HTTP、HTTPS、SMTP、POP3 和 IMAP 的反向代理功能
  • 它还具有负载均衡器和HTTP缓存等功能

什么是漏洞扫描器(简称VS)?

摘自维基百科

  • 用于测试计算机安全性的程序集合
  • 模拟用于计算机安全的各种入侵的攻击方法
  • 通常打包并用于评估产品或原型软件

首先,让我们使用 NGINX 的默认设置进行漏洞诊断。

这一次,作为 Web 漏洞诊断工具,OWASP ZAP使用。

  • 安装 OWASP ZAP

  • 启动 OWASP ZAP

  • 扫描待验证网站(点击攻撃按钮)

    • 然后报告了三个漏洞警告(所有关于缺少安全标头的警告)
      NGINXセキュリティ設定の脆弱性診断による検証

接下来,配置 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。

NGINXセキュリティ設定の脆弱性診断による検証

措施 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

- 允许发布小于 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
NGINXセキュリティ設定の脆弱性診断による検証

措施 9. 使用 HTTPS 协议(SSL 通信)

  • 目的
    • 保护由 NGINX Web 服务器提供的数据及其通信路径
  • 设置
    • 配置 SSL 设置
  • 确认
    • 检查是否可以使用 https 连接

综上所述

我尝试验证 NGINX 安全设置。
我使用了一个漏洞诊断工具进行安全检查。
如果您可以参考,我将不胜感激。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308629961.html

相关文章:

  • 2021-05-22
  • 2021-11-27
  • 2021-06-02
  • 2021-07-24
  • 2021-07-29
猜你喜欢
  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
  • 2021-08-28
  • 2021-11-21
相关资源
相似解决方案