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_roprom_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禁止外网访问。
- 统一使用代理入口,结合日志与审计系统建立追溯。