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 脚本如下
import getpass
import 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的日常使用中,通常有三种方式:
- 容器化部署在集群中
- 通过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文件
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 admin
New password: test
New 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.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

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

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

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

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

高版本的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
创建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

多用户访问生效

Prometheus配置Basic Auth进行安全防护,实现登录控制的更多相关文章
- 使用crypt配置Basic Auth登录认证
简介 Basic Auth用于服务端简单的登录认证,通常使用服务器Nginx.Apache本身即可完成.比如我们要限定某个域名或者页面必须输入用户名.密码才能登录,但又不想使用后端开发语言,此时Bas ...
- 基于 Traefik 的 Basic Auth 配置
前言 Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易. Traefik可以与现有的多种基础设施组件(Docker.Swarm模式.Kubernetes.Marathon. ...
- Etcd安全配置之Basic Auth认证
<中小团队落地配置中心详解>文章中我们介绍了如何基于Etcd+Confd构建配置中心,最后提到Etcd的安全问题时说了可以使用账号密码认证以达到安全访问的目的,究竟该如何开启认证以及怎么设 ...
- Nginx下配置Http Basic Auth
nginx basic auth指令 第一条语句: 语法: auth_basic string | off;默认值: auth_basic off;配置段: http, ...
- Jmeter实现Basic Auth方式登录
背景 在实际测试日常中,产品有两种登录方式,一种是普通登录方式,另一种则是Basic Auth方式登录.两种登录对应着产品中不同的操作,对权限进行了一个划分. Postman登录 使用Postman登 ...
- springboot成神之——Basic Auth应用
本文介绍Basic Auth在spring中的应用 目录结构 依赖 入口DemoApplication 验证Authenication 配置WebSecurityConfig 控制器TestContr ...
- (74)zabbix第三方认证之http(nginx basic auth)
HTTP Basic Auth认证方式,我们将在实例中使用nginx来演示,Apache也类似. zabbix认证配置 Administration>> Authentication,将h ...
- SpringBoot + CXF快速实现SOAP WebService(支持Basic Auth)
唠叨两句 讲真,SOAP跟现在流行的RESTful WebService比起来显得很难用.冗余的XML文本信息太多,可读性差,它的请求信息有时很难手动构造,不太好调试.不过说归说,对某些企业用户来说S ...
- ios开发使用Basic Auth 认证方式
http://blog.csdn.net/joonchen111/article/details/48447813 我们app的开发通常有2种认证方式 一种是Basic Auth,一种是OAuth ...
- Apache增加Basic Auth
在.htaccess文件中增加 AuthUserFile /var/www/htpasswd/test.htpasswd AuthName EnterPassword AuthType Basic r ...
随机推荐
- MongoDB 中的索引分析
MongoDB 的索引 前言 MongoDB 使用 B 树还是 B+ 树索引 单键索引 创建单键索引 使用 expireAfterSeconds 创建 TTL 索引 复合索引 最左匹配原则 ESR 规 ...
- 基于落点打分的井字棋智能下棋算法(C语言实现)
本文设计了一种基于落地打分的井字棋下棋算法,能够实现电脑不败,所以如果玩家会玩的话,一般是平局. 算法核心 电脑根据对落子位置的打分,选择分数最高的位置,若不同落点分数相同则随机选择位置(随机选择就不 ...
- Acwing76场周赛
题目链接 这次还是只做出来两道题,前两题都挺简单的,注意第二题需要开long long不开会wa,代码粘上来,以后可能会看吧 第一题 #include<iostream> #include ...
- 创建一个自己的 Linux系统
简单来说就是一个文件传递的机制,首先创建/安装一个硬盘,然后把前硬盘中的一部分文件先转移到Linux系统上,再通过Linux系统转移到创建的新硬盘,之后用虚拟机,把新硬盘装在其中,就可以在新硬盘上做到 ...
- Python 异常处理:try、except、else 和 finally 的使用指南
异常处理 当发生错误(或我们称之为异常)时,Python 通常会停止执行并生成错误消息. try 块用于测试一段代码是否存在错误. except 块用于处理错误. else 块用于在没有错误时执行代码 ...
- go基础-方法
概述 方法是面向对象编程 (OOP) 的一个特性,在 C++/Java 语言中方法是类函数,go做为函数式编程语言,通过特有技能支持相似的功能,所以说go也支持面向对象编程特性. go 方法本质也是函 ...
- 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...
- PHP异步通信
目录 PHP swoole websocket服务器端 websocket 客户端 直播平台 基于宝塔nginx安装Nginx-rtmp-module搭建流媒体服务器 web H5端拉流 其他 PHP ...
- Filter拦截问题
关于Filter拦截问题 刚开始我创建了个servlet项目一直拦截不成功 首先是因为导包的问题 import javax.servlet.*; 必须是这个包才有 第一个这个Javax.se ...
- PTA数组及排序查找题解与解题思路
PTA数组及排序查找题解与解题思路 函数题目 函数题目为平台提供的裁判程序调用所完成的函数进行判题,题目规定语言为C语言 6-1 求出二维数组的最大元素及其所在的坐标 本题较为简单,考察的是如何遍历一 ...