写点什么

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

  • 2024-01-15
    广东
  • 本文字数:4362 字

    阅读完需:约 14 分钟

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

本文分享自华为云社区《Prometheus配置Basic Auth进行安全防护,实现登录控制》,作者:可以交个朋友。

一、Prometheus Basic Auth 使用背景


在日常 prometheus 的使用中是没有安全加密措施的,可能会导致监控信息,敏感信息遭遇泄漏。在这种情况下需要保护对 Prometheus 的访问。

二、方案简介


Prometheus 于 2.24 版本(包括 2.24)之后提供 Basic Auth 功能进行加密访问,在浏览器登录 UI 的时候需要输入用户密码,访问 Prometheus api 的时候也需要加上用户密码。


大致步骤如下


  1. 预制用户密码,其中密码使用 python3 工具包加密

  2. 创建对应用户密码配置文件,修改普罗启动命令(operator 场景通过 ngress-nginx 方式)

  3. 由于 Prometheus 访问需要认证,如果普罗负载存在探针则修改普罗负载本身的探针配置

  4. 由于 Prometheus 访问需要认证,如果有 grafana,需要修改 grafana 相关步骤

三、准备工作,预制用户密码,其中密码使用 python3 工具包加密


因为 Basic Auth 需要 user、password 信息。访问 Prometheus API 的所有行为都需要用户名和密码。普罗配置的密码需要加盐加密,可以使用 python3 工具进行生成,再配置到普罗的相关配置中,作为登录密码认证使用。


安装 python3 环境


apt install python3-bcrypt


Python 脚本如下


import getpassimport bcrypt
password = getpass.getpass("password: ")hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())print(hashed_password.decode())
复制代码


运行脚本,假如我们需要的密码为: test。


执行脚本后,需要我们手动键入需要使用的密码,在终端键入的时候不显示



保存密码备用: $2b$12$kXxrZP74Fmjh6Wih0Ignu.uWSiojl5aKj4UnMvHN9s2h/Lc/ui0.S

四、prometheus 操作配置实践操作


在 prometheus 的日常使用中,通常有三种方式:


  1. 容器化部署在集群中

  2. 通过 kube-prometheus 部署

  3. 二进制直接在虚机上部署


三种不同方式安装的 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 文件


basic_auth_users:  admin: $2b$12$kXxrZP74Fmjh6Wih0Ignu.uWSiojl5aKj4UnMvHN9s2h/Lc/ui0.S
复制代码


检测 webconfig.yml 是否可用:


promtool check web-config webconfig.yml



复用上述的 webconfig.yml


kubectl -n monitoring create configmap webconfig --from-file=webconfig.yml



将 configmap 挂载给 prometheus 实例


有多处修改点。


需要修改 volume 配置,即增加 configmap 的挂载


 volumes: - configMap:     name: webconfig   name: basic-auth
复制代码


修改后效果如下:



需要将配置挂载给 prometheus 容器,添加挂载点


 volumeMounts: - mountPath: /etc/prometheus/basicauth   name: basic-auth
复制代码


修改后效果如下:



需要修改启动命令,添加 web.config.file


- --web.config.file=/etc/prometheus/basicauth/webconfig.yml
复制代码


修改后效果如下:



修改完上述配置后,还得看情况继续修改探针配置。


修改探针配置 (如果有健康检查相关配置的话)


同时还需要检查 prometheus 负载 是否有存活探针 livenessProbe,和就绪探针 readinessProbe 相关配置。如果配置了探针,则需要对探针信息进行修改,添加访问头信息。否则会报错:



因为 kubelet 探针需要访问 prometheus 接口,进行存活和就绪检测。如果配置了 httpGet 探针,不对探针进行 httpHeaders 配置,就会引起 pod 不断重启,无法正常运行。



修改方式如下:


首先需要对 用户名和明文密码进行 Base64 编码处理,例如我设置的 basicauth 信息是: admin:test

则需要echo -n "admin:test" |base64 -w0 ,编码后的信息为: YWRtaW46dGVzdA== ,保存备用



然后继续编辑 Prometheus 负载配置:



在 livenessProbe.httpGet/readinessProbe.httpGet 中添加:


httpGet:   httpHeaders:  - name: Authorization    value: Basic YWRtaW46dGVzdA==
复制代码



修改完成后,保存退出负载配置。然后手动重启 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


$ htpasswd -c auth adminNew password:  testNew password:Re-type new password:Adding password for user admin
复制代码


效果如下:



使用 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


# ingress-prom.yamlapiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/auth-realm: Authentication Required    nginx.ingress.kubernetes.io/auth-secret: basic-auth    nginx.ingress.kubernetes.io/auth-type: basic    kubernetes.io/ingress.class: nginx  name: prometheus-k8s  namespace: monitoringspec:  rules:  - host: prometheus.example.com    http:      paths:      - backend:          serviceName: prometheus-k8s          servicePort: 9090        path: /        pathType: Prefix
复制代码



访问 queryAPI&prometheus UI


可以发现 queryAPI 直接访问已经被限制登录



如果带鉴权用户访问则可以获取监控数据



同时也可以发现,访问 UI 已经限制登录鉴权



输入用户和密码后即可登录



高版本的 k8s ingress 写法可参考


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/auth-realm: Authentication Required    nginx.ingress.kubernetes.io/auth-secret: basic-auth    nginx.ingress.kubernetes.io/auth-type: basic    kubernetes.io/ingress.class: nginx  name: prometheus-k8s  namespace: monitoringspec:  rules:  - host: prometheus.example.com    http:      paths:      - backend:          service:            name: prometheus-k8s            port:              name: web        path: /        pathType: Prefix
复制代码

4.3 Prometheus 裸机方式部署添加 Basic Auth


创建 webconfig.yml


basic_auth_users:  admin: $2b$12$kXxrZP74Fmjh6Wih0Ignu.uWSiojl5aKj4UnMvHN9s2h/Lc/ui0.S
复制代码



启动 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



多用户访问生效



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Prometheus配置Basic Auth进行安全防护,实现登录控制_开发_华为云开发者联盟_InfoQ写作社区