当用户行使“被遗忘权”时,如何安全 purge 并保留审计轨迹?
解读
国内《个人信息保护法》第47条明确“删除权”,要求彻底不可恢复且全程可审计。CouchDB 的 MVCC 机制让旧版文档“标记删除”后仍留于磁盘,仅靠 DELETE /db/docid 无法满足合规。因此面试考点是:
- 如何在多节点、多副本环境下物理清除数据;
- 如何同步生成不可篡改的审计证据;
- 如何兼顾业务连续性与性能。
知识点
- _purge 接口:真正的物理清除,生成 purge_seq,不复制到下游,需在每个节点单独执行。
- _changes?style=all_docs&include_purged=true:可拉取 purge 事件,用于审计。
- local purge_request 文档:在本地库记录“谁、何时、为何、哪些 revs”需 purge,作为审计根。
- 哈希链式日志:将每次 purge 的摘要(docid+revs+操作人+时间戳+法律依据)写入只增的 audit 数据库,并用 HMAC-SHA256 计算上一笔哈希,形成链式完整性。
- 三权分立:应用层调用 purge 前,由隐私合规系统审批;CouchDB 管理员仅执行;审计日志由安全团队只读保管。
- 灰度与限速:对热点库采用 batch_size=100、interval=500 ms 的限速 purge,避免触发全库压缩风暴。
- 国密算法:若客户为金融或政务,需把 HMAC 替换为 SM3-HMAC,满足信创要求。
- 跨省多活:若集群跨可用区,需在每个区先写分布式锁(借助 etcd/ZK),保证同一文档同一时刻仅一个节点执行 purge,防止并发冲突。
答案
- 合规审批:业务系统携带“用户身份证号+法律依据”调用隐私中台,中台返回一次性 token 与准许 purge 的 rev 列表。
- 生成指令:应用节点在本地 audit 库写入 purge_request 文档,包含 token、操作人、时间、理由、目标 revs,并计算上一笔日志的哈希,形成链。
- 执行 purge:携带 token 调用 POST /db/_purge,payload 仅含准许的 revs;CouchDB 返回 purged 计数与新的 purge_seq。
- 固化证据:将返回的 purge_seq、执行节点 IP、耗时、错误码追加到 audit 库,再次计算哈希并签名。
- 多节点同步:通过 内部工单系统 通知其他节点管理员,在 24 小时内重复步骤 3,确保所有副本都已物理清除。
- 报告回执:隐私中台回调用户“已完成删除”,并返回审计编号,用户可通过编号在 15 日内下载加盖电子签章的删除报告。
- 定期验真:安全团队每月随机抽取 5% 已 purge 文档,用 dbcopy+xxd 做磁盘级十六进制扫描,确认无残留,结果写入年度合规报告。
拓展思考
- 边缘场景:若文档正被复制到离线终端,需在 purge 前先推送 _rev 黑名单到同步网关,让终端本地 purge,否则离线端恢复网络后会回灌已删数据。
- 版本升级:CouchDB 4.x 将支持 global purge,可一次性在集群层面标记 purge,无需逐节点执行,但审计逻辑不变,仍需本地写日志以防 global purge 失败。
- 性能调优:对 10 亿级文档库,可先用 view 过滤出待 purge 的 docid 列表,再按分片并发调用 _purge,避免全表扫描;同时把 compaction_daemon 的
checkpoint_interval调到 10 分钟,降低 IO 抖动。 - 法律冲突:若同一文档涉及刑事侦查冻结,需在 purge 前检查执法机关白名单;如已冻结,则暂停 purge 并返回 423 Locked,审计库记录“法定留存”理由,确保删除权与司法权不冲突。