17.10.3 基本认证与反向代理接入控制
基本认证与反向代理接入控制#
Prometheus/Alertmanager默认无强认证,生产环境推荐通过反向代理实现Basic Auth、TLS、IP白名单、速率限制与审计。以下给出结构示意、安装与配置示例、排错与练习。
原理草图(反向代理承载认证)
1)安装与准备(Nginx + htpasswd)
# 安装Nginx与htpasswd工具(以Ubuntu为例)
sudo apt-get update
sudo apt-get install -y nginx apache2-utils
# 生成认证文件(-c表示创建文件,后续添加用户去掉-c)
sudo htpasswd -c /etc/nginx/conf.d/prometheus.htpasswd prom_ro
# 输入密码后生成哈希
# 添加只读用户(示例)
sudo htpasswd /etc/nginx/conf.d/prometheus.htpasswd prom_readonly
命令解释
- htpasswd:生成/维护Basic Auth凭据文件。
- -c:创建新文件;已有文件勿用,否则覆盖。
2)Nginx反向代理完整示例(含TLS、白名单、限流)
# /etc/nginx/conf.d/prometheus.conf
# 先定义限流与白名单(可选)
limit_req_zone $binary_remote_addr zone=prom_api:10m rate=5r/s;
server {
listen 443 ssl;
server_name prom.example.com;
ssl_certificate /etc/nginx/ssl/prom.crt;
ssl_certificate_key /etc/nginx/ssl/prom.key;
# Basic Auth
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/conf.d/prometheus.htpasswd;
# 白名单:仅允许内网与办公网
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
# 反向代理到Prometheus
location / {
proxy_pass http://127.0.0.1:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 限流防护
limit_req zone=prom_api burst=20 nodelay;
}
# 关键API可单独加强策略
location /api/v1/admin/tsdb {
deny all;
}
}
# 可选:HTTP跳转HTTPS
server {
listen 80;
server_name prom.example.com;
return 301 https://$host$request_uri;
}
应用并验证
sudo nginx -t
sudo systemctl reload nginx
# 验证访问(正确账号应返回200)
curl -u prom_ro:YOUR_PASS https://prom.example.com/-/healthy
# 未认证访问应返回401
curl -I https://prom.example.com/
3)HAProxy反向代理示例(Basic Auth + ACL)
# /etc/haproxy/haproxy.cfg
global
log /dev/log local0
defaults
mode http
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
userlist PromUsers
user prom_ro password $6$xxxxx... # 使用mkpasswd/openssl生成hash
frontend fe_prom
bind *:8443 ssl crt /etc/haproxy/ssl/prom.pem
acl allowed_net src 10.0.0.0/8 192.168.0.0/16
http-request deny if !allowed_net
http-request auth realm Prometheus if !{ http_auth(PromUsers) }
acl deny_admin path_beg /api/v1/admin/tsdb
http-request deny if deny_admin
default_backend be_prom
backend be_prom
server prom1 127.0.0.1:9090 check
4)Grafana/Alertmanager接入示例
# Grafana数据源配置示例(UI中等价设置)
# URL: https://prom.example.com
# Basic Auth: Enable
# User: prom_ro
# Password: ******
5)排错要点与命令
# 1. 401 Unauthorized:检查htpasswd路径与用户名
sudo tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# 2. 502 Bad Gateway:Prometheus未监听或被防火墙阻断
sudo ss -lntp | grep 9090
curl -I http://127.0.0.1:9090/-/healthy
# 3. 证书问题:检查证书链与有效期
openssl x509 -in /etc/nginx/ssl/prom.crt -noout -dates -issuer -subject
现象与处理
- 401:认证失败或未携带Basic Auth。
- 502:后端Prometheus不可达或地址配置错误。
- SSL错误:证书链不完整或过期。
6)练习
1. 使用htpasswd创建prom_ro与prom_admin,并在Nginx中分别限制不同路径访问。
2. 为/api/v1/query配置限流,验证高频请求被429或延迟。
3. 将Prometheus监听改为127.0.0.1,确认仅能通过反向代理访问。
7)关键命令速查
# 创建/更新密码
htpasswd -c /etc/nginx/conf.d/prometheus.htpasswd prom_ro
htpasswd /etc/nginx/conf.d/prometheus.htpasswd prom_readonly
# 测试Basic Auth
curl -u prom_ro:PASS https://prom.example.com/api/v1/targets
# Nginx配置检查与重载
nginx -t && systemctl reload nginx
最佳实践
- Prometheus仅监听内网或回环地址;认证与TLS由代理统一承载。
- API与UI分离策略:敏感API禁止外网访问。
- 统一使用代理入口,结合日志与审计系统建立追溯。