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-SecurityContent-Security-Policy 等。
- 非法Host或非白名单IP访问 /admin 返回 403deny


排错要点(含命令)#

# 检查配置语法
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日志的接收配置。


练习#

  1. /api 路径设置更严格的 Content-Security-Policy,只允许加载 selfhttps://cdn.example.com
  2. 增加一个黑名单IP段(如 203.0.113.0/24),确保被拒绝访问。
  3. 编写一个脚本,每次修改配置后自动执行语法检查并重载服务。
#!/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终止后统一实施安全头与访问控制策略,并通过命令、验证与排错流程确保配置可用。