安全模型与权限
WebRTC 是浏览器里默认就强制端到端加密的能力,但加密之外的安全面(隐私、滥用、合规)都要业务自己处理。
1. 浏览器强制的安全前置
| 限制 | 含义 | 例外 |
|---|---|---|
| Secure Context | 必须 HTTPS(https://) | http://localhost、http://127.0.0.1、file:// |
| 用户权限 | 摄像头 / 麦克风 / 屏幕共享必须用户同意 | 企业管控策略可预授权 |
| 用户手势 | iOS Safari 要求由用户手势触发 getUserMedia | 无 |
| Permissions Policy | iframe 必须显式 allow="camera; microphone" | 同源除外 |
<!-- iframe 嵌入摄像头页 -->
<iframe src="https://meet.example.com" allow="camera; microphone; display-capture"></iframe>
Permissions-Policy: camera=(self "https://trusted.example.com"), microphone=(self)
2. 媒体链路加密
WebRTC 强制 DTLS-SRTP(RFC 5764)。没办法关。
- 媒体包:SRTP(AES-128-GCM 或 AES-128-CM + HMAC-SHA1-80)。
- 数据通道:SCTP-over-DTLS。
- 控制信令(NACK/PLI/REMB/TWCC):SRTCP,同样加密。
对中间盒(SFU、TURN)来说,媒体是明文的——SFU 持有 SRTP 密钥。如果业务要求"连 SFU 也看不到内容",需要 E2EE:
- Insertable Streams API(
RTCRtpScriptTransform) - SFrame(IETF 草案)
- 用 Web Workers + WebCrypto 做帧级加密
3. IP 与隐私泄露
WebRTC 默认会枚举本机所有网卡 IP(host 候选),曾经是浏览器经典的隐私泄露通道——即使开了 VPN,本地内网 IP 也能被网页拿到。
3.1 现状(2026)
| 浏览器 | 默认行为 |
|---|---|
| Chrome / Edge | host 候选用 mDNS hostname(*.local)隐藏真实 IP |
| Firefox | 可配置 media.peerconnection.ice.default_address_only |
| Safari | 默认隐藏 |
3.2 服务端影响
mDNS 候选只能在本网段解析,服务器侧 SFU 无法解析。这意味着:
- 完全靠 host 候选连接的部分场景失效,必须有 srflx / relay。
- 排障时
chrome://webrtc-internals看到的候选是 mDNS 名字,要看实际 STUN binding 才知道真 IP。
4. TURN 凭据管理
TURN 服务器是滥用重灾区——如果凭据泄露,攻击者可以用你的 TURN 中继任意流量。
4.1 不要做
- 在前端硬编码长期
username/credential。 - 所有用户共用一个 TURN 账号。
- TURN 端口对公网开放且不限速。
4.2 推荐做法(REST API 短期凭据,RFC 8489 附录 B)
// 服务端生成
const ttl = 600; // 10 分钟有效
const username = `${Math.floor(Date.now()/1000) + ttl}:${userId}`;
const credential = crypto
.createHmac('sha1', TURN_SHARED_SECRET)
.update(username)
.digest('base64');
// 下发前端
res.json({
iceServers: [{
urls: ['turn:turn.example.com:3478', 'turns:turn.example.com:5349'],
username, credential,
}],
});
coturn 配置:
use-auth-secret
static-auth-secret=YOUR_SHARED_SECRET
realm=turn.example.com
total-quota=1200
user-quota=12
5. 信令通道安全
信令本身不在 WebRTC 标准内,业务自己负责:
- 必走 wss://(TLS)。
- 每条信令消息要有房间鉴权(JWT 或短期 token)。
- 防止跨房间消息串扰(服务端按 room 隔离广播)。
- 防止重放:信令带递增的 seq 或 timestamp。
特别注意:SDP 里包含 DTLS fingerprint。如果信令链路可被篡改,中间人可以替换指纹完成 MITM。HTTPS/WSS 是基本盘。
6. 防滥用与配额
WebRTC 服务的成本中心是 TURN 带宽。攻击场景:
| 攻击 | 危害 | 对策 |
|---|---|---|
| TURN 凭据滥用 | 中继任意流量 | 短期凭据 + 单用户配额 |
| 房间创建洪水 | 占用 SFU 资源 | 房间创建限速、需登录 |
| 大量加入小房间 | 让 SFU 处理大量信令 | 房间人数上限、邀请制 |
| 恶意 ICE 候选 | 指向内网 IP 做 SSRF | SFU 端过滤候选 IP 范围 |
7. 设备隐私
enumerateDevices()在用户未授权前只能拿到设备数量和 kind,不返回 label。- 一旦授权过一次摄像头,未来
enumerateDevices()就能拿到所有设备 label(设备指纹素材)。 - iOS Safari 在隐私模式下每次都要求授权。
8. 内容审核
媒体内容审核(违规图像、违规语音)不在 WebRTC 范畴,常见做法:
- SFU 旁路出一份关键帧 → 接图片内容审核服务。
- 旁路出音频 → ASR + 文本审核。
- 通过 RTMP/HLS 推流到云端审核服务。
9. 合规要点
- 录音/录像必须用户明示同意(GDPR/CCPA/PIPL)。
- 跨境通话注意数据驻留(媒体经由境外 TURN 也算跨境)。
- 医疗 / 金融场景要 HIPAA / PCI-DSS 级别的审计,建议私有化部署 SFU。
- 未成年人保护:摄像头采集要有家长同意机制。
10. 安全自查清单
- 所有页面 HTTPS,信令走 wss
- TURN 用短期凭据,单用户限速
- DTLS 指纹两端校验(默认就有)
- 房间鉴权强制 JWT 校验
- 客户端做输入校验(房间号、昵称等)
-
getStats上报含 freezeCount、relay 占比,监控异常 - 录制功能默认关闭,开启时全员可见提示
- iframe 嵌入用 Permissions-Policy 限制来源
11. 权威资料
- W3C WebRTC Security Architecture (RFC 8826): https://www.rfc-editor.org/rfc/rfc8826
- RFC 8827 WebRTC Security Considerations: https://www.rfc-editor.org/rfc/rfc8827
- W3C Permissions Policy: https://www.w3.org/TR/permissions-policy/
- coturn auth-secret 文档: https://github.com/coturn/coturn/wiki/turnserver#shared-secret
- 核对日期:2026-06-22