首页 > 其他分享 >Prometheus配置Basic Auth进行安全防护,实现登录控制

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

时间:2024-01-15 11:00:45浏览次数:37  
标签:ingress 配置 prometheus auth grafana Prometheus Auth Basic

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

一、Prometheus Basic Auth 使用背景

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


二、方案简介

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

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

大致步骤如下

  1. 预制用户密码,其中密码使用python3工具包加密
  2. 创建对应用户密码配置文件,修改普罗启动命令(operator场景通过ngress-nginx方式)
  3. 由于Prometheus访问需要认证,如果普罗负载存在探针则修改普罗负载本身的探针配置
  4. 由于Prometheus访问需要认证,如果有grafana,需要修改grafana相关步骤

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

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

  1. 安装python3环境
    apt install python3-bcrypt
  2. Python 脚本如下
import getpass
import bcrypt

password = getpass.getpass("password: ")
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(hashed_password.decode())

3、运行脚本,假如我们需要的密码为: test。
执行脚本后,需要我们手动键入需要使用的密码,在终端键入的时候不显示

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

  • 保存密码备用: $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界面

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

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


    如果需要给UI和 prometheus API 添加basic auth,那么该如何做呢?

    确认prom的版本信息,低于2.24版本的prometheus 不支持配置Basic Auth

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

    存在该启动命令,即可配置basic auth。

    2、创建configmap配置项
    准备webconfig.yml文件

    basic_auth_users:
      admin: $2b$12$kXxrZP74Fmjh6Wih0Ignu.uWSiojl5aKj4UnMvHN9s2h/Lc/ui0.S

    检测webconfig.yml是否可用:

    promtool check web-config webconfig.yml

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

    复用上述的webconfig.yml

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

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

    3、将configmap挂载给prometheus 实例
    有多处修改点。
    需要修改volume配置,即增加configmap的挂载

    volumes:
     - configMap:
         name: webconfig
       name: basic-auth

    修改后效果如下:

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

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

    volumeMounts:
     - mountPath: /etc/prometheus/basicauth
       name: basic-auth

    修改后效果如下:

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

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

    - --web.config.file=/etc/prometheus/basicauth/webconfig.yml

    修改后效果如下:

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

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

    4、修改探针配置 (如果有健康检查相关配置的话)
    同时还需要检查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==

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


    修改完成后,保存退出负载配置。然后手动重启pod实例。

    5、修改完成后,查看prometheus 实例状态。实例就绪

    访问prometheus的queryAPI,发现如果不带用户信息,则访问失败。basic auth生效

    访问Prometheus UI: 需要带用户鉴权,否则无法访问:


    页面密码输入明文即可。


    4.2 Prometheus-operator部署场景添加basic auth

    当前在k8s 部署prometheus 大都选择kube-prometheus这种形式,配置文件的变更都是交由crd进行管理。统一由prometheus-operator进行识别转换。

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

    1. 查看对应的prometheus实例,并访问http API

      默认是不带鉴权的。
    2. 查看prometheus crd 的配置,发现没有web.config.file 相关可以配置的地方
      当前kube-prometheus 还不支持配置basic auth,详情可见https://github.com/prometheus-operator/prometheus-operator/issues/5765
    3. 规避方案
      借助nginx-ingress的能力配置basic auth。nginx ingress 在这方面非常灵活。

      即创建ingress 来实现。再创建ingress之前,我们需要先准备auth-secret
      执行下述命令之前 先安装 工具: yum -y install httpd
    $ htpasswd -c auth admin
    New password:  test
    New password:
    Re-type new password:
    Adding password for user admin

    效果如下:

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

    使用auth文件创建secret:

    kubectl create secret generic basic-auth --from-file=auth

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

    4、给prometheus创建ingress访问入口
    由于我使用的k8s版本是1.21,ingress的写法会有所不同,1.22以后,ingress的api也不再是networking.k8s.io/v1beta1

    # ingress-prom.yaml
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      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: monitoring
    spec:
      rules:
      - host: prometheus.example.com
        http:
          paths:
          - backend:
              serviceName: prometheus-k8s
              servicePort: 9090
            path: /
            pathType: Prefix

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

    5、访问queryAPI&prometheus UI
    可以发现queryAPI直接访问已经被限制登录

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

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

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

    6、高版本的k8s ingress写法可参考

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      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: monitoring
    spec:
      rules:
      - host: prometheus.example.com
        http:
          paths:
          - backend:
              service:
                name: prometheus-k8s
                port:
                  name: web
            path: /
            pathType: Prefix

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

    1. 创建webconfig.yml
    basic_auth_users:
      admin: $2b$12$kXxrZP74Fmjh6Wih0Ignu.uWSiojl5aKj4UnMvHN9s2h/Lc/ui0.S

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

    2、启动prometheus
    ./prometheus --web.config.file=webconfig.yml --config.file=prometheus.yml其中 --web.config.file=webconfig.yml 为关键配置,prometheus 启动后会要求 带密码访问
    启动成功:

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

    3、访问prometheus UI
    要求输入用户密码信息

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

    4、访问prometheus http API接口

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

    带用户信息访问:

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


    五、Grafana 如何对接鉴权之后的Prometheus

    正常来说,如果对Prometheus配置了Basic Auth后,所有需要访问Prometheus的组件均需做出调整,否则无法获取数据。Grafana也不例外

    1. 登录Grafana UI, 初次登录需要填写grafana的用户密码,默认是admin:admin

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

    1. 确认数据源配置,并对数据源进行配置

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

    1. 配置完成后,点击正下方绿色按钮Test,测试数据源的联通性(不出意外,连接失败)
      如果没失败,就万事大吉,无需在往下看了。恭喜你完成对接。
      失败了请看下面,如何解决:

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

    1. 查看monitoring命名空间中grafana-datasource的configmap配置
      kubectl get cm -n monitoring |grep grafana-datasources

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

    编辑该配置项:
    kubectl edit cm grafana-datasources -n monitoring将 editable: false 设置为 : editable: true修改的原因是因为 grafana内置了默认的数据源,且数据源不允许修改。我们需要调整这个默认的规定。

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

    1. 手动重启grafana实例
      cm修改完成后,无法动态加载配置,需要手动重启grafana实例加载新配置。
      如果grafana没做持久化处理,之前手动配置的dashboard可能会因为重启grafana实例而丢失,建议备份dashboard,dashboard可由grafana页面以json格式导出

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

    6、再次访问Grafana UI

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


    查看dashboard信息:

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


    Ok,大功告成!


    六、总结建议

    1. 容器化部署的prometheus 修改逻辑其实和二进制相同。将对应的Basic Auth 信息传递给prometheus,然后启动加载就可以了。低版本Promethues加载失败,会打印错误日志:
      unknow long flag '--web.config.file'要求Prometheus版本不低于2.24.
    2. 如果prometheus在部署的时候配置了存活探针和就绪探针,不对探针进行httpHeaders的配置,则会造成prometheus实例无法正常运行。

    七 拓展内容

    7.1 Grafana 如何取消匿名登录

    标签:ingress,配置,prometheus,auth,grafana,Prometheus,Auth,Basic
    From: https://blog.51cto.com/u_15214399/9250663

    相关文章

    • 自定义监控(kube-prometheus)
         ......
    • Prometheus,Prometheus 搭建
       Prometheus,Prometheus搭建Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Prometheus是一种开源的监控系统和时间序列数据库,用于收集、存储和查询指标数据。Grafana是一个开源的数据可视化和监控分析平台,用于展示Prometheus收集的指标数据。在K......
    • app.UseAuthentication()、app.UseAuthorization() 及其它
      首先,这两段代码拼写就比较容易混淆,一个是UseAuthentication,一个是UseAuthorization,很容易看混。app.UseAuthentication(); 这个方法代表"认证"中间件的添加,这个中间件负责对来自客户端的请求进行认证,也就是说,它会把请求中包含的用户信息(比如一个cookie或者token)解释出来,然后构......
    • NSSCTF Round#16 Basic crypto misc-wp
      CRYPTOpr题目CRTfromCrypto.Util.numberimport*importrandomflag=plaintext='NSSCTF{****************}'charset='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'padding_length=100-len(plaintext)for_inr......
    • NSSCTF Round#16 Basic -Web wp
      RCE但是没有完全RCE<?phperror_reporting(0);highlight_file(__file__);include('level2.php');if(isset($_GET['md5_1'])&&isset($_GET['md5_2'])){if((string)$_GET['md5_1']!==(string)$_GET['md5_2�......
    • NSSCTF Round#16 Basic WriteUp
      NSSCTFRound#16Basicwp目录NSSCTFRound#16Basicwp一.pwn1.nc_pwnre2.ret_text一.pwn1.nc_pwnrenc连接得到题目,给了一段汇编代码以及40个十六进制数字分析代码可知,将一个字符串与10h即16进行异或运算,二次异或运算得到字符串TlNTQ1RGe1dFTGMwTV9UMF9wV25fdzByMWQhfQ......
    • 手把手教你MongoDB 数据库连接URL 格式、authSource参数
      快速了解MongoDB官方文档MongoDB是一个文档数据库MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成使用URL连接MongoDB数据库标准URI连接语法:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]......
    • Prometheus+Grafana
      核心介绍基础板块如何保障业务的稳定性运行+主流监控系统架构Prometheus架构和面板核心组件讲解实战云服务器选购+Linux服务器源码安装Prometheus时序数据语法和指标类型counter、gauge、histogram等监控实战:Linux主机、Mysql数据库、分布式缓存Redis7.X监控实战:消息队列RabbitMQ、......
    • Microsoft 365问题处理:535 5.7.139 Authentication unsuccessful
      用户在第三方应用中使用Microsoft365Exchangeonline发送通知邮件,设置完用户名和密码,测试发邮件时遇到了问题,报错如下:535,'5.7.3Authenticationunsuccessful[TYCPR01CA0145.jpnprd01.prod.outlook.com2024-01-11T09:22:51.090Z08DC11E16333A637]'使用Powershell脚本测试smtp......
    • Prometheus 监控告警系统搭建(对接飞书告警)
      Prometheus是一套开源的系统监控报警框架,非常适合大规模集群的监控。它也是第二个加入CNCF的项目,受欢迎度仅次于Kubernetes的项目。本文讲解完整prometheus监控和告警服务的搭建。prometheus监控是当下主流监控系统,它是多个服务组合使用的体系。整体架构预览如下:本篇教程......