Prometheus 配置 Basic Auth 进行安全防护,实现登录控制
本文分享自华为云社区《Prometheus配置Basic Auth进行安全防护,实现登录控制》,作者:可以交个朋友。
一、Prometheus Basic Auth 使用背景
在日常 prometheus 的使用中是没有安全加密措施的,可能会导致监控信息,敏感信息遭遇泄漏。在这种情况下需要保护对 Prometheus 的访问。
二、方案简介
Prometheus 于 2.24 版本(包括 2.24)之后提供 Basic Auth 功能进行加密访问,在浏览器登录 UI 的时候需要输入用户密码,访问 Prometheus api 的时候也需要加上用户密码。
大致步骤如下
预制用户密码,其中密码使用 python3 工具包加密
创建对应用户密码配置文件,修改普罗启动命令(operator 场景通过 ngress-nginx 方式)
由于 Prometheus 访问需要认证,如果普罗负载存在探针则修改普罗负载本身的探针配置
由于 Prometheus 访问需要认证,如果有 grafana,需要修改 grafana 相关步骤
三、准备工作,预制用户密码,其中密码使用 python3 工具包加密
因为 Basic Auth 需要 user、password 信息。访问 Prometheus API 的所有行为都需要用户名和密码。普罗配置的密码需要加盐加密,可以使用 python3 工具进行生成,再配置到普罗的相关配置中,作为登录密码认证使用。
安装 python3 环境
apt install python3-bcrypt
Python 脚本如下
运行脚本,假如我们需要的密码为: test。
执行脚本后,需要我们手动键入需要使用的密码,在终端键入的时候不显示
保存密码备用: $2b$12$kXxrZP74Fmjh6Wih0Ignu.uWSiojl5aKj4UnMvHN9s2h/Lc/ui0.S
四、prometheus 操作配置实践操作
在 prometheus 的日常使用中,通常有三种方式:
容器化部署在集群中
通过 kube-prometheus 部署
二进制直接在虚机上部署
三种不同方式安装的 prometheus,配置 basic auth 的方式也略有差异。本文将对这三种使用场景进行 Basic auth 的配置。
4.1 Prometheus 容器化部署添加 BasicAuth
默认无需用户、密码等认证方式,直接通过服务 IP 和端口就能访问到 prometheus 的 queryAPI 和 UI 界面
如果需要给 UI 和 prometheus API 添加 basic auth,那么该如何做呢?
确认 prom 的版本信息,低于 2.24 版本的 prometheus 不支持配置 Basic Auth
存在该启动命令,即可配置 basic auth。
创建 configmap 配置项
准备 webconfig.yml 文件
检测 webconfig.yml 是否可用:
promtool check web-config webconfig.yml
复用上述的 webconfig.yml
kubectl -n monitoring create configmap webconfig --from-file=webconfig.yml
将 configmap 挂载给 prometheus 实例
有多处修改点。
需要修改 volume 配置,即增加 configmap 的挂载
修改后效果如下:
需要将配置挂载给 prometheus 容器,添加挂载点
修改后效果如下:
需要修改启动命令,添加 web.config.file
修改后效果如下:
修改完上述配置后,还得看情况继续修改探针配置。
修改探针配置 (如果有健康检查相关配置的话)
同时还需要检查 prometheus 负载 是否有存活探针 livenessProbe,和就绪探针 readinessProbe 相关配置。如果配置了探针,则需要对探针信息进行修改,添加访问头信息。否则会报错:
因为 kubelet 探针需要访问 prometheus 接口,进行存活和就绪检测。如果配置了 httpGet 探针,不对探针进行 httpHeaders 配置,就会引起 pod 不断重启,无法正常运行。
修改方式如下:
首先需要对 用户名和明文密码进行 Base64 编码处理,例如我设置的 basicauth 信息是: admin:test
则需要echo -n "admin:test" |base64 -w0
,编码后的信息为: YWRtaW46dGVzdA==
,保存备用
然后继续编辑 Prometheus 负载配置:
在 livenessProbe.httpGet/readinessProbe.httpGet 中添加:
修改完成后,保存退出负载配置。然后手动重启 pod 实例。
修改完成后,查看 prometheus 实例状态。实例就绪
访问 prometheus 的 queryAPI,发现如果不带用户信息,则访问失败。basic auth 生效
访问 Prometheus UI: 需要带用户鉴权,否则无法访问:
页面密码输入明文即可。
4.2 Prometheus-operator 部署场景添加 basic auth
当前在 k8s 部署 prometheus 大都选择 kube-prometheus 这种形式,配置文件的变更都是交由 crd 进行管理。统一由 prometheus-operator 进行识别转换。
查看对应的 prometheus 实例,并访问 http API
默认是不带鉴权的。
查看 prometheus crd 的配置,发现没有 web.config.file 相关可以配置的地方
当前 kube-prometheus 还不支持配置 basic auth,详情可见https://github.com/prometheus-operator/prometheus-operator/issues/5765
规避方案
借助 nginx-ingress 的能力配置 basic auth。nginx ingress 在这方面非常灵活。
即创建 ingress 来实现。再创建 ingress 之前,我们需要先准备 auth-secret
执行下述命令之前 先安装 工具: yum -y install httpd
效果如下:
使用 auth 文件创建 secret:
kubectl create secret generic basic-auth --from-file=auth
给 prometheus 创建 ingress 访问入口
由于我使用的 k8s 版本是 1.21,ingress 的写法会有所不同,1.22 以后,ingress 的 api 也不再是 networking.k8s.io/v1beta1
访问 queryAPI&prometheus UI
可以发现 queryAPI 直接访问已经被限制登录
如果带鉴权用户访问则可以获取监控数据
同时也可以发现,访问 UI 已经限制登录鉴权
输入用户和密码后即可登录
高版本的 k8s ingress 写法可参考
4.3 Prometheus 裸机方式部署添加 Basic Auth
创建 webconfig.yml
启动 prometheus
./prometheus --web.config.file=webconfig.yml --config.file=prometheus.yml
其中 --web.config.file=webconfig.yml 为关键配置,prometheus 启动后会要求 带密码访问启动成功:
访问 prometheus UI
要求输入用户密码信息
访问 prometheus http API 接口
带用户信息访问:
五、Grafana 如何对接鉴权之后的 Prometheus
正常来说,如果对 Prometheus 配置了 Basic Auth 后,所有需要访问 Prometheus 的组件均需做出调整,否则无法获取数据。Grafana 也不例外
登录 Grafana UI, 初次登录需要填写 grafana 的用户密码,默认是admin:admin
确认数据源配置,并对数据源进行配置
配置完成后,点击正下方绿色按钮 Test,测试数据源的联通性(不出意外,连接失败)
如果没失败,就万事大吉,无需在往下看了。恭喜你完成对接。
失败了请看下面,如何解决:
查看 monitoring 命名空间中 grafana-datasource 的 configmap 配置
kubectl get cm -n monitoring |grep grafana-datasources
编辑该配置项:
kubectl edit cm grafana-datasources -n monitoring
将 editable: false
设置为 : editable: true
修改的原因是因为 grafana 内置了默认的数据源,且数据源不允许修改。我们需要调整这个默认的规定
手动重启 grafana 实例
cm 修改完成后,无法动态加载配置,需要手动重启 grafana 实例加载新配置。
如果 grafana 没做持久化处理,之前手动配置的 dashboard 可能会因为重启 grafana 实例而丢失,建议备份 dashboard,dashboard 可由 grafana 页面以 json 格式导出
再次访问 Grafana UI
查看 dashboard 信息:
Ok,大功告成!
六、总结建议
容器化部署的 prometheus 修改逻辑其实和二进制相同。将对应的 Basic Auth 信息传递给 prometheus,然后启动加载就可以了。低版本 Promethues 加载失败,会打印错误日志:
unknow long flag '--web.config.file'
要求 Prometheus 版本不低于 2.24。
如果 prometheus 在部署的时候配置了存活探针和就绪探针,不对探针进行 httpHeaders 的配置,则会造成 prometheus 实例无法正常运行。
七 拓展内容
7.1 Grafana 如何取消匿名登录
正常情况下,Grafana 的监控信息应该需要用户才能登录显示对接数据源指标的显示。如果谁都能登录查看,容器造成信息泄漏等安全问题
如何才能实现 Grafana 的安全登录功能呢?
查看集群中 monitoring ns 下的 grafana-conf 配置项
kubectl get cm -n monitoring |grep grafana-conf
编辑该配置项
kubectl edit cm -n monitoring grafana-conf
根据关键字找到 auth.anonymous
配置,将 enabled = true 设置为 fale
重启 grafana 实例
修改配置后,需要重启 grafana 实例,加载配置(如果没做持久化处理,注意备份相关 dashboard)
刷新 grafana 页面,重新登录
可以发现,再次登录页面,都需要填写用户信息了
7.2 Prometheus BasicAuth 添加多用户
现实场景下,Prometheus 的 Baisc Auth 信息需要配置多个提供给不同团队。
例如我之前添加的 basic auth 只用一个鉴权用户: admin: test
; 现在如果想添加新的鉴权用户: mike: hello
我们先用 python3 工具生成 hello 字段加密后的样子: $2b$12$qhdgpdq669cXNW4DLqRfI.JIBJ0KIvvf0I.I3ccie/tn8d4BxzqV2
此时只需要前往之前设置的 webconfig 这个 configmap 中添加该信息即可:
kubectl edit cm webconfig -n monitoring
修改完成后,使用 prometheus 的热加载命令加载新配置:
curl -u "admin:test" -XPOST http://ip:9090/-/reload
多用户访问生效
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/f678b33cd563a4fec25bb9369】。文章转载请联系作者。
评论