跳到主要内容

合规清单

WebRTC 业务的合规问题,几乎都不在协议层,而在业务怎么用协议。DTLS-SRTP 解决的是链路保密,监管要回答的是:你采集了谁的数据、存到哪、谁能看、保存多久、能不能删、跨没跨境、用户知不知情。

本文是工程清单,不是法律意见。法律意见请走法务 / 外部律师。

1. 合规清单的工程意义

1.1 为什么需要合规清单

法务文档解决"做什么是违法的",工程合规清单解决"代码、配置、部署里要落到哪几个开关上"。两者的鸿沟体现在:

  • 法务说"用户必须同意",工程要落到 UI 弹窗 + 同意时间戳入库 + 撤回机制。
  • 法务说"不得跨境传输",工程要落到 TURN 选址 + SFU 选址 + 数据库选址 + DNS 解析路径。
  • 法务说"未成年人需家长同意",工程要落到年龄网关 + 家长邮箱二次确认 + 数据隔离。

清单的价值是把每条法规拆成可在 PR review、CI、上线 checklist 里勾选的项。

1.2 什么时候适用

  • 业务采集音视频、屏幕、文字消息,任何一类触达个人信息。
  • 业务跨地区运营(哪怕只是用全球 CDN / TURN 集群)。
  • 业务面向特定行业(医疗、金融、教育、政企)。

1.3 什么时候不适用

  • 纯内网视频会议 + 私有化部署 + 无外部用户:仍要看内部数据治理,但跨境、未成年人这类外部触发条件可能不适用。
  • Demo / 内测且数据可清空:可以暂缓部分清单项,但录音同意、TURN 凭据这类基础项不能省。

1.4 失败时的样子

  • 监管约谈 / 罚款(GDPR 4% 全球营收、PIPL 5000 万或 5% 营收)。
  • 应用商店下架(Apple / Google 都按地区合规审 SDK 清单)。
  • B 端客户拒签:企业采购走安全问卷,缺一项就过不了。
  • 媒体 / 集体诉讼(Illinois BIPA、加州 CCPA 私权诉讼)。

2. 法规矩阵表

下表覆盖 WebRTC 业务最常踩的合规面。触发条件指代码 / 数据出现什么情况就要按该法规走;工程影响指代码、部署、流程要做什么。

地区法规触发条件工程影响关键义务
欧盟 / 欧洲经济区GDPR (Regulation 2016/679)处理欧盟居民个人数据,无论企业是否在欧盟数据最小化、被遗忘权 API、DPO、DPA、SCC 合同、欧盟内 TURN合法性基础、72h 漏洞通报、跨境传输机制
中国大陆PIPL(个人信息保护法)+ DSL(数据安全法)+ CSL(网络安全法)处理中国境内自然人个人信息单独同意、本地化存储、出境安全评估或标准合同备案、CII 等保单独同意、出境申报、删除权、本地代表
加州CCPA / CPRA在加州运营且年营收 ≥2500 万美元,或处理 ≥10 万加州居民数据,或 50% 营收来自卖数据Do Not Sell/Share 链接、敏感个人信息分类、撤回授权、12 个月披露知情权、删除权、退出权、限制 SPI 使用
美国HIPAA业务作为 Covered Entity 或 Business Associate 处理 PHIBAA 合同、加密静态与传输数据、最小必要、6 年审计日志隐私规则、安全规则、违规通报
全球(卡组织)PCI-DSS v4.0业务路径上出现 PAN(卡号)暂停录音 / DTMF 屏蔽、CDE 隔离、键盘输入加密、季度扫描卡数据范围最小化、网络分段、年度审计
美国COPPA面向 < 13 岁儿童或明知用户为儿童年龄网关、家长可验证同意、儿童数据隔离父母同意、最小数据、安全保障
巴西LGPD(Lei 13.709/2018)处理巴西居民个人数据DPO、合法性基础、删除权、跨境合同条款与 GDPR 类似,监管机构 ANPD
土耳其KVKK(Kanun 6698)处理土耳其居民个人数据VERBİS 注册、同意、跨境出境批准数据控制者注册、明示同意、出境受限
美国伊利诺伊州BIPA采集生物识别(声纹、面部特征)写入同意书、保留期限、销毁机制私权诉讼,每违规 $1k–5k
美国教育FERPA处理学生教育记录学校书面同意、家长访问权教育记录保密
加拿大PIPEDA / Quebec Law 25处理加拿大居民个人数据同意、披露、跨境通知Quebec 要求加拿大本地化优先
日本APPI处理日本居民个人数据跨境同意、安全管理措施跨境前披露目的国
韩国PIPA处理韩国居民个人数据单独同意、跨境通知、本地代表与 GDPR 类似

3. GDPR 关键工程项

3.1 数据最小化(Art. 5(1)(c))

为什么:监管要求只采集业务必要的数据,多采就是违法。 工程落地

  • WebRTC 默认 getUserMedia({ video: true, audio: true }),要按业务区分 audio-only 场景。
  • 不要把 RTCStatsReport 全量上报埋点 —— 含 IP、SSRC、jitter,属个人数据。
  • 入会 ID 用随机 UUID,不要用手机号 / 身份证拼接。

失败时的样子:日志里全是手机号明文,被监管或集体诉讼按字段计罚。

3.2 被遗忘权(Art. 17)

为什么:用户要求删除,必须能在合理时间内(一般 30 天)从所有副本删除。 工程落地

  • 录音文件按用户 ID 分目录,删除时连 OSS 对象 + CDN 缓存 + 备份磁带都要清。
  • SFU 录制日志、QoE 指标库、ASR 文本库、客服工单系统,全都要建反向索引。
  • 删除请求要落库,留 7 年合规证据。

3.3 DPO(Data Protection Officer)

为什么:核心业务是大规模处理个人数据 / 敏感数据时强制要求。 工程落地:把 DPO 邮箱写进隐私政策、应用 about 页、应用商店描述。

3.4 DPA(Data Processing Agreement)

为什么:业务把数据交给第三方处理(云、TURN 厂商、ASR 厂商、客服 SaaS),双方要签 DPA(Art. 28)。 工程落地:建一份"数据处理者清单"维护在仓库里,每个第三方对应一份 DPA。WebRTC 业务常见的处理者:Twilio / Agora / 声网 / TURN 托管 / OpenAI 转写 / Sentry。

3.5 跨境传输(Art. 44–49)

为什么:欧盟个人数据出境到非充分性认定国(如美国、中国),要走 SCC 标准合同条款 + DPIA + 加密 + 透明度报告。 工程落地

  • TURN / SFU / 录音存储优先选欧盟 region(Frankfurt、Dublin)。
  • 用 EU-US Data Privacy Framework(2023 起)的厂商,记录其认证号。
  • DNS 路由、CDN 边缘节点都要审是不是跨境。

4. PIPL 关键工程项

4.1 个人信息出境安全评估(Art. 38–40)

为什么:CAC 强制要求,超过阈值(处理超 100 万人个人信息、累计向境外提供 10 万人个人信息或 1 万人敏感个人信息)必须做安评。 工程落地

  • 中国境内用户的 TURN / SFU / 录音 / 数据库默认放境内,不让 RTP 包出去。
  • 一定要跨境时,走 CAC 安评 / 标准合同 / 个人信息保护认证三选一。
  • 申报材料里包括:数据类别、跨境路径图、接收方、保存期限、安全措施。

4.2 单独同意(Art. 14、29)

为什么:处理敏感个人信息(生物识别、医疗、金融、未成年)、跨境传输、共享给第三方,都要单独同意,不能裹在隐私政策里。 工程落地

  • 录音 / 录像、声纹识别、活体检测,要独立弹窗 + 单独勾选 + 单独按钮。
  • 同意的时间戳、IP、UA、文案版本号入库 7 年(举证用)。

4.3 本地化存储与关键信息基础设施(CII)

为什么:CII 运营者收集的个人信息和重要数据应当在境内存储。金融、能源、电信、医疗、政务都在 CII 范围内。 工程落地:金融 / 政企客户要求"全栈境内"——SFU、TURN、信令、录音、CDN、监控、Sentry 都要境内。海外侧用独立租户。

4.4 删除权与撤回同意(Art. 15、47)

工程落地:和 GDPR 被遗忘权对齐,但要单独提供"撤回同意"按钮,撤回后业务继续提供基本功能不得拒绝。

5. CCPA / CPRA 关键工程项

5.1 Do Not Sell / Do Not Share

为什么:CPRA 把 "Sale" 扩展到 "Share"(含跨上下文广告)。WebRTC 业务如果接了 RTB 广告 SDK,就触发。 工程落地

  • 隐私政策首页放 "Do Not Sell or Share My Personal Information" 链接(GPC 浏览器信号也要识别)。
  • 用户点击后,关掉广告 SDK 的数据共享开关,写一条审计记录。

5.2 敏感个人信息(SPI)分类

为什么:CPRA 引入 SPI 概念,含精确地理位置、生物识别、通信内容、健康信息。 工程落地

  • WebRTC 通话内容、屏幕共享、上传的医疗影像,都属 SPI。
  • 提供 "Limit Use of My Sensitive Personal Information" 链接。

5.3 12 个月披露义务

工程落地:用户要求"过去 12 个月你拿到我什么数据"时,要导出结构化清单。建议做一个数据导出 API,按 user_id 拉所有索引。

6. HIPAA 关键工程项

6.1 PHI 保护

为什么:医生 - 患者通话、含病历的屏幕共享、ASR 转写文本,都属于 ePHI。 工程落地

  • TLS 1.2+ / SRTP 加密传输(默认就有)。
  • 静态加密 AES-256(云盘默认 KMS)。
  • E2EE 在多方会议里仍然推荐,因为 SFU 节点能看到明文。

6.2 BAA(Business Associate Agreement)

为什么:任何接触 PHI 的供应商都要签 BAA。 工程落地:选 WebRTC PaaS 时只用提供 BAA 的厂商(Twilio Programmable Video、Agora HIPAA 套餐、AWS Chime SDK、Zoom Healthcare)。

6.3 加密、审计日志、最小必要

控制项工程落地
传输加密DTLS-SRTP(强制)+ wss 信令
静态加密KMS + 客户托管密钥(CMK)
访问日志所有 PHI 访问入审计库,6 年保留
最小必要角色权限分级,医助看不到诊断记录
设备认证终端要求 MDM / 屏锁 / 自动登出

7. PCI-DSS 与音视频通话

7.1 触发条件

坐席通过电话 / 视频帮客户下单,客户口播卡号或在共享屏幕里输入卡号 → CDE(Cardholder Data Environment)边界扩展到通话链路。

7.2 暂停录音(Pause-Resume)

为什么:PCI-DSS Req 3.2.1,禁止存储敏感认证数据(CVV、磁条、PIN)。如果整通录音含 CVV,整个录音存储成 CDE,扫描成本爆炸。 工程落地

  • 坐席桌面提供"开始读卡"按钮,触发:
    1. 通知 SFU 暂停 server-side recording。
    2. 通知客户端停止本地缓存。
    3. UI 显示红灯。
  • 读卡完成"恢复录音",写一条 pause/resume 日志。
  • 屏蔽 DTMF 音:让客户用手机键盘输入卡号时,把 DTMF tone 在 SFU 上替换成等长静音 / 单频音,防止后期还原。

7.3 推荐架构:DTMF 解耦

更安全的做法是把卡号采集完全移出语音链路:通话中给客户发短信链接 → 客户在 PCI 合规的支付页面输入卡号 → 坐席只收到 token。这样通话不在 CDE 里。

8. 未成年人保护

8.1 年龄阈值

法规阈值同意方
COPPA(美)<13 岁父母可验证同意
GDPR(欧盟基础)<16 岁(成员国可降到 13)父母同意
PIPL(中)<14 岁监护人同意
LGPD(巴)<12 岁父母同意

8.2 年龄网关(Age Gate)

工程落地

  • 注册时让用户输入出生日期(不要只问"是否成年")。
  • 低于阈值时,跳转家长同意流程:父母邮箱 / 信用卡 micro-charge / 视频签字 / 政府 ID 校验。
  • 儿童账户的数据库物理隔离,不进数据中台 / 推荐系统。

8.3 失败时的样子

  • COPPA 罚 FTC 单次最高 $5 万 / 违规,TikTok、YouTube 都被罚过亿。
  • 儿童摄像头视频被推荐算法用作训练 → 集体诉讼。

9. 录音同意

9.1 单方 vs 双方同意

类型代表地区含义
单方同意(One-Party)美国联邦、纽约、得州、佛州(电话)通话任一方同意即可录
双方同意(Two-Party / All-Party)加州、伊利诺伊、佛州(电子)、宾州、马萨诸塞、华盛顿、欧盟、中国所有参与方都要明示同意

跨州 / 跨国通话取严:只要有一方在双方同意辖区,就按双方同意。

9.2 提示音 + UI 提示

// 录音前的明示同意 UI(React 示例)
function RecordingConsentDialog({ onConsent, onCancel }) {
return (
<Modal title="本次通话将被录音" actions={[
{ text: '同意并继续', primary: true, onClick: () => {
recordConsent({ ts: Date.now(), version: 'v3', userId, ip });
playBeep(440, 800); // 440Hz 提示音 0.8s
onConsent();
}},
{ text: '不同意', onClick: onCancel },
]}>
<p>为了服务质量与争议处理,本次通话音频与视频将被录制并保存 90 天。</p>
<p>录制范围:摄像头画面、麦克风音频、屏幕共享内容。</p>
<p>您可随时通过 [设置 → 隐私] 申请删除。</p>
<p>详情见 <a href="/privacy">隐私政策</a></p>
</Modal>
);
}

通话过程中持续显示红色 REC 标识,对端也要看到。

10. 数据驻留与跨境 TURN

10.1 为什么 TURN 选址是合规问题

TURN 中继时,整个 RTP / RTCP 流经过 TURN 服务器。即使加密,流量元数据(IP、SSRC、码率、时长)也是个人数据。欧盟用户的流量经美国 TURN 中继 = 跨境传输,要走 SCC。

10.2 决策树

10.3 按用户地区动态选 TURN

// Node 信令服务端:根据用户地区下发 TURN
import crypto from 'node:crypto';

const TURN_REGIONS = {
eu: ['turn-fra.example.com', 'turn-dub.example.com'],
cn: ['turn-bj.example.cn', 'turn-sh.example.cn'],
us: ['turn-iad.example.com', 'turn-sfo.example.com'],
apac: ['turn-sg.example.com', 'turn-tyo.example.com'],
};

const REGION_SECRET = {
eu: process.env.TURN_SECRET_EU,
cn: process.env.TURN_SECRET_CN,
us: process.env.TURN_SECRET_US,
apac: process.env.TURN_SECRET_APAC,
};

/**
* 按地区签发短期 TURN 凭据,禁止跨区下发
* @param {string} userId
* @param {'eu'|'cn'|'us'|'apac'} region 经 GeoIP + 用户档案确认
*/
export function issueTurnCredentials(userId, region) {
const hosts = TURN_REGIONS[region];
const secret = REGION_SECRET[region];
if (!hosts || !secret) {
throw new Error(`unsupported region: ${region}`);
}
const ttl = 600;
const username = `${Math.floor(Date.now() / 1000) + ttl}:${userId}`;
const credential = crypto
.createHmac('sha1', secret)
.update(username)
.digest('base64');

return {
iceServers: hosts.map((h) => ({
urls: [`turn:${h}:3478?transport=udp`, `turns:${h}:5349?transport=tcp`],
username,
credential,
})),
region,
expiresAt: Math.floor(Date.now() / 1000) + ttl,
};
}

10.4 失败时的样子

  • 用全球一个 TURN 集群:所有欧盟流量被路由到美国,DPIA 一查就违规。
  • 中国用户被路由到香港 TURN:仍属出境,未做 CAC 安评 = 违规。
  • 路由按 BGP 最近:合规上无法预测数据落点,安评做不了。

11. 医疗行业要点

11.1 HIPAA + 设备认证 + 端到端可审计

维度工程项
接入OAuth + IdP(Okta / Azure AD),强制 MFA
设备MDM 注册、屏锁、加密磁盘、远程擦除
链路DTLS-SRTP + 可选 E2EE(Insertable Streams)
中间盒SFU 私有化 / BAA 厂商
录音KMS 加密 + 客户托管密钥 + 访问审计
留存6 年(HIPAA),按州法可能更长
审计谁在何时看了哪段录像,按 patient_id 可查

欧盟同时落 GDPR + 各国卫生法(德国 BDSG、法国 HDS 认证)。HDS 要求医疗数据托管商持有法国认证。

11.2 反模式

  • 用普通 Zoom(无 BAA)做远程问诊。
  • 病历截图传到 Slack / 通用聊天工具。
  • 录音放在没有客户托管密钥的对象存储。

12. 金融行业要点

12.1 双录(双向录音录像)

中国银保监对人身保险、信托、私募、复杂产品销售强制双录:销售过程全程录音录像,保存 ≥10 年。

工程项:

  • 必填字段:客户身份证、产品代码、销售员工号、风险揭示朗读片段。
  • 文件格式:MP4 H.264 + AAC,关键帧间隔 ≤2s 方便取证。
  • 哈希入链 / 时间戳服务(CFCA、TSA)防篡改。
  • 监管报送接口:按银保监要求按月 / 按季度上传索引。

12.2 电子证据与 PCI-DSS

  • 录音作为电子证据,要满足《电子签名法》和《最高人民法院关于民事诉讼证据的规定》对来源、存储、提取的要求。
  • 涉及卡号场景,按第 7 节 PCI-DSS pause-resume。

13. 教育行业要点

13.1 COPPA + FERPA + 各地未成年人法

法规范围
COPPA<13 岁儿童在线服务
FERPA美国教育记录(成绩、出勤、纪律)
PIPL 第 31 条中国 <14 岁儿童
双减 / 义务教育法学科类校外培训广告、时段限制

13.2 工程项

  • 摄像头默认关闭,老师强开要再次同意。
  • 课堂录像不进推荐 / 训练数据。
  • 家长账号可下载孩子数据、要求删除。
  • 未成年人时段限制(夜间、单次时长)由后端强制,不靠前端。

14. 合规审计清单

14.1 开发前

  • 数据流图:列出每类数据从采集 → 传输 → 存储 → 删除的路径,标注地区。
  • DPIA / PIA:高风险处理(生物识别、儿童、跨境)必做。
  • 第三方清单:每个 SaaS 一份 DPA / BAA / SCC。
  • 隐私设计评审:默认值是隐私友好的(最小权限、最小留存)。

14.2 上线前

  • 同意 UI 评审:文案、版本号、撤回入口、提示音。
  • TURN / SFU 选址 vs 用户地区矩阵已 review。
  • 录音 / E2EE 开关默认值符合行业要求。
  • 删除 API 端到端验证:用户发起删除 → 7 天内核对各副本。
  • 应用商店隐私标签(Apple Privacy Nutrition Label、Google Data Safety)填写一致。
  • 安全评估:渗透测试、TURN 凭据爆破测试、信令重放测试。

14.3 运行中

  • 月度:第三方清单复核、跨境流量复核。
  • 季度:访问审计抽样、删除请求处理时长 SLA。
  • 年度:DPIA 复评、应急演练、PCI 扫描、HIPAA 风险评估。
  • 持续:72h 漏洞通报通道 ready,监管邮件有人响应。

15. 反模式

反模式后果修正
用一个全球 TURN 集群服务所有地区欧盟数据出境无 SCC,PIPL 出境无评估按地区分集群,信令按用户地区下发
把欧盟用户数据存美国GDPR 违规,监管罚款 + 客户合同违约欧盟 region 部署 + EU-US DPF 厂商
不做地理路由,靠 BGP 自然就近数据落点不可预测,安评做不了信令显式按地区签发 ICE
录音不告知 / 不留同意记录GDPR、PIPL、双方同意州违规弹窗 + 提示音 + 同意入库 + REC 标识
TURN 长期凭据写在前端凭据被刷,TURN 当代理用REST API 短期凭据,单用户配额
儿童账户和成人账户共用一个数据库COPPA / PIPL 第 31 条违规物理隔离 + 推荐系统 / 训练库排除
客服读卡号整通录音整段录音落入 CDE,PCI-DSS 范围爆炸pause-resume + DTMF 屏蔽 + 短信收单链路
用普通会议产品做远程问诊无 BAA,HIPAA 违规选医疗版(带 BAA)或私有化部署
用户撤回同意后停止提供基本服务PIPL Art. 16 违规区分必要处理与非必要处理
同意文案藏在 50 页隐私政策第 12 节单独同意不成立单独弹窗 + 单独勾选 + 文案版本号

16. 权威资料