如何配置“三权分立”:安全员、审计员、管理员角色?

解读

国内金融、政务、运营商等关键行业普遍要求“三权分立”——安全员负责最小权限授权、审计员只读全量日志、管理员只能运维不能看数据。CouchDB 原生只有“_admin”超级角色,因此必须通过自定义角色 + 数据库级权限 + 视图隔离 + 独立日志通道四步落地,才能满足等保 2.0 与行业合规审计的刚性要求。

知识点

  1. CouchDB 角色体系

    • 系统级:_admin(超级用户,绕开所有校验)
    • 数据库级:members(可读)、admins(可写可设计)
    • 自定义角色:在 users 文档的 roles 数组中任意扩展,如 sec_officerauditorops_admin
  2. 验证函数钩子
    validate_doc_update 在每次写操作时触发,可强制校验角色组合,拒绝“越权写”。

  3. 设计文档访问控制
    视图、列表、显示函数均运行在 CouchDB 内部,可基于 req.userCtx.roles 动态过滤行级数据,实现“同级只能看同级”。

  4. 审计日志外送
    CouchDB 默认日志写本地文件,无字段级解析。需开启 audit 插件或外挂 Logstash + Filebeat 到国密算法加固的 Kafka 审计通道,确保 WORM(一次写多次读) 存储。

  5. 国产密码合规
    传输层必须启用 TLS 1.3 + 国密双证书(SM2 签名 + SM4 加密),关闭 TLS 重协商与弱算法套件。

答案

步骤一:创建三权角色
_users 数据库分别插入三份用户文档,禁用 _admin 角色,示例:

{
  "_id": "org.couchdb.user:sec_user",
  "name": "sec_user",
  "password": "国密SM4加密后的口令",
  "roles": ["sec_officer"],
  "type": "user"
}

同理创建 auditorops_admin

步骤二:数据库级 ACL
对业务库 finance_security 文档设置:

{
  "admins": {
    "names": [],
    "roles": ["ops_admin"]
  },
  "members": {
    "names": [],
    "roles": ["sec_officer","auditor"]
  }
}

解释:ops_admin 可建删视图但不能读业务数据;auditor 仅只读;sec_officer 负责把需要访问的人员临时加入 names 数组,实现“最小权限即时回收”。

步骤三:行级敏感数据隔离
在设计文档 _design/security 中写入 validate_doc_update

function(newDoc, oldDoc, userCtx){
  if((userCtx.roles.indexOf('auditor')!==-1)&&!newDoc._deleted){
     throw({forbidden:'审计员禁止写'});}
  if((userCtx.roles.indexOf('sec_officer')===-1)&&
     (userCtx.roles.indexOf('ops_admin')===-1)&&
     (newDoc.securityLevel==='topSecret')){
     throw({forbidden:'非安全员不得读写绝密字段'});}
}

通过 securityLevel 字段实现 数据标签化

步骤四:审计日志独立

  1. local.ini 新增:
    [audit]
    enable = true
    level = info
    filter = /_session|_db_updates|_changes/
    
  2. 日志落盘路径挂载 国密加密盘(dm-crypt + SM4-XTS),权限 600,属主 couchdb:audit
  3. 使用 Rsyslog omkafka 把日志实时推送到 国密 TLS 加密 Kafka 集群,主题 couchdb-audit,消费端对接 ELK 或国内合规 SIEM

步骤五:运维通道隔离

  • 管理员 ops_admin 仅开放 5984 端口只读 _node 接口_stats_system),禁止访问 /_users 与业务库。
  • 安全员 sec_officer 通过 VPN + 堡垒机 + 国密 USBKey 双因子 登录 6984 管理端口,进行授权操作。
  • 审计员 auditor 仅开放 只读 5986 端口 查看 _log_changes 接口,禁止带参数写

步骤六:定期复核
每季度由 安全员 导出 _users 与所有 _security 文档,生成 MD5-SM3 混合哈希,与上一周期对比,差异大于 5% 触发告警;审计员 出具合规报告,管理员 负责整改回滚。

拓展思考

  1. 动态令牌
    validate_doc_update 中调用外部 国密 OTP 服务,实现“一次操作一次令牌”,防止管理员长期凭据泄露。

  2. 多租户场景
    对每条文档加入 tenant 字段,结合 sub-database + sub-security 模式,为不同租户生成独立 sec_officer,避免跨租户授权。

  3. 离线同步合规
    移动端 PouchDB 同步到 CouchDB 时,需在 本地加密沙箱(国密 SM4-GCM) 存储,同步通道走 国密 TLS 1.3,并在 /_replicator 文档中加入 security_officer 审批字段,未审批拒绝拉取

  4. 灾备三权
    跨机房集群再引入 灾备审计员 角色,仅对 _scheduler/docs 有读权限,确保 灾备演练 不越权操作生产数据。