Nginx 提高防漏扫等安全配置
没事干看了下日志,发现UWSGI里好多 NOT FOUND 的空路径,说是被漏扫记录啥的,感觉这些日志都没啥必要记录,想着完善下。 1. 定义匹配规则 # 定义恶意路径匹配规则 (大小写不敏感) # 如果 URI 匹配到以下任意正则,$block_scanner 变为 1,否则为 0 map $request_uri $block_scanner { default 0; # 常见后台/管理路径 ~*^/(wp-admin|wp-login|administrator|phpmyadmin|pma|mysql|webadmin|shell|cmd|console|manager|login|signin|auth) 1; # 常见敏感文件/备份 ~*^/.(php|git|svn|htaccess|htpasswd|env|config|bak|backup|sql|tar|gz|zip|rar|7z) 1; # 常见漏洞利用路径 (ThinkPHP, Struts2, Log4j, Shellshock 等特征) ~*^/(index.php)/?(\?s=|\\x00) 1; ~*^/(solr|actuator|eureka|swagger|api-docs) 1; ~*^/(cgi-bin|scripts|bin|tmp) 1; ~*\.(asp|aspx|jsp|jspx|php5|phtml|pl|py|rb|sh|exe|bat|cmd)$ 1; # 特定漏洞探测字符串 ~*\$(\{|%24\{) 1; # Log4j JNDI 特征 ~*union.*select 1; # 基础 SQL 注入探测 (注意:复杂SQL注入建议由WAF处理,此处仅做简单特征) ~*(\.\.\/|\.\.%2f|\%2e\%2e\/|\%2e\%2e\%2f) 1; # 目录遍历 } 2. 配置 main 日志格式,要不然后续配置检查会报错 # /etc/nginx/nginx.conf http { …… # 定义名为 "main" 的日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; …… } 3. 引用规则及配置 server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name domain.cn; # 拦截恶意扫描路径 if ($block_scanner) { return 444; # 444表示直接关闭连接,不返回任何响应,也可返回 403、404 } # 限制 HTTP 方法 (只允许常用方法) if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE|PATCH)$) { return 405; } # 如果 block_scanner=1,记录日志,其它不记录 access_log /srv/log/codenotes.access.log main if=$block_scanner=0; …… } 4. 检查并重启,完成相应安全强化 # 检查配置 nginx -t # 重启 nginx nginx -s reload OK,完成…