没事干看了下日志,发现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,完成…