Prometheus 未授权访问漏洞处理(basic_auth_users)
背景
经常收到甲方的各种安全漏洞通知单,这次就是几年前部署的prometheus未授权访问漏洞。
漏洞现象
分析
prometheus收集所有exporter的指标数据,汇总后通常由grafana去调用它,界面来展示,类似与kibana。当然也有可能是其他组件来调用,本项目主要只有grafana去调用它,且grafana也部署在本机,其实处理的办法也很简单,防火墙启动起来,只允许本机调用,对外接口不暴露,就能解决问题。但这不是解决问题的初衷。既然是未授权访问,那就加上身份的认证来解决问题。关键参数:Basic Auth。
通过Basic Auth功能进行加密,在浏览器登录UI的时候需要输入用户密码,访问Prometheus api的时候也需要加上用户密码。
生产的prometheus版本2.17.1,版本太古老,Prometheus于2.24版本(包括2.24)之后提供Basic Auth功能进行加密访问,因此还需要做个升级。(跨大版本的升级,不考虑历史数据的兼容问题,不保留历史数据)
升级
##下载升级包地址
wget https://github.com/prometheus/prometheus/releases/download/v3.0.0/prometheus-3.0.0.linux-amd64.tar.gz
##解压
tar -zxf prometheus-3.0.0.linux-amd64.tar.gz
cd prometheus-3.0.0.linux-amd64
mv prometheus.yml prometheus.yml_bak
##拷贝生产prometheus.yml到新版目录下
cp ../prometheus-2.17.1.linux-amd64/prometheus.yml .
##修改systemctl配置文件
vim /etc/systemd/system/multi-user.target.wants/prometheus.service
-----
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus-3.0.0.linux-amd64/prometheus \
--config.file=/usr/local/prometheus-3.0.0.linux-amd64/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus-3.0.0.linux-amd64/data \
--web.console.templates=/usr/local/prometheus-3.0.0.linux-amd64/consoles \
--web.console.libraries=/usr/local/prometheus-3.0.0.linux-amd64/console_libraries \
--storage.tsdb.retention.time=90d
Restart=on-failure
[Install]
WantedBy=multi-user.target
-----
cd ..
chown -R prometheus:prometheus prometheus-3.0.0.linux-amd64
systemctl daemon-reload
systemctl stop prometheus
systemctl start prometheus
查看targets,收集的指标数据也都上来了(图略)
查阅官方文档
参考:https://prometheus.io/docs/prometheus/latest/configuration/https/
意思是说,prometheus是支持这种基础的身份验证的方式和TLS,但这个将来将会改变。需要将配置写到yaml格式的文件里面,再通过--web.config.file来调用文件。
参考:https://prometheus.io/docs/prometheus/latest/command-line/prometheus/
配置身份认证
生成bcrypt哈希值
yum -y install httpd-tools
htpasswd -nBC 12 ‘’ | tr -d ‘:\n’
强烈建议密码写到草稿上,再复制粘贴进去两遍
配置密码配置文件
touch web-auth.yml
vim web-auth.yml
basic_auth_users:
admin: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
验证文件语法是否正确
./promtool check web-config web-auth.yml
修改systemctl配置文件
vim /etc/systemd/system/multi-user.target.wants/prometheus.service
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/prometheus-3.0.0.linux-amd64/prometheus \
--config.file=/usr/local/prometheus-3.0.0.linux-amd64/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus-3.0.0.linux-amd64/data \
--web.console.templates=/usr/local/prometheus-3.0.0.linux-amd64/consoles \
--web.console.libraries=/usr/local/prometheus-3.0.0.linux-amd64/console_libraries \
--storage.tsdb.retention.time=90d \
--web.config.file=/usr/local/prometheus-3.0.0.linux-amd64/web-auth.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl restart prometheus
重启服务
服务启动正常
验证
http://127.0.0.1:9090/metrics
http://127.0.0.1:9090
不输入密码提示
输入密码后:
适配grafana
配置grafana-yum源
参考https://grafana.com/docs/grafana/latest/setup-grafana/installation/redhat-rhel-fedora/
或者直接执行
sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-11.3.0-1.x86_64.rpm
参考https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1
systemctl restart grafana-server
登录grafana页面配置数据源
点测试
查看面板
数据展示没问题,部分数据库无法正常显示,可能是是node_exporter也需要升级,可能是采集数据的字段有变化,或者grafana的json也需要改,这是后话了,有时间再折腾。