3. Prometheus 原生认证机制:基础配置

Prometheus 在默认安装后,其 HTTP 服务并未启用任何认证或授权机制。任何能够访问该端口的客户端都可以直接查询指标、读取配置甚至触发重载。在生产环境中,必须通过原生启动参数对监听地址、外部访问路径和路由前缀进行基础加固,这是构建安全采集作业平台的第一步。

3.1 核心启动参数概览

Prometheus Server 通过以下三个命令行参数控制其 HTTP 服务的基础网络暴露面与路由结构:

参数名 默认值 作用域 安全意义
--web.listen-address 0.0.0.0:9090 TCP 监听地址与端口 限制绑定 IP,避免暴露在非必要网络接口
--web.external-url 基于请求 Host 自动推导 外部可访问的完整 URL 防止反向代理下的 URL 劫持与重定向泄露
--web.route-prefix / Web 路由挂载前缀 隔离 API 路径,配合反向代理实现路径级访问控制
安全基线建议: 即使后续会叠加反向代理或认证代理,也应当始终显式设置这三个参数,避免依赖默认值带来的意外暴露风险。

3.2 --web.listen-address:绑定地址与端口隔离

该参数决定 Prometheus HTTP 服务在哪个网络接口和端口上监听。默认监听 0.0.0.0:9090 意味着所有网络接口(包括公网)均可访问。

安全配置原则

  • 仅监听回环地址: 如果 Prometheus 与采集目标在同一主机,或仅通过本地反向代理转发,应设置为 127.0.0.1:9090,彻底阻断外部直接访问。
  • 绑定内网专用接口: 若需跨主机访问,应绑定内网 IP(如 10.0.1.100:9090),避免绑定 0.0.0.0。
  • 端口非标化: 将默认 9090 端口改为非标准高位端口(如 19090),可降低自动化扫描工具的命中概率。
# 安全示例:仅监听本地回环,使用非标端口
./prometheus --web.listen-address=127.0.0.1:19090

3.3 --web.external-url:外部访问 URL 的显式声明

当 Prometheus 部署在反向代理(Nginx、HAProxy)或负载均衡后方时,客户端实际访问的 URL 与 Prometheus 内部感知的 URL 可能不一致。该参数用于显式声明外部可访问的完整 URL,影响以下行为:

  • 生成的重定向 Location 头(如 /graph 页面跳转)。
  • 返回的 API 响应中的链接(如 /api/v1/targets 的 self 字段)。
  • OAuth2 回调地址的构造。

配置示例

# 假设外部通过 https://prometheus.example.com/prom 访问
./prometheus \
  --web.external-url=https://prometheus.example.com/prom \
  --web.route-prefix=/prom
常见错误: 不设置 --web.external-url 时,Prometheus 会尝试从 HTTP 请求的 Host 头推导外部 URL。如果反向代理未正确传递 Host 头,可能导致重定向到内部地址或错误的端口,造成功能异常甚至信息泄露。

3.4 --web.route-prefix:路由前缀与路径隔离

该参数为 Prometheus 的所有 HTTP 路由(API、UI、静态资源)添加统一前缀。默认值为 /,即无前缀。设置非空前缀后,所有端点变为 /prefix/api/v1/...、/prefix/graph 等。

典型用途

  • 多服务共用一个域名: 通过反向代理将不同路径转发到不同后端,如 /prom 指向 Prometheus,/grafana 指向 Grafana。
  • 路径级访问控制: 在反向代理层对 /prom 前缀统一施加认证或 IP 白名单,无需逐个端点配置。
  • 隐藏真实路径结构: 使用非预期前缀(如 /internal-metrics)增加攻击者路径探测难度。
# 设置路由前缀为 /monitor/prometheus
./prometheus \
  --web.route-prefix=/monitor/prometheus \
  --web.external-url=https://ops.example.com/monitor/prometheus

3.5 三参数协同关系与典型部署拓扑

下图展示了三个参数在典型反向代理部署模式下的协同工作方式:

三参数协同:反向代理部署拓扑 外部客户端 反向代理 (Nginx) Prometheus Server 反向代理配置 • 监听 443 端口,SSL 终止 • 路径 /prom → proxy_pass http://127.0.0.1:19090 • 设置 Host 头为 external-url 值 Prometheus 启动参数 --web.listen-address=127.0.0.1:19090 --web.external-url=https://example.com/prom --web.route-prefix=/prom 请求处理流程 1. 客户端请求:https://example.com/prom/api/v1/targets 2. 反向代理剥离 /prom 前缀,转发到:http://127.0.0.1:19090/api/v1/targets 3. Prometheus 根据 route-prefix=/prom 匹配路由,返回正确响应

3.6 参数配置清单与验证方法

以下清单可用于生产环境部署前的安全检查:

检查项 命令/方法 期望结果
监听地址确认 ss -tlnp | grep prometheus 显示绑定的 IP 和端口,非 0.0.0.0
外部 URL 生效 访问 /api/v1/status/config 检查 externalURL 字段 值与 --web.external-url 一致
路由前缀生效 访问 /prefix/-/ready 返回 200 直接访问 /-/ready 返回 404
重定向正确性 访问 /prefix/ 观察 Location 头 重定向到 external-url/prefix/graph
生产实践: 在容器化部署中,建议将这三个参数写入环境变量或 ConfigMap,并通过启动脚本统一注入。避免在多个部署环境中因参数遗漏导致安全配置不一致。