分享好友 系统运维首页 频道列表

使用漏洞检查器验证 NGINX 安全设置

Nginx教程  2023-03-08 14:490

介绍

需要强大的安全设置来保护 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

查看更多关于【Nginx教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
Nginx端口占用问题
错误信息:nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)主要是端口被占用,通过如下命令,可以查看该端口被那个应用占用:sudo netstat -ntpl 然后kill -9 PID将其杀死关闭即可解决

0评论2023-02-13565

Linux使用nginx反向代理。可实现域名指向特定端口
在配置80指向域名的时候出现端口占用,使用kill -9无法杀死端口,应使用下面的命令来杀死进程killall -9 nginx(使用完本命令需要再把配置过的配置文件重新启动。命令写在了PS下面)后在root权限下的nginx的sbin下使用./nginx -t(命令重启nginx并检查是否有语

0评论2023-02-13636

装tomcat和nginx心得
开机启动tomcat1:在/etc/rc.d/init.d目录下生成一个文件tomcat80802:在文件里添加如下内#!/bin/bash#2345 linux运行级别#10开机启动优先级,数值越大越排在前面,最大值100#90关机优先级#chkconfig:2345 10 90#description: tomcat8080 start....start(){ec

0评论2023-02-13333

nginx 之 proxy_pass的使用
使用注意事项proxy_pass在nginx中作代理转发使用。如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。第一种:location /proxy/

0评论2023-02-13675

用Nginx代理请求,处理前后端跨域 用nginx代理请求,处理前后端跨域文件
  自从前端spa框架出现后,都是前后端分离开发了。我们在开发的时候难免会遇到跨域的问题。跨域这种问题解决的方法基本都是在服务端实现的。以java为例,我知道的有3种方法处理跨域:  1.使用 @CrossOrigin 注解对每一个接口进行跨域处理,缺点是比较麻烦

0评论2023-02-13771

手动上传图片到nginx下可访问,程序上传后访问图片报403
1. 首先查看文件权限2. 初步确定是服务器权限问题2.1 解决方案一:更改文件权限2.2 解决方案二:修改nginx运行用户 1. 首先查看文件权限#指令如下ls -l2. 初步确定是服务器权限问题403 forbidden错误是禁止读取访问,也就是说服务器理解了请求,但是不允许访问

0评论2023-02-13745

check nginx配置文件错误:[emerg]: getpwnam(“nginx”) failed
 1、错误提示:[root@server include]# /application/nginx/sbin/nginx -t -c /applications/nginx/nginx/nginx.confnginx: [emerg] getpwnam("nginx") failed in /applications/nginx/nginx/nginx.conf:2nginx: configuration file /application/nginx/ngin

0评论2023-02-13620

Nginx 499的问题 PHP 异步 HTTP 与 NGINX 499
PHP 异步 HTTP在 PHP 代码中提交异步 HTTP 请求比较常用的方式是通过 fsockopen/fwrite/fclose 来实现,请参考如下代码。function post($host, $path, $port, $data) {$post = http_build_query($data);$len = strlen($post);$fp = fsockopen($host, $port,

0评论2023-02-13458

nginx FastCGI模块(FastCGI)配置
http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:standardhttpmodules:fastcginginx官方文档:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html 摘要这个模块允许nginx

0评论2023-02-10486

nginx+tomcat反向代理下使用tomcat-redis-session-manager进行session共享中值得注意的一个问题
公司目前项目使用nginx反向代理+多个tomcat进行负载均衡,之前使用ip_hash策略进行session控制。近期有考虑不再使用ip_hash策略,所以需要进行session共享。根据项目实际情况,拟考虑使用开发配置比较简单,应用比较广泛的tomcat-redis-session-manager方式进

0评论2023-02-10303

nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的
源码安装nginx报错,找不到gcc,但是实际上gcc是存在的,如下:# ./configure checking for OS + Linux 3.10.0-957.el7.x86_64 x86_64checking for C compiler ... not found./configure: error: C compiler cc is not found#  尝试找寻gcc# whereis gccgcc: /

0评论2023-02-10667

更多推荐