【Prometheus】实战指南:使用basic_auth加固监控数据访问

张开发
2026/4/10 12:26:36 15 分钟阅读

分享文章

【Prometheus】实战指南:使用basic_auth加固监控数据访问
1. 为什么需要为Prometheus添加basic_auth认证最近几年随着企业数字化转型的加速监控系统已经成为IT基础设施中不可或缺的一部分。Prometheus作为云原生时代最流行的监控解决方案之一被广泛应用于各类生产环境。但很多团队在部署Prometheus时往往忽略了最基本的安全防护导致监控数据暴露在风险之中。想象一下如果你的服务器性能指标、业务运行状态这些敏感数据可以被公司内任何人在浏览器地址栏输入IP就能直接查看甚至还能通过PromQL执行任意查询这就像把公司机房的钥匙挂在门口一样危险。我去年就遇到过这样一个案例某电商企业的促销活动数据被竞争对手通过未加密的Prometheus接口获取直接导致了商业策略的泄露。与OAuth2.0或mTLS等复杂认证方案相比basic_auth有三大不可替代的优势首先是部署简单不需要额外搭建认证服务器其次是兼容性强所有主流的HTTP客户端和浏览器都原生支持最重要的是维护成本低特别适合中小团队快速实现安全加固。在实际运维中我发现90%的内部监控场景basic_auth提供的安全级别已经足够应对常见风险。2. basic_auth配置前的准备工作2.1 环境检查清单在开始配置之前建议先完成以下准备工作确认Prometheus版本不低于2.24.0早期版本对web.config支持不完善检查服务器是否已安装Python 3.6推荐3.8以上版本准备具有sudo权限的运维账号记录当前Prometheus的启动参数避免配置后服务无法启动特别提醒如果生产环境启用了SELinux需要提前做好策略调整。我曾经在CentOS系统上遇到过因为SELinux导致配置文件无法读取的问题解决方案是执行chcon -R -t bin_t /usr/local/bin/promtool chcon -R -t etc_t /etc/prometheus/web.yml2.2 密码生成工具选型官方文档推荐使用bcrypt算法生成密码哈希这是目前最安全的密码存储方案之一。与常见的md5sum不同bcrypt会自动加盐并支持成本参数调整。在Python生态中我们有两种实现方式使用系统包管理器安装# RedHat系 sudo dnf install python3-bcrypt # Debian系 sudo apt-get install python3-bcrypt通过pip安装推荐pip3 install --upgrade pip pip3 install bcrypt如果遇到编译依赖问题可能需要先安装开发工具链# 以AlmaLinux为例 sudo dnf groupinstall Development Tools sudo dnf install python3-devel3. 分步配置basic_auth认证3.1 生成密码哈希值创建一个名为gen-pass.py的Python脚本内容如下import getpass import bcrypt password getpass.getpass(请输入密码: ) hashed_password bcrypt.hashpw( password.encode(utf-8), bcrypt.gensalt(rounds12) # 成本参数值越大越安全但计算耗时越长 ) print(加密后的密码哈希值:) print(hashed_password.decode())执行时会要求交互式输入密码python3 gen-pass.py输出示例$2b$12$N9qo8uLOickgx2ZMRZoMy.MQMj3z6SGhB0Cb0Tv4jQx7Jw4gZzYdC安全建议密码长度至少12位包含大小写字母、数字和特殊字符不同环境如dev/staging/prod应使用不同密码建议每90天轮换一次密码3.2 创建web配置文件在Prometheus配置目录通常为/etc/prometheus下创建web.ymlbasic_auth_users: prom_admin: $2b$12$N9qo8uLOickgx2ZMRZoMy.MQMj3z6SGhB0Cb0Tv4jQx7Jw4gZzYdC readonly_user: $2b$12$k7J9IuVxYc3mz5wLbQrZX.9gZ1D2hE4fG7jK8lMnOpQrStUvWxYzA使用promtool验证配置语法promtool check web-config web.yml成功时会显示web.yml SUCCESS3.3 重启Prometheus服务修改systemd服务单元文件如/etc/systemd/system/prometheus.service在ExecStart参数后追加--web.config.file/etc/prometheus/web.yml完整的重启流程sudo systemctl daemon-reload sudo systemctl restart prometheus sudo systemctl status prometheus验证配置是否生效curl -u prom_admin:yourpassword http://localhost:9090/metrics如果返回401状态码说明认证已生效。4. 上下游系统集成指南4.1 Grafana数据源配置在Grafana中添加Prometheus数据源时需要启用Basic auth选项填写配置文件中设置的用户名/密码在Custom HTTP Headers中添加Header: Authorization Value: Basic ${base64编码的用户名:密码}4.2 Alertmanager集成如果Alertmanager配置了basic_auth需要在Prometheus的alertmanager配置段添加alerting: alertmanagers: - basic_auth: username: alert_user password: securepassword scheme: http static_configs: - targets: [alertmanager:9093]4.3 客户端库适配对于使用client_golang的应用需要在http.Client中设置Transportimport github.com/prometheus/client_golang/prometheus func newCollector() *prometheus.HistogramVec { return prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: request_duration_seconds, Help: Time spent processing requests, }, []string{method, path}, ) }5. 日常运维与故障排查配置完成后建议建立以下运维规范每月检查一次认证日志journalctl -u prometheus | grep auth使用Prometheus自带的metrics监控认证失败次数prometheus_http_requests_total{code401}准备应急脚本在认证失效时快速禁用basic_auth常见问题解决方案密码遗忘临时注释web.yml中的basic_auth配置重启服务后重新生成性能下降降低bcrypt的cost参数不低于10Grafana图表报错检查数据源的Skip TLS Verify选项是否匹配记得定期备份web.yml文件我建议将其纳入现有的配置管理系统。在实际运维中最好结合CI/CD流程实现配置的自动化部署和验证这样可以避免人为操作失误导致的服务中断。

更多文章