13.6.5 安全头与访问控制策略
在HAProxy完成SSL终止后,应在入口统一注入安全响应头并实施访问控制策略,形成一致的安全边界,降低后端重复配置与策略漂移风险。本节提供原理草图、完整示例配置、验证命令、排错方法与练习。
安全头与访问控制原理要点
- 安全头:通过浏览器安全策略限制脚本、资源与行为,降低XSS、点击劫持与信息泄露。
- 访问控制:基于IP、Host、路径、方法、User-Agent进行ACL匹配,最小权限放行。
安装与基础准备(命令含义说明)#
以下示例以 Ubuntu 为例:
# 安装HAProxy
sudo apt update
sudo apt install -y haproxy
# 查看版本与编译选项(确认支持http-response与ssl)
haproxy -vv
命令说明
- apt install -y haproxy:安装HAProxy服务。
- haproxy -vv:查看版本与特性,确认支持SSL终止与HTTP响应头操作。
示例:安全头注入与访问控制完整配置#
配置文件路径:/etc/haproxy/haproxy.cfg
global
log /dev/log local0
maxconn 4000
defaults
mode http
log global
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
frontend https_in
bind *:443 ssl crt /etc/haproxy/certs/site.pem
# 1) Host白名单
acl valid_host hdr(host) -i example.com api.example.com
http-request deny if !valid_host
# 2) IP白名单(管理入口)
acl admin_path path_beg /admin
acl whitelist src 10.0.0.0/8 192.168.0.0/16
http-request deny if admin_path !whitelist
# 3) 禁止空UA
acl empty_ua hdr(User-Agent) -m len 0
http-request deny if empty_ua
# 4) 安全头注入
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
http-response set-header X-Content-Type-Options "nosniff"
http-response set-header X-Frame-Options "SAMEORIGIN"
http-response set-header Referrer-Policy "no-referrer-when-downgrade"
http-response set-header Permissions-Policy "geolocation=(), microphone=()"
http-response set-header Content-Security-Policy "default-src 'self'; frame-ancestors 'self'; object-src 'none';"
default_backend web_cluster
backend web_cluster
balance roundrobin
server web1 10.10.10.11:8080 check
server web2 10.10.10.12:8080 check
关键参数解释
- bind *:443 ssl crt /etc/haproxy/certs/site.pem:在HAProxy终止SSL。
- acl valid_host hdr(host) -i ...:限定合法Host,防止Host投毒。
- http-request deny if ...:不符合策略立即拒绝。
- http-response set-header ...:统一注入安全响应头。
验证与效果检查#
# 1) 验证安全头是否注入
curl -kI https://example.com
# 2) 验证Host白名单(非法Host应被拒绝)
curl -kI https://example.com -H "Host: evil.com"
# 3) 验证管理路径IP限制(非白名单应拒绝)
curl -kI https://example.com/admin
预期效果
- 正常请求响应头包含 Strict-Transport-Security、Content-Security-Policy 等。
- 非法Host或非白名单IP访问 /admin 返回 403 或 deny。
排错要点(含命令)#
# 检查配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg
# 查看HAProxy日志(Ubuntu)
sudo tail -f /var/log/haproxy.log
# 检查监听端口
sudo ss -lntp | grep 443
常见问题
- 安全头未生效:确认前端模式为 mode http,且未被后端覆盖。
- 合法请求被拒绝:检查ACL匹配条件是否过严,hdr(host)大小写或SNI配置是否一致。
- 日志无输出:检查rsyslog对haproxy日志的接收配置。
练习#
- 为
/api路径设置更严格的Content-Security-Policy,只允许加载self与https://cdn.example.com。 - 增加一个黑名单IP段(如
203.0.113.0/24),确保被拒绝访问。 - 编写一个脚本,每次修改配置后自动执行语法检查并重载服务。
#!/usr/bin/env bash
# 文件:/usr/local/bin/haproxy-reload.sh
set -e
CFG=/etc/haproxy/haproxy.cfg
haproxy -c -f "$CFG" # 语法检查
systemctl reload haproxy # 通过后重载
echo "HAProxy reloaded OK"
以上内容可帮助在SSL终止后统一实施安全头与访问控制策略,并通过命令、验证与排错流程确保配置可用。