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 三参数协同关系与典型部署拓扑
下图展示了三个参数在典型反向代理部署模式下的协同工作方式:
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,并通过启动脚本统一注入。避免在多个部署环境中因参数遗漏导致安全配置不一致。