apache https审计需启用%{ssl_protocol}x等mod_ssl变量,定义专用ssl_audit日志格式,隔离存储于受限权限文件,并结合%{ssl_cipher}x、%{ssl_tls_sni}x等字段实现真实协商结果的结构化记录与合规回溯分析。

Apache 访问日志要记录 SSL 加密协议版本用于安全审计和合规(如等保三级、金融行业要求),关键不是“加个字段就行”,而是确保记录的是真实协商结果、结构化输出、独立存储,并能支撑回溯分析。
启用并正确使用 %{SSL_PROTOCOL}x 变量
该变量返回 TLS 握手实际协商出的协议版本(如 TLSv1.2 或 TLSv1.3),不是配置中声明的支持列表。它只在握手成功后可用,因此天然过滤掉失败连接。
- 必须在 LogFormat 中显式写入,例如:
LogFormat "%t %h \"%r\" %>s %b %{SSL_PROTOCOL}x %{SSL_CIPHER}x" ssl_audit - 不能依赖默认 combined 格式——它不含任何 SSL 变量
- 确认 mod_ssl 已启用:
a2enmod ssl(Ubuntu/Debian)或检查httpd -M | grep ssl
定义专用日志格式并隔离存储
SSL 协议版本属于敏感审计字段,不能混入常规 access.log。必须单独定义、定向输出、权限受控。
- 在虚拟主机或 ssl.conf 中添加:
CustomLog /var/log/apache2/ssl_protocol.log ssl_audit - 设置文件权限为
640,属主为root:adm,防止非授权读取 - 避免日志轮转时权限丢失,建议在 logrotate 配置中指定
create 640 root adm
配合其他关键字段提升审计有效性
单看协议版本意义有限,需结合上下文才能判断是否合规。例如 TLSv1.2 本身合法,但若搭配 RC4 密码套件就属高风险。
- 必加字段:
%{SSL_CIPHER}x(密码套件)、%{SSL_TLS_SNI}x(客户端声明域名,防 SNI 绕过) - 双向认证场景加:
%{SSL_CLIENT_VERIFY}x和%{SSL_CLIENT_S_DN}x,验证客户端身份真实性 - 用
%D记录请求处理耗时,辅助识别异常长连接或重协商行为
验证日志内容是否真实可靠
协议版本日志容易被配置误导(比如配置了 TLSv1.3 但客户端不支持,实际仍走 TLSv1.2)。需交叉验证:
- 用
curl -I --tlsv1.3 https://yoursite.com和--tlsv1.2分别测试,观察日志中 %{SSL_PROTOCOL}x 是否对应 - 检查 error_log 中是否有
unknown protocol或no shared cipher报错——这些说明某些客户端根本连不上,而它们不会出现在访问日志里 - 若发现大量 TLSv1.0/TLSv1.1 日志,应立即审查 SSLCipherSuite 和 SSLProtocol 配置,禁用已淘汰协议











