Prometheus 监控 Vault 全栈实战:从密钥引擎到解封状态的密钥管理可观测性
HashiCorp Vault 是基础设施安全的基石,负责保护密钥、证书、令牌等机密数据。一旦它的解封状态异常、令牌创建失败、存储后端延迟飙升、请求限流或高可用节点失联,整个服务网格和应用都将面临认证中断或机密泄露风险。Vault 从设计之初就原生内置了 Prometheus 指标端点(通过 Telemetry),只需简单配置即可暴露集群状态、令牌、存储、请求、审计等全方位指标。本文将带你从开启 Telemetry、配置抓取,到解读核心指标、构建 Grafana 大屏与告警落地,为 Vault 自身构建坚不可摧的可观测防线。
1. 为什么 Vault 原生 Telemetry 是最佳方案?
- 零额外组件:Vault 服务器自启动就支持暴露
/v1/sys/metrics端点,格式可选 Prometheus,无需导出器。 - 全面覆盖:解封状态、令牌操作、存储后端延迟、请求速率、审计日志、高可用集群状态等,应有尽有。
- 性能友好:内部通过统计库聚合,抓取开销极低。
- 安全受控:可通过 Vault 的 ACL 策略控制访问 metrics 端点,最小权限。
2. 开启 Vault Telemetry 并暴露 Prometheus 指标
2.1 配置 Vault 配置文件
编辑 Vault 的配置文件(通常为/etc/vault.d/vault.hcl),添加或修改telemetry块:
telemetry { prometheus_retention_time = "60s" disable_hostname = true enable_hostname_label = true } # 确保 API 启用 api_addr = "http://vault.example.com:8200" cluster_addr = "https://vault-cluster.example.com:8201"如果不希望暴露主机指标,可关闭enable_host_metrics = false。重启 Vault 后,Prometheus 格式指标可通过标准 API 路径获取。
2.2 验证端点
curlhttp://vault.example.com:8200/v1/sys/metrics?format=prometheus你将看到以vault_开头的海量指标,如vault_core_unsealed、vault_token_create_total等。
注意:路径中的?format=prometheus参数必须携带,否则默认返回 JSON。
2.3 权限控制
Metrics 端点受 Vault ACL 保护。生产环境中,应创建一个只读策略的令牌供 Prometheus 使用。
# policy: prometheus-metrics path "sys/metrics" { capabilities = ["read"] }使用该策略生成一个 Token,Prometheus 抓取时需携带此 Token。
3. 配置 Prometheus 抓取
3.1 使用 Token 的静态配置
scrape_configs:-job_name:'vault'scrape_interval:30smetrics_path:'/v1/sys/metrics'params:format:['prometheus']bearer_token_file:'/etc/prometheus/vault_token'static_configs:-targets:-'vault-node1:8200'-'vault-node2:8200'-'vault-node3:8200'labels:env:'production'cluster:'vault-prod'若 Vault 启用 TLS,需配置scheme: https及tls_config。
3.2 未启用 ACL 的简单抓取(仅开发环境)
直接抓取,不携带 Token。
4. 核心监控指标与 PromQL
Vault 暴露的指标以vault_为前缀,涵盖核心状态、令牌、存储、请求、审计、高可用等类别。
4.1 核心状态与解封
| 指标 | 含义 |
|---|---|
vault_core_unsealed | 是否已解封(1=是, 0=否) |
vault_core_sealed | 是否已封(与 unsealed 相反) |
vault_core_active | 当前节点是否为 Active(1=是, 0=Standby) |
vault_core_leadership_setup_failed | 领导设置失败次数 |
PromQL 示例:
- 存在封节点:
vault_core_sealed == 1 - 没有 Active 节点:
sum(vault_core_active) == 0 - 领导切换:
rate(vault_core_leadership_setup_failed[5m]) > 0
4.2 令牌操作
| 指标 | 含义 |
|---|---|
vault_token_create_total | 令牌创建总数 |
vault_token_lookup_total | 令牌查阅总数 |
vault_token_revoke_total | 令牌吊销总数 |
vault_token_store_count | 当前令牌存储数 |
PromQL 示例:
- 令牌创建速率:
rate(vault_token_create_total[5m]) - 令牌吊销速率异常:
rate(vault_token_revoke_total[5m])过大可能预示安全问题。
4.3 存储后端
| 指标 | 含义 |
|---|---|
vault_storage_put_total | 存储写入操作总数 |
vault_storage_get_total | 存储读取操作总数 |
vault_storage_delete_total | 存储删除操作总数 |
vault_storage_operation_duration_seconds(Histogram) | 存储操作延迟分布 |
PromQL 示例:
- 存储写入延迟 P99:
histogram_quantile(0.99, rate(vault_storage_operation_duration_seconds_bucket[5m])) - 存储操作错误率(若指标有 status 标签):
rate(vault_storage_put_total{status="error"}[5m])
4.4 请求与 HTTP
| 指标 | 含义 |
|---|---|
vault_request_count | 请求总数(按namespace,method,path分) |
vault_request_duration_seconds(Histogram) | 请求处理延迟分布 |
vault_request_error_total | 请求错误总数 |
vault_core_handle_request_total | 已处理的 API 请求总数 |
PromQL 示例:
- API QPS:
rate(vault_request_count[5m]) - API P99 延迟:
histogram_quantile(0.99, rate(vault_request_duration_seconds_bucket[5m])) - 错误率:
rate(vault_request_error_total[5m])
4.5 审计
| 指标 | 含义 |
|---|---|
vault_audit_log_write_total | 审计日志写入总数 |
vault_audit_log_write_duration_seconds(Histogram) | 审计日志写入延迟 |
vault_audit_log_failure_total | 审计日志写入失败数 |
PromQL 示例:
- 审计写入失败:
rate(vault_audit_log_failure_total[5m]) > 0应立即告警,可能导致合规问题。
4.6 高可用集群
| 指标 | 含义 |
|---|---|
vault_ha_autopilot_failure_total | Autopilot 故障次数 |
vault_ha_autopilot_healthy | Autopilot 是否健康(1=是) |
vault_ha_replication_failure_total | 复制失败次数 |
PromQL 示例:
- Autopilot 不健康:
vault_ha_autopilot_healthy == 0 - 复制失败:
rate(vault_ha_replication_failure_total[5m]) > 0
4.7 运行时与 Go
标准go_*和process_*指标监控内存、goroutine、文件描述符等。
5. Grafana 仪表盘推荐
- Vault Metrics Dashboard (Prometheus):Dashboard ID11055(社区精品),展示解封状态、令牌操作、存储延迟、请求 QPS、审计状态等。
- HashiCorp Vault:ID12019,更现代,包含高可用和 Autopilot。
- 自定义仪表盘:使用 Stat Panel 显示 Active/Standby 状态,时间序列展示 API 延迟和错误率,表格列出节点状态。
导入后选择数据源,变量instance、cluster区分不同 Vault 集群。
6. 告警规则实战
groups:-name:vault_alertsrules:-alert:VaultSealedexpr:vault_core_sealed == 1for:1mlabels:severity:criticalannotations:summary:"Vault 节点 {{ $labels.instance }} 处于封状态,需要解封"-alert:VaultNoActiveNodeexpr:sum(vault_core_active) == 0for:1mlabels:severity:criticalannotations:summary:"Vault 集群没有 Active 节点,服务完全不可用"-alert:VaultHighRequestLatencyexpr:histogram_quantile(0.99,rate(vault_request_duration_seconds_bucket[5m]))>2for:5mlabels:severity:warningannotations:summary:"Vault API P99 延迟超过 2 秒"-alert:VaultHighErrorRateexpr:rate(vault_request_error_total[5m])>0.05for:5mlabels:severity:criticalannotations:summary:"Vault 请求错误率 > 0.05/s"-alert:VaultStorageHighLatencyexpr:histogram_quantile(0.99,rate(vault_storage_operation_duration_seconds_bucket[5m]))>0.5for:10mlabels:severity:warningannotations:summary:"Vault 存储后端写入延迟超过 500ms"-alert:VaultAuditLogFailureexpr:rate(vault_audit_log_failure_total[5m])>0labels:severity:criticalannotations:summary:"Vault 审计日志写入失败,可能违反合规要求"-alert:VaultHAFailureexpr:vault_ha_autopilot_healthy == 0for:5mlabels:severity:criticalannotations:summary:"Vault Autopilot 不健康,高可用可能失效"-alert:VaultNodeDownexpr:up{job="vault"}== 0for:1mlabels:severity:criticalannotations:summary:"Vault 节点 {{ $labels.instance }} 不可达"7. 进阶:多集群、安全与性能调优
7.1 多集群监控
每个 Vault 集群独立配置 Prometheus 抓取,通过cluster标签区分。在 Grafana 中通过变量切换。对于跨数据中心的 Vault Enterprise Replication,需要监控vault_ha_replication_failure_total等指标。
7.2 安全最小权限
Prometheus 使用的 Token 应仅绑定prometheus-metrics策略,且最好设置合理的 TTL 或定期轮换。可通过 Vault 的 AppRole 或 Kubernetes Auth 方法动态获取 Token,避免硬编码。
7.3 指标基数管理
Vault 会为每个path标签生成时间序列,若路径较多(如动态密钥),基数可能增大。可在 Prometheus 中使用metric_relabel_configs丢弃不关心的路径或方法标签。
7.4 结合 Vault 审计日志
Prometheus 监控指标异常时(如错误率激增),可结合 Vault 的审计日志(通常输出到文件或 Syslog)进行深入排查。还可将审计日志发送到 Loki,在 Grafana 中实现指标到日志的关联。
8. 总结
通过 Vault 原生的 Prometheus Telemetry,密钥管理平台自身的健康不再是一团迷雾。从解封状态到令牌创建,从存储延迟到审计失败,每一个关键信号都实时流入 Prometheus,在 Grafana 中可视化,并通过 Alertmanager 发出告警。将 Vault 纳入全栈可观测性体系,意味着基础设施安全的“安全之锁”本身也具备了自我审视能力,确保每一次机密访问都可靠、可控。部署它,让秘密管理真正成为最可信赖的基石。