给 HAProxy 的管理接口或特定后端路径加上 Basic Auth,最稳妥的做法是在配置文件中定义 userlist 并通过 http-request auth 指令调用,同时务必配合 HTTPS 使用,避免凭证明文传输。
先说结论:通过 userlist 定义用户密码,在 frontend 或 listen 段使用 http-request auth 拦截请求,适合保护 stats 页面或后台管理路径。
- 适合:HAProxy 2.x 及以上版本,需要简单访问控制的内部管理界面
- 先准备:openssl 生成密码哈希,必须配置 SSL 证书
- 验收:curl 测试无密码被拒、有密码通行,检查 HAProxy 日志
命令速用版
这里直接给出配置片段,替换到你的 haproxy.cfg 中,注意将密码哈希替换为实际生成的值,并确保 SSL 证书路径正确:
global
...
frontend https_front
# 绑定 443 端口并加载 SSL 证书
bind *:443 ssl crt /etc/haproxy/certs/example.pem
# 定义用户列表 (HAProxy 2.x+ 支持在 frontend 内定义)
userlist admin_users
user admin password $apr1$xxxxxxxxxxxxxx
# 应用认证,例如保护 /admin 路径
http-request auth realm AdminArea if { path_beg /admin } if !{ http_auth(admin_users) }
default_backend web_servers为什么要配合 HTTPS
管理接口通常权限较高,直接暴露在公网或内网大段中风险很大。HAProxy 作为入口网关,在这里做认证可以避免后端服务单独实现认证逻辑,统一管控入口。Basic Auth 的账号密码仅做 Base64 编码,若无 HTTPS,抓包即可见明文。配合 TLS 加密传输,能有效阻挡未授权访问,且配置成本较低。
分步处理
1. 生成密码哈希:不要明文存密码,使用 openssl 生成兼容性较好的哈希。
openssl passwd -apr1 your_secure_password2. 准备 SSL 证书:HAProxy 需要将证书和私钥合并为一个 PEM 文件。
cat domain.crt domain.key > /etc/haproxy/certs/example.pem
chmod 600 /etc/haproxy/certs/example.pem3. 编辑配置文件:在 global 段或 frontend 段上方定义 userlist,将上一步生成的哈希填入。注意 HAProxy 2.x 版本才支持在 frontend 内定义 userlist,旧版本建议放在 global 段。
userlist my_admins
user testuser password $apr1$...4. 调用认证规则:在需要保护的 frontend 或 listen 段添加 http-request auth。注意逻辑判断,避免误伤正常流量。
http-request auth realm Restricted if { path_beg /manage } if !{ http_auth(my_admins) }5. 重载配置:检查语法无误后重载服务,避免配置错误导致服务中断。
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl reload haproxy怎么验证是否生效
使用 curl 不带密码访问,应返回 401 Unauthorized;带密码访问,应返回 200 或后端实际状态码。注意必须使用 HTTPS 协议测试。
curl -I -k https://your-ip/manage
curl -I -k -u testuser:password https://your-ip/manage同时查看 HAProxy 日志,确认是否有认证失败的记录。
常见坑
- 明文传输风险:Basic Auth 若无 HTTPS,抓包即可见明文,务必绑定 SSL 证书。
- 锁死自己:配置错误可能导致管理员无法访问,建议先在一个测试路径验证,再应用到全局管理入口。
- 哈希算法兼容:不同 HAProxy 版本支持的密码哈希算法可能不同,推荐使用 apr1 或 SHA2,避免使用明文 insecure-password 生产环境。
- 证书权限问题:PEM 文件权限应设置为 600,仅 root 可读,防止私钥泄露。
参考来源
- HAProxy Documentation, "HAProxy Configuration Manual", https://docs.haproxy.org/