如何审计?
解读
在国内金融、政务、医疗等合规场景下,审计不仅是“事后查账”,更是等保 2.0、关基、密评的硬性要求。面试官问“如何审计”,既考察你对 CouchDB 内置机制的理解,也考察你是否能把开源特性与国内监管要求对接,给出可落地的闭环方案。回答时要体现“事前可预警、事中可阻断、事后可追溯”的完整思路,而不是简单罗列日志文件。
知识点
- CouchDB 审计维度:身份鉴别、授权、访问、数据变更、配置变更、复制行为、安全事件。
- 日志体系:
- /var/log/couchdb/couchdb.log(默认)
- audit.log(需开启
couchdb@audit通道) - access.log(nginx 反向代理层,记录真实客户端 IP)
- 日志级别与通道:
info、warning、error、debug;couch_log模块支持自定义通道输出到 syslog/rsyslog,对接 ELK/ClickHouse/麒麟审计中心。 - 事件类型与字段:
db_created/db_deleteddoc_read/doc_write(含_id、_rev、用户、IP、时间戳、状态码)security_object_changed(权限表变更)admin_changed(_users库内管理员增删)
- 敏感命令:
_config、/_restart、/_replicate、/_compact、/_view_cleanup必须 100% 审计。 - 国内合规增强:
- 国密 TLS(GMTLS 1.1)通道加密,避免日志明文泄露。
- 三权分立:审计员仅授予
/_log只读权限,禁止/_config。 - 日志防篡改:使用
chattr +a追加属性 + rsyslog imfile + logrotate + SHA-256 摘要 写入 WORM 存储。 - 等保 2.0 三级要求:审计记录保存 ≥ 6 个月,关键操作 ≤ 1 分钟告警。
- 实时告警:
- couchdb-exporter + Prometheus + Alertmanager 采集
couchdb_httpd_4xx_total、couchdb_httpd_5xx_total异常。 - Elk Rule:
event.action:security_object_changed AND user.name NOT IN (whitelist)触发钉钉/企业微信。
- couchdb-exporter + Prometheus + Alertmanager 采集
- 离线分析:
- Map-Reduce 视图 对
audit库二次聚合,统计高频异常 IP。 - Python couchdb-audit-tool 批量导出 JSON,对接 麒麟审计报表模板 一键生成等保测评证据包。
- Map-Reduce 视图 对
答案
线上生产环境采用“四层审计模型”:
- 接入层:nginx 统一反向代理,开启
proxy_protocol获取真实源 IP,日志格式增加$request_time、$upstream_response_time,方便后续溯源慢查询。 - CouchDB 层:
- 在 local.ini 追加
重启后所有 doc_read、doc_write、security_object_changed 事件自动写入 audit.log。[log] level = info include_sasl = true [audit] log_write = true log_read = true log_security = true - 对 admin 类操作启用 require_valid_user,禁止匿名访问
/_config。
- 在 local.ini 追加
- 日志汇聚层:
- rsyslog 使用
imfile模块采集audit.log,通过 OMKafka 写入公司统一 Kafka 集群,Topic 命名规则couchdb-audit-{env}。 - 同时本地 logrotate 每日切割,保留 180 天,文件名加
.gcry后缀,由 国密 SM3 计算摘要后写入 WORM 光盘库。
- rsyslog 使用
- 分析与告警层:
- Flink 实时流 解析 JSON,规则:同一用户 5 分钟内
doc_write失败 ≥ 30 次 → 触发 SOC 工单。 - ClickHouse 离线表 按
date, db, user, ip聚合,月初自动生成 等保测评报告(含峰值 QPS、异常率、TOP10 风险账号)。 - 审计员通过 Grafana 查看面板,只读账号 禁止修改任何配置,满足三权分立。
- Flink 实时流 解析 JSON,规则:同一用户 5 分钟内
通过以上闭环,即可在零业务侵入的前提下,实现秒级告警、分钟级定位、月度合规输出,一次性通过等保三级、关基检查、密评现场测评。
拓展思考
- 如果 CouchDB 部署在资源受限的边缘盒子(如麒麟嵌入式 ARM),无法跑 ELK,如何用 SQLite + cron 实现轻量级离线审计?
- 当数据库启用端到端加密(E2EE) 后,审计日志只能看到密文
_id,如何在不泄露密钥的前提下,仍能对敏感字段变更做内容级审计? - 国内出现“数据跨境传输”新规,CouchDB 的双向同步可能把日志复制到海外节点,如何基于 _replicator 过滤函数 实现“审计数据不出境”?