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,完成…