如何配置“三权分立”:安全员、审计员、管理员角色?
解读
国内金融、政务、运营商等关键行业普遍要求“三权分立”——安全员负责最小权限授权、审计员只读全量日志、管理员只能运维不能看数据。CouchDB 原生只有“_admin”超级角色,因此必须通过自定义角色 + 数据库级权限 + 视图隔离 + 独立日志通道四步落地,才能满足等保 2.0 与行业合规审计的刚性要求。
知识点
-
CouchDB 角色体系:
- 系统级:
_admin(超级用户,绕开所有校验) - 数据库级:
members(可读)、admins(可写可设计) - 自定义角色:在
users文档的roles数组中任意扩展,如sec_officer、auditor、ops_admin
- 系统级:
-
验证函数钩子:
validate_doc_update在每次写操作时触发,可强制校验角色组合,拒绝“越权写”。 -
设计文档访问控制:
视图、列表、显示函数均运行在 CouchDB 内部,可基于req.userCtx.roles动态过滤行级数据,实现“同级只能看同级”。 -
审计日志外送:
CouchDB 默认日志写本地文件,无字段级解析。需开启audit插件或外挂 Logstash + Filebeat 到国密算法加固的 Kafka 审计通道,确保 WORM(一次写多次读) 存储。 -
国产密码合规:
传输层必须启用 TLS 1.3 + 国密双证书(SM2 签名 + SM4 加密),关闭 TLS 重协商与弱算法套件。
答案
步骤一:创建三权角色
在 _users 数据库分别插入三份用户文档,禁用 _admin 角色,示例:
{
"_id": "org.couchdb.user:sec_user",
"name": "sec_user",
"password": "国密SM4加密后的口令",
"roles": ["sec_officer"],
"type": "user"
}
同理创建 auditor、ops_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 字段实现 数据标签化。
步骤四:审计日志独立
- 在
local.ini新增:[audit] enable = true level = info filter = /_session|_db_updates|_changes/ - 日志落盘路径挂载 国密加密盘(dm-crypt + SM4-XTS),权限 600,属主
couchdb:audit。 - 使用 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% 触发告警;审计员 出具合规报告,管理员 负责整改回滚。
拓展思考
-
动态令牌:
在validate_doc_update中调用外部 国密 OTP 服务,实现“一次操作一次令牌”,防止管理员长期凭据泄露。 -
多租户场景:
对每条文档加入tenant字段,结合 sub-database + sub-security 模式,为不同租户生成独立sec_officer,避免跨租户授权。 -
离线同步合规:
移动端 PouchDB 同步到 CouchDB 时,需在 本地加密沙箱(国密 SM4-GCM) 存储,同步通道走 国密 TLS 1.3,并在/_replicator文档中加入security_officer审批字段,未审批拒绝拉取。 -
灾备三权:
跨机房集群再引入 灾备审计员 角色,仅对_scheduler/docs有读权限,确保 灾备演练 不越权操作生产数据。