Prometheus生产部署必须启用Basic Auth与TLS:v2.35+支持,v2.40+强制哈希密码;需用web-config.yml配置bcrypt密码及证书,禁用admin/lifecycle接口,并通过反向代理或Ingress收敛暴露面。

Prometheus 默认不设访问门槛,Web 界面和所有 API(如 /api/v1/query、/config、/status)完全裸露,任何能连上端口的人都可读指标、查配置、甚至调用管理接口(如 reload)。安全加固不是可选项,而是生产部署的强制前提。
确认版本支持 Basic Auth
Prometheus 2.24 起引入实验性 Basic Auth,但真正稳定可用从 v2.35.0(2022年5月)起,v2.40.0 后成为标准功能。低于 v2.24 的版本无法启用,强行加参数会启动失败。
- 运行
prometheus --version确认版本;若低于 v2.35,必须升级 - v2.35–v2.39 需额外禁用 admin API:
--web.enable-admin-api=false,否则认证可能被绕过 - v2.40+ 默认启用且更安全:拒绝明文密码文件、仅接受 bcrypt/scrypt/apr1 哈希、自动过滤空密码
生成合规的认证文件
认证凭据需存为 YAML 格式的 web-config.yml,不能用 .htpasswd 原生文件直接挂载——Prometheus 不解析该格式,只认 YAML 中的 basic_auth_users 字段。
- 用
htpasswd -B -b auth.yaml admin 'mypass123'生成 bcrypt 密码(-B指定 bcrypt,-b批量模式) - 或手写 YAML:
basic_auth_users: {admin: "$2y$10$abc..."},哈希值可用 Pythonbcrypt或在线工具生成 - 文件必须是 Unix 换行(LF),不能含 BOM、注释或空行;v2.42+ 开始严格校验格式,出错将拒绝启动
启用认证并绑定 TLS
Basic Auth 必须配合 HTTPS 使用,否则密码以明文传输,形同虚设。
- 准备证书:
cert.pem和key.pem(可自签或由 Let’s Encrypt 签发) - 在
web-config.yml中同时配置 TLS 和认证:
tls_server_config:
cert_file: /etc/prometheus/tls/cert.pem
key_file: /etc/prometheus/tls/key.pem
basic_auth_users:
admin: "$2y$10$..."
- 启动时指定配置:
prometheus --config.file=prometheus.yml --web.config.file=web-config.yml - 浏览器访问时会弹出登录框;API 请求需带 Header:
Authorization: Basic YWRtaW46bXlwYXNzMTIz(Base64 编码)
限制高危操作与网络暴露面
认证只是第一道门,还需收窄权限和暴露范围。
- 关闭非必要管理接口:除非真需要远程 reload,否则始终设置
--web.enable-lifecycle=false - 禁用 admin API:
--web.enable-admin-api=false(删除系列 endpoint 如/api/v1/admin/tsdb/delete_series) - 用反向代理(如 Nginx)做前置网关:可叠加 IP 白名单、速率限制、日志审计,比 Prometheus 内置机制更灵活
- Kubernetes 场景下,Service 类型避免用
NodePort或LoadBalancer直曝公网;优先走 Ingress + TLS 终止 + 认证

















