1. TLS协议基础

咱们做DSPM平台TLS审计模块,第一个绕不开的就是TLS协议本身。我刚开始接触这东西的时候,觉得不就是HTTPS加个锁嘛,直到有一次帮客户排查数据库连接失败,抓包一看,对方只支持TLS 1.0——嗯,那会儿漏洞已经公开好几年了。从那以后我就养成个习惯:先搞清楚底层版本和握手细节,再去配审计规则。

1.1 TLS版本演进

TLS从1999年的1.0版走到今天,说白了就是一部「补丁史」。

版本 发布年份 关键变化 安全状态
SSL 3.0 1996 奠定TLS基础,但设计缺陷多 已废弃(POODLE攻击)
TLS 1.0 1999 基于SSL 3.0小幅改进 不推荐(BEAST攻击)
TLS 1.1 2006 引入CBC防御机制 不推荐(仍存在Lucky13)
TLS 1.2 2008 支持AEAD、GCM、SHA-256 目前主力,逐步过渡
TLS 1.3 2018 精简握手、移除不安全算法 推荐启用

⚠️ 重要提醒:我记得2020年有个金融客户的审计脚本还硬编码了TLS 1.0的密码套件,结果被合规检查卡住。咱们做DSPM审计配置时,强烈建议把TLS 1.0/1.1列为告警项,TLS 1.2设为最低要求。

1.2 握手流程

你想想看,客户端和服务端要安全通信,得先互相认识、交换密钥、确定加密算法——这个过程就是握手。TLS 1.2的握手需要2个RTT,TLS 1.3砍到1个RTT,甚至0-RTT(带之前缓存的会话)。

我挑最常用的TLS 1.2完整握手讲一下:

  1. ClientHello – 客户端发送支持的版本、密码套件列表、随机数。
  2. ServerHello – 服务端选择版本和套件,发回自己的随机数和证书。
  3. 证书验证 – 客户端检查证书链和吊销状态(OCSP)。
  4. 密钥交换 – 用RSA或DH/ECDHE交换预主密钥,双方算出主密钥。
  5. ChangeCipherSpec – 通知对方后面要用协商好的加密参数。
  6. Finished – 双方验证之前所有握手消息的完整性。

💡 实战经验:我曾经在调试一个内部系统时,发现每次握手都要3秒多。抓包一看,证书链太长,再加上OCSP查询超时。后来改成会话复用(Session Ticket),握手时间降到了200毫秒。审计模块里一定要记录握手耗时和会话复用标志,这是排查性能瓶颈的关键线索。

TLS 1.2 简化握手流程 客户端 服务端 ClientHello ServerHello 证书 + 密钥交换 密钥交换 + CCS Finished Finished 后续加密数据传输 说明:箭头方向表示消息流向

1.3 加密原理

TLS加密实际上是「三合一」:身份认证(证书)、密钥协商(DH/ECDHE)、对称加密(AES-GCM)。

  • 非对称加密(RSA/ECC):用于证书签名和密钥交换。我习惯在审计日志里记录证书指纹和公钥算法,后面做异常检测时特别有用。
  • 对称加密(AES、CHACHA20):真正加密数据。GCM模式自带完整性校验,比旧的CBC好多了。
  • 哈希(SHA-256、SHA-384):用于消息认证码和PRF。

TLS 1.3砍掉了很多老算法,只保留了AEAD。我个人觉得这是好事——少一个选项,少一个坑。

🔐 关键点:审计配置里一定要关注密码套件的选用。比如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256是目前最安全的组合之一,而TLS_RSA_WITH_AES_128_CBC_SHA就存在Lucky13攻击风险。建议在DSPM规则中把不安全的套件打上高风险标签。

1.4 常见攻击方式

做审计不可能不知道攻击手法。我把最常见的几类列出来:

攻击名称 目标版本 原理简述 审计检测点
POODLE SSL 3.0 利用CBC填充字节预测明文 检查是否允许SSL 3.0
BEAST TLS 1.0 利用CBC初始化向量可预测性 检查是否使用TLS 1.0 + CBC
Heartbleed TLS 1.0/1.1 OpenSSL缓冲区越界读 检查OpenSSL版本号
Lucky13 TLS 1.0~1.2 CBC填充区分攻击 检查是否使用CBC模式套件
Downgrade 所有版本 强制客户端降级到弱版本 检查版本协商日志

⚠️ 曾经遇到过的真实案例:有次渗透测试,对方明明部署了TLS 1.2,但握手时客户端主动发了一个TLS 1.0的ClientHello,服务端竟然也接受了。原因是服务端没做版本下限限制,降级攻击直接成功。咱们的DSPM审计规则应该把「不强制最高版本」也列为中危告警。

嗯,以上就是TLS协议基础的四个核心模块。理解这些之后,咱们后面配置审计规则时才能知道该抓哪些日志字段、该告警什么异常。