适用场景
本教程适用于所有使用 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+ 为最佳。
配置验证
完成上述步骤后,请逐一确认以下检查点:
- nginx -t 返回
syntax is ok且test is successful - 浏览器开发者工具(Network 标签)中,响应头包含所有配置的安全 Headers
- 网站功能正常:页面渲染、表单提交、第三方统计(如 Google Analytics)未因 CSP 被阻断
- 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 定期扫描以确保安全基线不退化。