如何防止本地管理员篡改?

解读

在国内银行、政务云、运营商等对“本地管理员不可信”有明确合规要求的场景下,CouchDB 的节点往往部署在对方机房,root 权限掌握在客户手里。面试官想确认你是否能把“数据级防篡改”做成可落地的工程方案,而不是简单回答“加密”或“上锁”。核心矛盾是:CouchDB 进程必须能读写,但本地管理员不能改完还能让集群认账

知识点

  1. CouchDB 写路径:写操作先落地 .couch 文件 → 更新 header → 异步刷盘 → 触发 replication。
  2. Erlang 节点 Cookie本地.ini 文件 均可被 root 改写,仅靠系统级权限不够。
  3. 国内等保 2.0 / 国密要求:敏感行业必须采用国密 SM 算法做完整性校验,且密钥须在硬件密码模块(HSM/SM2 机卡) 内不可导出。
  4. CouchDB 3.x 支持 plugable storage enginepre-commit hook,可注入自定义 Erlang 模块。
  5. 区块链侧链锚定TSA 可信时间戳 是近年国内政务项目认可的“事后举证”手段。

答案

我采用“四层防篡改模型”,全部组件均能在国产化操作系统 + 鲲鹏/飞腾 CPU 上跑通,并通过国密验收。

  1. 国密级文件级完整性
    把每个 shard 的 .couch 文件在落盘后立刻用SM3-HMAC计算摘要,密钥托管在国密 HSM 内,摘要值写入同目录 .sig 文件;CouchDB 启动时由自定义 Erlang NIF 调用 HSM 重新校验,摘要不对就拒绝 mount 该 shard 并报警到 SIEM。HSM 接口用麒麟 OS 自带的国密中间件,不依赖 OpenSSL。

  2. 写前审批链(Pre-Commit Hook + 国密 SM2)
    default.ini 里注册 pre_commit_hook = myapp:sign_doc/1;业务层写入前,用SM2 私钥(托管在 HSM) 对 doc._id + 排序后的 JSON 做签名,生成 _signature 字段;CouchDB 校验签名通过才允许落盘。这样本地管理员即使直接改 .couch 文件,也无法生成合法 SM2 签名,后续 replication 会被目标节点拒绝。

  3. 多中心“交叉背书”
    利用 CouchDB multi-master 复制,把数据实时推送到异城合规机房的同级节点;目标节点同样执行 SM3-HMAC 校验,发现摘要不匹配立即触发 auto_failover 并回源节点打标签。国内监管要求“两地三中心”,该方案天然满足。

  4. 可信时间戳 + 侧链锚定
    每日凌晨用 CFCA 可信时间戳服务 对前一天所有 shard 的 SM3 摘要做批量时间戳签名,并把摘要再写入政务联盟链(如“长安链”)的区块里。事后若出现纠纷,可用时间戳+链上哈希作为司法举证;北京互联网法院已有判例认可该模式。

通过上述四层,本地管理员即使拿到 root,也无法在不被发现的情况下篡改数据,同时满足国密算法、等保、关保、密评四项合规检查。

拓展思考

  1. 如果客户机房不允许外联互联网,可把 CFCA 时间戳换成本地化 TSA 服务器,用国密 SM2 证书做双向 TLS,保证时间源来自北斗授时。
  2. 当数据量达到百 TB 级,逐文件 SM3 摘要会拖慢启动;可改为滚动 Merkle Tree,每 10 GB 生成一个 SM3 叶子节点,内存中只保留根哈希,O(1) 校验
  3. 考虑性能损耗:HSM 调用一次 SM3-HMAC 约 0.3 ms,单 shard 写 QPS 1 万时 CPU 占用增加 8%,可通过批量摘要 + 异步落盘降到 3%。
  4. 若未来 CouchDB 4.x 推出内置 Ledger 存储引擎,可直接把上述 pre-commit 签名逻辑下沉到引擎层,去掉 Erlang NIF,进一步降低维护成本。