Prometheus目前已经成为国、内外互联网行业,一款非常知名的免费监控工具,我们可以通过它,以及Prometheus官方、第三方提供的一些exporter工具,对系统、中间件、数据库等一系列的软、硬件的运行数据,进行采集、存储、监控和告警。但是,随着系统安全要求的越来越严格,prometheus的 targets 在没有任何安全防护的情况下可以被随意访问,是存在一定的安全风险的。
所以,下面我们就根据官方提供的说明,对Prometheus进行的表达式浏览器以及HTTP API的访问,进行一个“基础认证”(basic authentication,简称basic_auth)加固。
第一步,我们需要一个安装了Python3的操作系统,这里我使用的系统版本是 AlmaLinux 8.10。这个系统自带的Python3版本为3.6.8版本,我这里先使用二进制包,将版本升级到官方最新的3.13.0稳定版(大家可升级,可不升级,自己决定即可)。
# 安装必须的依赖包
dnf -y install gcc zlib* libffi-devel# 下载并安装3.13.0版本的python3
tar -xf Python-3.13.0.tar.xz
cd Python-3.13.0/
./configure --prefix=/usr/local/python3 --enable-optimizations
make
make install# 备份原先的python3和pip3程序文件
cd /usr/bin
mv python3 python3bak
mv pip3 pip3bak# 创建软连接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3# 检查版本
# python3 -V
Python 3.13.0
# pip3 -V
pip 24.2 from /usr/local/python3/lib/python3.13/site-packages/pip (python 3.13)# 安装 bcrypt 库
pip3 install bcrypt
备注:以上操作需要虚拟机可以联网。
第二步,我们创建一个gen-pass.py文件,文件内容如下:
import getpass
import bcryptpassword = getpass.getpass("password: ")
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(hashed_password.decode())
注意,password: 后面有一个空格,这里就是我们在执行这个py脚本时需要手动输入密码。
第三步,执行上面的py脚本
# python3 ./gen-pass.py
password:
$2b$12$Wo0aNNYiqSstP1fpD0avQOgD5oKYoeDbX8A596prhMZXTVLZTzaeG
注意,在出现password:时,我们需要输入一个密码,然后下面的一长串字符串,就是密码加密后的字符串。
第四步,我们在prometheus的安装目录下,创建一个名称为web.yml文件,内容如下
basic_auth_users:admin: $2b$12$Wo0aNNYiqSstP1fpD0avQOgD5oKYoeDbX8A596prhMZXTVLZTzaeG
注意,admin是用户名,冒号后面有一个空格,不能丢!空格后面就是上一步生成的加密串。
使用promtool工具来校验web.yml文件的格式配置,校验成功。
# ./promtool check web-config ./web.yml
./web.yml SUCCESS
第五步,重启prometheus,在启动命令参数里面加上 --web.config.file=./web.yml
./prometheus --web.config.file=./web.yml --web.listen-address="192.168.223.10:19090" --web.enable-lifecycle --storage.tsdb.retention=30d &
最后,我们通过浏览器来访问prometheus的URL地址时,会先弹出一个登录窗口,输入用户名(admin)和密码(你设置明文密码),即可成功访问prometheus。
另外,如果prometheus配置了basic_auth,那么将prometheus作为数据源配置到Grafana时,也需要将basic_auth的信息配置到Grafana里面,如下图所示。
参考:
https://prometheus.io/docs/guides/basic-auth/