Apache本身不提供HTTPS自动流量清洗能力,必须先终止TLS获取明文,再分层实施:mod_rewrite轻量拦截、ModSecurity+OWASP CRS深度清洗、动态分流至不同后端池。

Apache 本身不提供自动流量清洗能力,尤其在 HTTPS 环境下,所有清洗动作必须发生在 TLS 解密之后、请求被代理或响应返回之前。不能把 HTTP 层的规则直接套用到 HTTPS 配置中,否则会因加密上下文缺失而失效。真正可行的方案是:先完成 TLS 终止,再分层嵌入轻量拦截 + 深度防护 + 动态调度。
第一步:确保 HTTPS 正确终止,让清洗有明文可依
若 Apache 只做 TCP 透传(如用 stream 模块代理 443),则无法解析 URI、Header 或 Body,清洗无从谈起。必须启用 SSL 引擎并完整卸载 TLS:
- 启用 mod_ssl,配置证书链:
SSLCertificateFile、SSLCertificateKeyFile、SSLCertificateChainFile - 强制使用安全协议:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 +TLSv1.3 - 禁用会话复用缓存:
SSLSessionCache none,防止攻击者利用 session ticket 绕过首次清洗 - 开启
proxy_protocol on(如前端有云 LB),并在 upstream 中启用 proxy_protocol 支持,保留真实客户端 IP
第二步:用 mod_rewrite 做 TLS 后的轻量动态拦截
在 SSL 解密后的 server 或 virtualhost 块内,基于明文特征快速过滤已知恶意模式:
- 屏蔽含危险函数调用的请求:
RewriteCond %{QUERY_STRING} (eval|base64_decode|system|exec) [NC]→RewriteRule ^ - [F] - 拦截高频扫描路径:
RewriteRule "^/wp-admin/.*|/phpmyadmin/.*|/shell.php$" - [F] - 限制非标准 User-Agent 或空 UA:
RewriteCond %{HTTP_USER_AGENT} ^$|^Mozilla.*Gecko.*Firefox.*$! [NC]→RewriteRule ^ - [F]
这类规则生效快、无需额外模块,但仅适用于静态特征,不能替代 WAF。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
第三步:集成 ModSecurity + OWASP CRS 实现深度清洗
这是 HTTPS 下最实用的“自动清洗”落地方式。关键点在于:清洗必须放在 ProxyPass 之前,确保请求先被 WAF 检查再转发:
- 启用 mod_security2,加载 OWASP CRS 规则集(推荐 v4.x)
- 在 SSL 虚拟主机中配置:
SecRuleEngine On,并设置清洗动作如SecAction "phase:1,pass,tag:'OWASP_CRS',id:900100" - 对异常请求打分并拦截:
SecRule IP:bf_counter "@gt 5" "phase:1,deny,status:429,tag:'BLOCKED_BY_RATE_LIMIT'" - 配合
ProxySet failonstatus=429,403,让被 WAF 拦截的后端节点自动摘除
第四步:按需分流,实现清洗强度动态切换
不是所有流量都需要强清洗。可通过请求头、SNI 或来源 IP 自动选择不同清洗策略的后端池:
- 定义两个 balancer:
balancer://cleaned(接入 ModSecurity)和balancer://raw(直通) - 用
map或RewriteCond判断:RewriteCond %{HTTP:X-Clean-Mode} ^strict$→RewriteRule ^(.*)$ https://cleaned$1 [P] - 按 SNI 分流:
map $ssl_server_name $upstream { api.example.com cleaned; www.example.com raw; },再ProxyPass / balancer://$upstream/
这样既能保障核心接口安全,又避免对静态资源造成不必要开销。

















