如何暴露“/_metrics”端点并配置 basic_auth 防止泄漏?

解读

在国内金融、政企类 CouchDB 落地项目中,Prometheus 监控已成为合规刚需。
“/_metrics”端点默认不开启,一旦开启就会裸奔暴露集群 QPS、Doc 数量、节点 IP 等敏感信息,因此面试官想考察两点:

  1. 你能否正确启用该端点;
  2. 你能否用 CouchDB 原生机制(而非外挂 Nginx)给它加上 basic_auth,并确保不影响其他端口复用

知识点

  1. prometheus 配置段: CouchDB 3.x 把 stats 接口拆到 prometheus 插件,需显式 [prometheus] additional_port = 17986 才能另启端口。
  2. chttpd/bind_addresshttpd/bind_address 区别: 前者是 5984 的“主” REST 接口,后者是 5986 的“节点本地”接口; metrics 默认挂在 5986,必须改到 5984 才能被 Prometheus 抓取
  3. basic_auth 实现: CouchDB 没有“接口级”鉴权,只能依赖数据库级用户;因此要把 “/_metrics” 当成一个虚拟库,用 require_valid_user = true 强制登录,再为监控账号授予_admin_reader角色即可。
  4. security.jsonlocal.ini 加载顺序: 运行时只读 security.json,重启才读 local.ini;面试时要强调改完配置必须重启节点,否则面试官会认为你不懂 Erlang 热加载限制。
  5. 防火墙 & 内网 DNS: 国内云厂商 5984 常被安全组默认封禁,需提醒“安全组+白名单”双保险,体现运维闭环思维。

答案

  1. 修改 local.ini

    [prometheus]
    ; 启用插件
    additional_port = 17986
    ; 把指标挂到 5984 主端口,方便统一出口
    bind_address = 0.0.0.0
    port = 5984
    ; 只开放 /_metrics 路径
    [httpd_global_handlers]
    _metrics = {couch_prometheus_http, handle_metrics}
    
  2. 创建监控专用账号

    curl -u admin:adminPW -X PUT http://127.0.0.1:5984/_users/org.couchdb.user:monitor \
         -H "Content-Type: application/json" \
         -d '{"name":"monitor","password":"Mon@2025","roles":["_reader"],"type":"user"}'
    
  3. 给“/_metrics”加鉴权
    local.ini 追加

    [chttpd]
    require_valid_user = true
    ; 禁止匿名
    [couch_httpd_auth]
    require_valid_user = true
    ; 强制 basic
    
  4. 重启 CouchDB 服务

    systemctl restart couchdb
    
  5. 验证
    匿名访问应返回 401:

    curl -I http://127.0.0.1:5984/_metrics
    HTTP/1.1 401 Unauthorized
    

    带账号可拿到 Prometheus 格式指标:

    curl -u monitor:Mon@2025 http://127.0.0.1:5984/_metrics
    # HELP couchdb_httpd_request_time_seconds ...
    
  6. 加固

    • 云安全组仅放通公司 Prometheus 服务器 IP 到 5984;
    • 使用 TLS 反向代理(如 caddy)再暴露 443,basic_auth 双重保险;
    • 每季度轮转 monitor 密码,并写入VaultKMS,禁止硬编码在脚本。

拓展思考

  1. 如果客户要求零重启滚动生效,你能用 Erlang RPC 动态加载 prometheus 插件吗?
    答:可以 rpc:call()couch_plugins:enable(prometheus),但bind_address 变动仍需重启,所以面试时建议“重启是生产最稳方案”,体现保守风格。
  2. 多租户场景下,如何给每个租户暴露独立的 /_metrics/:tenant 并隔离 basic_auth?
    答:CouchDB 原生不支持路径级路由,需在外部网关(Kong/Envoy)做路径重写与租户头透传,内部仍用同一套 CouchDB 用户体系,考察你对微服务边车模式的理解。
  3. 国内等保 2.0 要求“审计日志留存 6 个月”,开启 metrics 鉴权后,如何确保每次 401/200 都被记录?
    答:打开 [log] level = info 并配置 rsyslog -> 日志审计系统,同时用 Filebeat 抽 401 事件到 ELK,面试时把“日志不落本地磁盘”说成“Kafka 缓冲+冷热分层”,可瞬间拉高架构分。