Prometheus配置Basic Auth进行安全防护,实现登录控制

💡 原文中文,约7200字,阅读约需18分钟。
📝

内容提要

本文介绍了使用Prometheus的Basic Auth功能进行安全访问控制的方法,包括创建配置文件、修改启动命令和探针配置。还讨论了在不同部署方式下的配置方法,并介绍了如何与Grafana对接。提供了拓展内容如取消匿名登录和添加多个用户的配置。

🔎

延伸解读

版本与部署方式决定配置路径

Prometheus的Basic Auth功能从2.24版本开始支持,低于此版本启动时会报错“unknow long flag '--web.config.file'”。配置方式因部署而异:容器化部署需挂载configmap并修改启动命令;kube-prometheus(operator)场景目前不支持直接配置,需借助nginx-ingress实现;裸机部署则通过启动参数指定webconfig.yml。读者需先确认自身部署模式,再选择对应方案。

探针配置是容器化部署的关键风险点

在容器化部署中,若Prometheus负载配置了livenessProbe或readinessProbe,启用Basic Auth后必须为探针添加httpHeaders,携带Base64编码的认证信息。否则kubelet探针无法通过认证,会导致Pod不断重启,无法正常运行。这是配置过程中容易遗漏的环节,需在修改启动命令后同步检查探针配置。

Grafana对接需调整数据源与匿名登录

Prometheus启用Basic Auth后,Grafana默认数据源连接会失败。需编辑grafana-datasources配置项,将editable从false改为true,并手动重启Grafana实例使配置生效。此外,建议将grafana-conf中的auth.anonymous从true改为false,取消匿名登录,避免监控信息被未授权访问。修改配置前注意备份Dashboard,防止重启导致数据丢失。

多用户配置与热加载

实际场景中可能需要为不同团队分配多个Basic Auth用户。只需在webconfig.yml的basic_auth_users下追加新用户及其bcrypt加密密码,更新configmap后,通过Prometheus的热加载接口(如curl -u "admin:test" -XPOST http://ip:9090/-/reload)即可生效,无需重启实例。这为多团队协作提供了便利,但需妥善保管各用户密码。

❓

Q&A

Prometheus 从哪个版本开始支持 Basic Auth?

Prometheus 从 2.24 版本(包括 2.24)开始支持 Basic Auth 功能。低于此版本将无法使用,启动时会报错 'unknown long flag '--web.config.file''。

如何为 Prometheus 生成加密的密码?

可以使用 python3 的 bcrypt 工具包生成加密密码。先安装 python3-bcrypt,然后运行 Python 脚本,输入明文密码,脚本会输出加盐加密后的哈希值,将该值配置到 webconfig.yml 中即可。

在容器化部署的 Prometheus 中如何配置 Basic Auth?

首先创建包含 basic_auth_users 的 webconfig.yml 文件,并用 promtool 检查。然后创建 configmap 并挂载到 Prometheus 实例,修改启动命令添加 --web.config.file 参数。如果配置了探针,还需在探针的 httpGet 中添加 httpHeaders 包含 Authorization 头,以避免 Pod 重启。

使用 kube-prometheus 部署时如何为 Prometheus 添加 Basic Auth?

由于 kube-prometheus 目前不支持直接配置 Basic Auth,可以通过 nginx-ingress 来实现。需要创建 auth-secret(使用 htpasswd 生成),然后创建 ingress 并添加 nginx.ingress.kubernetes.io/auth-type: basic 等注解,将流量通过 ingress 进行认证。

Prometheus 配置 Basic Auth 后,Grafana 如何对接?

需要修改 Grafana 的数据源配置,将 editable 设置为 true,然后手动重启 Grafana 实例。之后在 Grafana 中编辑数据源,填写 Basic Auth 用户名和密码,测试连接即可。

如何为 Prometheus 的 Basic Auth 添加多个用户?

在 webconfig.yml 的 basic_auth_users 下添加新的用户名和加密后的密码,更新对应的 configmap,然后使用热加载命令 curl -u "admin:test" -XPOST http://ip:9090/-/reload 使配置生效。

Grafana 如何取消匿名登录?

编辑 monitoring 命名空间下的 grafana-conf 配置项,找到 auth.anonymous 配置,将 enabled = true 改为 false,然后重启 Grafana 实例。这样所有访问都需要登录认证。

🏷️

标签

➡️

继续阅读