Nginx 安全 Headers 配置实战:全方位加固网站安全

适用场景

本教程适用于所有使用 Nginx 作为 Web 服务器的网站管理员和安全运维人员。无论你是运营个人博客、企业官网还是电商平台,通过配置 HTTP 安全 Headers(安全响应头),可以有效防御 XSS(跨站脚本攻击)、点击劫持、MIME 类型嗅探、中间人攻击等多种常见 Web 攻击。适合在 Nginx 反向代理、负载均衡或独立 Web 服务器环境中实施。

前置条件

  • 拥有 Nginx 服务器的 root 或 sudo 访问权限
  • 已安装 Nginx(版本 1.10+,推荐 1.18+)
  • 熟悉 Nginx 配置文件结构(nginx.conf 和站点 conf 文件)
  • 建议先在测试环境验证,再上线生产服务器

原理说明

HTTP 安全 Headers 是服务器在 HTTP 响应头中携带的安全指令,浏览器收到后会据此增强安全策略。核心原理如下:

  • Content-Security-Policy (CSP):白名单机制,控制浏览器仅加载可信来源的资源(脚本、样式、字体等),从源头阻止 XSS 注入
  • X-Frame-Options:禁止页面被嵌入 <frame> 或 <iframe>,彻底防御点击劫持攻击
  • X-Content-Type-Options: nosniff:强制浏览器遵循声明的 Content-Type,防止 MIME 类型混淆攻击
  • Strict-Transport-Security (HSTS):强制浏览器仅通过 HTTPS 连接,阻止 SSL Stripping 中间人攻击
  • Referrer-Policy:控制 Referer 头携带的信息量,保护用户隐私和防止路径泄露
  • Permissions-Policy:精细控制浏览器 API 权限(摄像头、麦克风、地理位置等),减少攻击面

操作步骤

步骤 1:定位 Nginx 配置文件

首先确认你的 Nginx 配置所在位置:

# 查找主配置文件
sudo nginx -t 2>&1 | grep "test failed" || sudo nginx -t 2>&1
# 典型路径
ls /etc/nginx/nginx.conf
ls /etc/nginx/conf.d/
ls /etc/nginx/sites-available/

步骤 2:在 server 块中添加安全 Headers

编辑你的站点配置文件(例如 /etc/nginx/sites-available/wafai.conf),在 server 块内location 块外部添加以下配置:

server {
    listen 443 ssl http2;
    server_name www.wafai.cn;

    # ===== HTTP 安全 Headers 配置开始 =====

    # HSTS:强制 HTTPS,有效期 1 年,覆盖子域名
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # 禁止页内嵌入 iframe(点击劫持防御)
    add_header X-Frame-Options "SAMEORIGIN" always;

    # 禁止 MIME 类型嗅探
    add_header X-Content-Type-Options "nosniff" always;

    # 启用 XSS 过滤器(现代浏览器已废弃,保留以兼容旧版)
    add_header X-XSS-Protection "1; mode=block" always;

    # 内容安全策略:仅加载同源资源 + 可信 CDN
    add_header Content-Security-Policy "
        default-src 'self';
        script-src 'self' 'unsafe-inline' https://www.googletagmanager.com;
        style-src 'self' 'unsafe-inline';
        img-src 'self' data: https:;
        font-src 'self';
        connect-src 'self';
        frame-ancestors 'self';
        form-action 'self';
    " always;

    # 控制 Referer 信息
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # 权限策略:关闭非必要 API
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;

    # ===== 安全 Headers 配置结束 =====

    # 原有配置继续...
    location / {
        proxy_pass http://127.0.0.1:8080;
        # ...
    }
}

步骤 3:验证配置语法并重载 Nginx

# 检查语法
sudo nginx -t

# 语法无误则重载
sudo systemctl reload nginx
# 或
sudo nginx -s reload

步骤 4:使用 curl 验证 Headers 生效

# 查看响应头
curl -sI https://www.wafai.cn | grep -iE "^(strict-transport|content-security|x-frame|x-content|x-xss|referrer|permissions-policy)"

# 期望输出示例:
# strict-transport-security: max-age=31536000; includeSubDomains; preload
# content-security-policy: default-src 'self'; script-src 'self' ...
# x-frame-options: SAMEORIGIN
# x-content-type-options: nosniff
# referrer-policy: strict-origin-when-cross-origin

步骤 5:在线工具检测

使用 Mozilla Observatory(https://observatory.mozilla.org/)扫描你的域名,获取安全评分和改进建议。评分 A+ 为最佳。

配置验证

完成上述步骤后,请逐一确认以下检查点:

  1. nginx -t 返回 syntax is oktest is successful
  2. 浏览器开发者工具(Network 标签)中,响应头包含所有配置的安全 Headers
  3. 网站功能正常:页面渲染、表单提交、第三方统计(如 Google Analytics)未因 CSP 被阻断
  4. Mozilla Observatory 评分达到 B 以上,目标 A

常见问题(FAQ)

Q1:配置 CSP 后网站样式或 JS 失效了怎么办?

CSP 策略过于严格会导致部分资源被浏览器拦截。排查方法:打开浏览器控制台(F12),查看 Console 中的 CSP 报错信息,明确被拦截的资源来源,然后在对应指令中添加白名单。例如 Google Analytics 需要 script-src 'self' https://www.googletagmanager.com。建议使用 Content-Security-Policy-Report-Only 先监控模式验证,确认无误后再切换为强制模式。

Q2:配置 HSTS 后 HTTP 访问完全不可用了怎么办?

HSTS 生效后浏览器会强制 HTTPS。如果服务器同时需要支持 HTTP 到 HTTPS 的 301 跳转,请确保:① HTTP 80 端口监听正常;② 在 HTTP server 块中配置 301 重定向(return 301 https://$host$request_uri;)。如需回退,可在浏览器地址栏输入 chrome://net-internals/#hsts 查询并删除域名 HSTS 设置,同时将服务器 HSTS 的 max-age 改为较小的值(如 300 秒)重新部署。

总结

通过 Nginx 配置 HTTP 安全 Headers,可以在服务器层面为网站加上一道重要的安全防线。本文涉及的 7 个核心 Header(HSTS、X-Frame-Options、X-Content-Type-Options、CSP、Referrer-Policy、Permissions-Policy、X-XSS-Protection)覆盖了从传输加密到内容隔离的主流安全防护需求。建议将配置纳入 CI/CD 部署流程,并使用 Mozilla Observatory 定期扫描以确保安全基线不退化。