如何在 Nginx 中配置安全标头

在 NGINX 中配置安全标头对于增强 Web 应用程序的安全性至关重要。安全标头可防御各种攻击,例如跨站点脚本 (XSS)、点击劫持和其他代码注入攻击。它们指示浏览器如何处理您网站的内容,从而提供额外的安全保障。

本指南将引导您完成在 NGINX 中配置安全标头的步骤,帮助您保护您的 Web 应用程序并提高整体安全性。

在 NGINX 中实现 HTTP 严格传输安全 (HSTS)

了解 HSTS

HTTP 严格传输安全 (HSTS) 是一种重要的网站安全协议。它强制要求与域的连接完全通过 HTTPS。这可以减轻中间人攻击等风险,并确保在线传输的数据的完整性和机密性。当用户尝试通过 HTTP 访问网站时,HSTS 会自动将连接升级到 HTTPS。

在 NGINX 中配置 HSTS

要在 NGINX 中设置 HSTS,您必须更新 NGINX 配置文件中的服务器块。此文件通常位于 /etc/nginx/nginx.conf 或位于 /etc/nginx/sites-available/ 的站点特定配置中。更新涉及添加一个标头,指示浏览器始终对指定域使用 HTTPS。

在您的域的服务器块中,添加以下行:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

此行包含两个部分:

  • max-age=31536000:指示浏览器记住在接下来的 12 个月内对您的网站使用 HTTPS。
  • includeSubDomains:将 HSTS 策略应用于您网站的所有子域,以实现全面的安全保障。

带有 HSTS 的 NGINX 配置示例

带有 HSTS 标头的 NGINX 配置可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
        proxy_pass http://my_portal;
    }
}

添加此标头后,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新加载 NGINX 以生效更改。

额外的NGINX配置例子

对于不同的场景,您的 NGINX 配置与 HSTS 可能会有所不同。以下是其他示例:

多域服务器

server {
    listen 80;
    server_name example1.com example2.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
        # Configuration details
    }
}

此配置将 HSTS 应用于托管在同一服务器上的多个域。列出的每个域都将强制实施 HTTPS 连接。

具有 SSL 终止功能的服务器

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/private/key;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
        # Configuration details
    }
}

此设置适用于处理 SSL 终止的服务器。它使用指定的 SSL 证书在安全端口 (443) 上配置 HSTS,以加强安全连接。

在 NGINX 中配置内容安全策略 (CSP)

在 NGINX 中实现 CSP

将内容安全策略 (CSP) 集成到 NGINX 是增强 Web 应用程序安全性的一项战略举措。它涉及在 NGINX 配置文件的服务器块中添加特定标头。此文件通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目录中,需要仔细编辑才能有效应用 CSP。

对于基本的 CSP 设置,请在服务器块中添加以下行:

add_header Content-Security-Policy "default-src 'self';" always;

该指令将内容加载限制在网站的域(“自身”)内,大大降低了恶意外部内容执行的风险。

带有 CSP 的 NGINX 配置示例

使用基本 CSP 指令的 NGINX 配置可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Content-Security-Policy "default-src 'self';" always;

    location / {
        proxy_pass http://my_portal;
    }
}

添加此指令后,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新加载 NGINX。

根据特定需求定制 CSP

CSP 可以根据您网站的特定安全需求进行定制。以下是针对不同场景的扩展配置:

允许任何来源的图像

add_header Content-Security-Policy "default-src 'self'; img-src *;" always;

此配置允许从任何来源加载图像,同时对其他类型的内容进行严格控制。

特定脚本和样式配置

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trustedscript.com; style-src 'self' 'unsafe-inline';";

此设置允许来自您的域和受信任的外部源的脚本以及内联样式,从而平衡功能和安全性。

探索 CSP 指令和选项

CSP 中的指令

CSP 指令是定义特定内容类型的政策的规则。常见指令包括:

  • default-src:适用于大多数内容类型的默认策略。
  • script-src:控制 JavaScript 资源的来源。
  • style-src:指定允许的 CSS 资源源。
  • img-src:控制图像资源的来源。
  • connect-src:设置网络连接策略,如 XMLHttpRequest、WebSocket 和 EventSource。

CSP 中的源表达式

源表达式定义了每个指令的允许源:

  • ‘none’:阻止所有来源。
  • ‘self’:允许来自同一来源的资源。
  • 'unsafe-inline':允许内联资源,例如样式或 JavaScript URL。
  • ‘unsafe-eval’:允许 JavaScript eval() 函数和类似的方法。
  • https:: 启用来自任何 HTTPS URL 的资源。

在 NGINX 中配置 X-XSS 保护

X-XSS-Protection 简介

X-XSS-Protection,即跨站点脚本标头,对于保护 Web 应用程序免受 XSS(跨站点脚本)攻击至关重要。此标头受到 Chrome、Internet Explorer 和 Safari 等主流 Web 浏览器的支持,当检测到反射式 XSS 攻击时,它会阻止加载页面,从而增强 Web 安全性。

在 NGINX 中启用 X-XSS 保护

将 X-XSS-Protection 标头集成到您的 NGINX 服务器配置中可增强浏览器的原生 XSS 保护。要启用此安全功能,请访问您的 NGINX 配置文件,该文件通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目录中。

在 NGINX 配置文件的服务器块中,插入此指令:

add_header X-XSS-Protection "1; mode=block";

该指令包括两部分:

  • 1:激活浏览器的 XSS 过滤器。
  • mode=block:如果检测到 XSS 攻击,则指示浏览器阻止该页面,而不是尝试对其进行清理。

具有 X-XSS 保护的 NGINX 配置示例

包含 X-XSS-Protection 的 NGINX 配置示例可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header X-XSS-Protection "1; mode=block";

    location / {
        proxy_pass http://my_portal;
    }
}

添加此标头后,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新加载 NGINX。

其他 NGINX 配置方案

对于具有 SSL 的服务器

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/private/key;
    add_header X-XSS-Protection "1; mode=block";

    # Further configuration
}

此设置适用于具有 SSL 的服务器,确保 X-XSS-Protection 在加密连接上处于活动状态。

处理多个域

server {
    listen 80;
    server_name example1.com example2.com;
    add_header X-XSS-Protection "1; mode=block";

    # Further configuration
}

此配置将 X-XSS 保护应用于单个服务器上托管的多个域。

在 NGINX 中配置 X-Frame-Options

X-Frame-Options 的作用

X-Frame-Options 是一个重要的安全标头,旨在保护网站免受点击劫持攻击。它可以防止网页显示在框架或 iframe 中,而这些框架或 iframe 经常用于此类攻击。所有主流网络浏览器都支持 X-Frame-Options,它提供广泛的保护,增强您在不同平台上的网络安全性。

在 NGINX 中实现 X-Frame-Options

在 NGINX 服务器配置中加入 X-Frame-Options 标头对于增强站点的安全性至关重要。此任务涉及编辑 NGINX 配置文件,该文件通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目录中。

要启用此安全功能,请将以下指令添加到 NGINX 配置文件中的服务器块:

add_header X-Frame-Options "DENY";

该指令设置为“DENY”,指示浏览器阻止任何在框架或 iframe 中呈现页面的尝试,从而提供强大的点击劫持防御。

使用 X-Frame-Options 的 NGINX 配置示例

带有 X-Frame-Options 标头的 NGINX 设置示例如下:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header X-Frame-Options "DENY";

    location / {
        proxy_pass http://my_portal;
    }
}

添加此标头后,必须重新加载 NGINX 以激活更改。可以使用 sudo systemctl reload nginx 或 sudo nginx -s reload 完成此操作。

扩展 NGINX 的 X-Frame-Options 配置

对于启用 SSL 的服务器

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/private/key;
    add_header X-Frame-Options "DENY";

    # Additional configuration
}

此配置适用于具有 SSL 的服务器,确保在安全连接上强制执行 X-Frame-Options。

处理多个域

server {
    listen 80;
    server_name example1.com example2.com;
    add_header X-Frame-Options "DENY";

    # Additional configuration
}

此设置将 X-Frame-Options 标头应用于同一服务器上的多个域,从而增强每个域的安全性。

在 NGINX 中实现 X-Content-Type-Options

X-Content-Type-Options 的作用

X-Content-Type-Options 是网络安全中一个至关重要的安全标头,可防止浏览器嗅探 MIME 类型。此标头强调浏览器尊重 HTTP 标头中声明的内容类型,解决了浏览器误解文件类型时可能出现的安全漏洞,例如将图像文件视为可执行 HTML,这可能导致跨站点脚本 (XSS) 攻击。

在 NGINX 中设置 X-Content-Type-Options

要使用 X-Content-Type-Options 标头增强 Web 服务器的安全性,您需要直接修改 NGINX 配置文件。此文件通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 中的站点特定配置中。

通过将以下行添加到 server NGINX 配置块:

add_header X-Content-Type-Options "nosniff";

“nosniff”设置指示浏览器严格遵循服务器指定的内容类型,防止对内容进行其他解释。

使用 X-Content-Type-Options 的 NGINX 配置示例

具有 X-Content-Type-Options 的 NGINX 配置可能结构如下:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header X-Content-Type-Options "nosniff";

    location / {
        proxy_pass http://my_portal;
    }
}

更新配置后,请确保重新加载 NGINX 以使更改生效,使用 sudo systemctl reload nginx 或 sudo nginx -s reload。

扩展的NGINX配置示例

SSL/TLS 配置

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/key.pem;
    add_header X-Content-Type-Options "nosniff";

    # Additional SSL configurations and locations
}

此设置适用于具有 SSL/TLS 的服务器,在安全连接上应用 X-Content-Type-Options 以增强安全性。

多域服务器配置

server {
    listen 80;
    server_name example1.com example2.com;
    add_header X-Content-Type-Options "nosniff";

    # Additional configurations for multiple domains
}

此配置将 X-Content-Type-Options 标头应用于同一服务器上托管的多个域,确保所有域的安全设置一致。

在 NGINX 中配置 Referrer-Policy

推荐人政策的作用

Referrer-Policy 是增强网络上用户隐私和安全性的重要 HTTP 标头。它控制用户从您的网站导航到其他网站时在 Referer 标头中包含多少引荐信息,从而保护敏感信息免于在网络请求中泄露。

在 NGINX 中设置 Referrer-Policy

要在 NGINX 服务器中实现 Referrer-Policy 标头,请修改 NGINX 配置文件,该文件通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目录中。将以下指令添加到服务器块:

add_header Referrer-Policy "no-referrer";

该指令设置为“no-referrer”,确保在网站导航期间不发送引荐来源信息,从而最大限度地保护隐私。

带有 Referrer-Policy 的 NGINX 配置示例

带有 Referrer-Policy 标头的 NGINX 配置可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Referrer-Policy "no-referrer";

    location / {
        proxy_pass http://my_portal;
    }
}

添加此标头后,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 等命令重新加载 NGINX。

推荐人政策选项和定义

  • no-referrer:不发送引荐来源信息。
  • no-referrer-when-downgrade(默认):发送同源目标或来自安全页面的安全(HTTPS)目标 URL 的引荐来源信息。
  • origin:仅发送来源(方案、主机和端口)。
  • origin-when-cross-origin:对于同源请求,发送完整的 URL,但对于其他情况,仅发送源。
  • same-origin:对于同源请求发送完整的引荐来源,但是对于跨源请求不发送标头。
  • strict-origin:发送 HTTPS 请求的来源,但不发送 HTTP 请求的标头。
  • strict-origin-when-cross-origin:向同源请求发送完整的引荐来源,从 HTTPS 页面向 HTTPS 目标发送原点,向 HTTP 目标发送无标头。
  • unsafe-url:无论来源或安全性如何,都发送完整的 URL(不推荐)。

扩展的NGINX配置示例

SSL/TLS 配置

server {
    listen 443 ssl;
    server_name secure.example.com;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/key.pem;
    add_header Referrer-Policy "no-referrer";

    # Additional SSL configurations
}

此配置在安全的支持 SSL/TLS 的环境中应用 Referrer-Policy 标头,从而增强加密连接的隐私。

多域服务器配置

server {
    listen 80;
    server_name example1.com example2.com;
    add_header Referrer-Policy "no-referrer";

    # Additional configurations for each domain
}

此设置可确保 Referrer-Policy 标头应用于同一服务器上托管的多个域,从而保持一致的隐私设置。

在 NGINX 中实现权限策略

理解权限策略

Permissions-Policy 标头使网络管理员能够精确控制其网站上的浏览器功能和 API。配置此标头可显著增强网站安全性和隐私性,并根据网站的特定需求启用地理位置、摄像头和麦克风等功能限制。

在 NGINX 中配置权限策略

要将 Permissions-Policy 标头合并到您的 NGINX 服务器中,请修改 NGINX 配置文件,该文件通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目录内。

将以下指令添加到服务器块:

add_header Permissions-Policy "geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();";

此指令列出了各种浏览器功能和 API,将它们全部设置为 (),从而有效地禁用它们。此配置提供了一种全面的方法来限制可能危及用户隐私或安全的功能。

具有权限策略的 NGINX 配置示例

以下是 NGINX 配置中带有 Permissions-Policy 标头的示例:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();";

    location / {
        proxy_pass http://my_portal;
    }
}

该指令全面列出了各种浏览器功能和 API,将它们设置为 () 即可有效地禁用它们。

具有权限策略的 NGINX 配置示例

您的 NGINX 配置(包括 Permissions-Policy)可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();";

    location / {
        proxy_pass http://my_portal;
    }
}

进行这些更改后,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新加载 NGINX。

权限策略选项说明

Permissions-Policy 标头允许您自定义各种功能的使用:

  • 地理位置:控制对地理位置数据的访问。
  • 米迪:管理对 MIDI 设备的访问。
  • 通知:控制通知的显示。
  • :影响推送通知功能。
  • 同步-xhr:与同步 XMLHTTPRequest 相关。
  • 加速度计:指示对设备加速度计的访问。
  • 陀螺仪:控制陀螺仪访问。
  • 磁力仪:管理对设备磁力计的访问。
  • 支付:适用于付款请求功能。
  • USB:控制对 USB 设备的访问。
  • 虚拟现实:涉及虚拟现实功能。
  • 相机:管理相机访问。
  • 麦克风:决定麦克风访问权限。
  • 扬声器:控制对扬声器设备的访问。
  • 颤动:影响振动API。
  • 环境光传感器:与环境光传感器相关。
  • 自动播放:控制媒体的自动播放。
  • 加密媒体:管理加密媒体访问。
  • 执行剪贴板:控制剪贴板的读/写访问。
  • 文档域:与 document.domain 功能有关。
  • 全屏:指示全屏访问。
  • 图像捕捉:控制图像捕获功能。
  • 惰性加载:影响图像的延迟加载。
  • 遗留图像格式:与传统图像格式相关。
  • 超大图像:控制超大图像的加载。
  • 未优化的有损图像:管理未优化的有损图像。
  • 未优化的无损图像:涉及未优化的无损图像。
  • 未上浆介质:控制没有明确尺寸的媒体。
  • 垂直滚动:影响垂直滚动。
  • 网络共享:与网络共享功能相关。
  • xr-空间追踪:控制 XR 空间跟踪。

NGINX 中的权限策略高级配置

使用特定域和通配符配置权限策略

除了使用 () 禁用功能的基本设置外,NGINX 中的权限策略还可以定制为允许来自特定域或使用通配符的某些功能。此高级配置允许对您的网站可以访问的内容和位置进行更细致的控制。

示例:允许特定域的功能

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "geolocation=(https://trusteddomain.com), microphone=(https://alloweddomain.com)";

    location / {
        proxy_pass http://my_portal;
    }
}

此配置仅允许从 https://trusteddomain.com 访问地理位置数据,仅允许从 https://alloweddomain.com 访问麦克风,通过将这些敏感功能限制在受信任的来源来增强安全性。

示例:使用通配符获得广泛权限

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "camera=*; fullscreen=*";

    location / {
        proxy_pass http://my_portal;
    }
}

此设置中的通配符 * 允许从任何域访问相机和全屏模式。此方法提供更广泛的权限,适合需要从各种来源访问大量功能的网站。

示例:组合限制和权限

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "accelerometer=(); gyroscope=(self https://example2.com); payment=*";

    location / {
        proxy_pass http://my_portal;
    }
}

在此配置中,加速度计访问被禁用,允许从同一域和 https://example2.com 访问陀螺仪,并允许从所有域发出付款请求。

在 NGINX 中使用 Curl 命令验证安全标头

使用 Curl 检查安全标头

curl 命令是用于验证 NGINX 服务器中安全标头配置的有用工具。它允许您检查网站的标头并确认安全标头是否正确设置。此验证步骤对于确保您的 Web 服务器的安全措施有效且按预期运行至关重要。

执行 Curl 命令进行标头验证

要检查您的网站的标题,请在终端中执行以下命令:

curl -I http://example.com

将 example.com 替换为您的域名。此命令从您的服务器请求标头,从而深入了解活动安全配置。

预期输出和解释

运行 curl 命令后,您应该收到类似以下内容的输出:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Mar 2023 00:00:00 GMT
Content-Type: text/html
Connection: keep-alive
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy: default-src 'self';
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer
Permissions-Policy: geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();"

此输出确认服务器上各种安全标头的存在和正确配置,例如 Strict-Transport-Security、Content-Security-Policy、X-XSS-Protection 等。输出中列出的每个标头在保护您的 Web 服务器免受各种 Web 漏洞攻击方面都发挥着特定的作用。

结论

通过在 NGINX 中配置安全标头,您可以显著增强 Web 应用程序的安全性。定期检查和更新安全标头,以适应不断变化的安全威胁。实施这些标头有助于防范各种攻击,并确保用户获得更安全的浏览体验。保持警惕并保持 NGINX 配置最新,以可靠地保护您的 Web 资产。

Joshua James
跟我来
Joshua James 的最新帖子 (查看全部)

发表评论