如何审计?

解读

在国内金融、政务、医疗等合规场景下,审计不仅是“事后查账”,更是等保 2.0、关基、密评的硬性要求。面试官问“如何审计”,既考察你对 CouchDB 内置机制的理解,也考察你是否能把开源特性国内监管要求对接,给出可落地的闭环方案。回答时要体现“事前可预警、事中可阻断、事后可追溯”的完整思路,而不是简单罗列日志文件。

知识点

  1. CouchDB 审计维度:身份鉴别、授权、访问、数据变更、配置变更、复制行为、安全事件。
  2. 日志体系
    • /var/log/couchdb/couchdb.log(默认)
    • audit.log(需开启 couchdb@audit 通道)
    • access.log(nginx 反向代理层,记录真实客户端 IP)
  3. 日志级别与通道infowarningerrordebugcouch_log 模块支持自定义通道输出到 syslog/rsyslog,对接 ELK/ClickHouse/麒麟审计中心
  4. 事件类型与字段
    • db_created / db_deleted
    • doc_read / doc_write(含 _id_rev、用户、IP、时间戳、状态码)
    • security_object_changed(权限表变更)
    • admin_changed_users 库内管理员增删)
  5. 敏感命令_config/_restart/_replicate/_compact/_view_cleanup 必须 100% 审计。
  6. 国内合规增强
    • 国密 TLS(GMTLS 1.1)通道加密,避免日志明文泄露。
    • 三权分立:审计员仅授予 /_log 只读权限,禁止 /_config
    • 日志防篡改:使用 chattr +a 追加属性 + rsyslog imfile + logrotate + SHA-256 摘要 写入 WORM 存储。
    • 等保 2.0 三级要求:审计记录保存 ≥ 6 个月,关键操作 ≤ 1 分钟告警。
  7. 实时告警
    • couchdb-exporter + Prometheus + Alertmanager 采集 couchdb_httpd_4xx_totalcouchdb_httpd_5xx_total 异常。
    • Elk Ruleevent.action:security_object_changed AND user.name NOT IN (whitelist) 触发钉钉/企业微信。
  8. 离线分析
    • Map-Reduce 视图audit 库二次聚合,统计高频异常 IP。
    • Python couchdb-audit-tool 批量导出 JSON,对接 麒麟审计报表模板 一键生成等保测评证据包。

答案

线上生产环境采用“四层审计模型”:

  1. 接入层:nginx 统一反向代理,开启 proxy_protocol 获取真实源 IP,日志格式增加 $request_time$upstream_response_time,方便后续溯源慢查询。
  2. CouchDB 层
    • local.ini 追加
      [log]
      level = info
      include_sasl = true
      [audit]
      log_write = true
      log_read = true
      log_security = true
      
      重启后所有 doc_read、doc_write、security_object_changed 事件自动写入 audit.log
    • admin 类操作启用 require_valid_user,禁止匿名访问 /_config
  3. 日志汇聚层
    • rsyslog 使用 imfile 模块采集 audit.log,通过 OMKafka 写入公司统一 Kafka 集群,Topic 命名规则 couchdb-audit-{env}
    • 同时本地 logrotate 每日切割,保留 180 天,文件名加 .gcry 后缀,由 国密 SM3 计算摘要后写入 WORM 光盘库
  4. 分析与告警层
    • Flink 实时流 解析 JSON,规则:同一用户 5 分钟内 doc_write 失败 ≥ 30 次 → 触发 SOC 工单
    • ClickHouse 离线表date, db, user, ip 聚合,月初自动生成 等保测评报告(含峰值 QPS、异常率、TOP10 风险账号)。
    • 审计员通过 Grafana 查看面板,只读账号 禁止修改任何配置,满足三权分立

通过以上闭环,即可在零业务侵入的前提下,实现秒级告警、分钟级定位、月度合规输出,一次性通过等保三级、关基检查、密评现场测评

拓展思考

  1. 如果 CouchDB 部署在资源受限的边缘盒子(如麒麟嵌入式 ARM),无法跑 ELK,如何用 SQLite + cron 实现轻量级离线审计?
  2. 当数据库启用端到端加密(E2EE) 后,审计日志只能看到密文 _id,如何在不泄露密钥的前提下,仍能对敏感字段变更做内容级审计?
  3. 国内出现“数据跨境传输”新规,CouchDB 的双向同步可能把日志复制到海外节点,如何基于 _replicator 过滤函数 实现“审计数据不出境”?