Active Directory 联合身份验证服务 (AD FS) 2019 添加了用于自定义 AD FS 发送的 HTTP 安全响应标头的功能。 这些工具可帮助管理员防范常见的安全漏洞,并允许管理员利用基于浏览器的保护机制的最新改进。 此功能来自引入两个新的 cmdlet: Get-AdfsResponseHeaders
和 Set-AdfsResponseHeaders
。
注释
使用 cmdlet 自定义 HTTP 安全响应标头(CORS 标头除外)的功能: Get-AdfsResponseHeaders
并 Set-AdfsResponseHeaders
已向后移植到 AD FS 2016。 可以通过安装 KB4493473 和 KB4507459将功能添加到 AD FS 2016。
本文讨论常用的安全响应标头,演示如何自定义 AD FS 2019 发送的标头。
注释
本文假定你安装了 AD FS 2019。
情境
以下方案演示了管理员可能需要自定义安全标头的需求。
- 管理员启用 HTTP Strict-Transport-Security (HSTS), 以保护可能通过使用 HTTP 从可能遭到黑客攻击的公共 wifi 接入点访问 Web 应用的用户。 HSTS 强制要求所有连接使用 HTTPS 加密。 他们希望通过为子域启用 HSTS 来进一步加强安全性。
- 管理员配置 了 X-Frame-Options 响应标头,以保护网页不被点击劫持。 X-Frame-Options 阻止在 iFrame 中呈现任何网页。 但是,由于新的业务要求(在 iFrame 中显示来自不同源(域)的应用程序中的数据),他们需要自定义标头值。
- 管理员启用 X-XSS-Protection ,以便在浏览器检测到跨脚本攻击时清理并阻止页面。 X-XSS-Protection 可防止跨脚本攻击。 但是,他们需要自定义页眉,以允许页面在清理后加载。
- 管理员需要启用 跨域资源共享(CORS),他们需要在 AD FS 上设置源(域),以允许单页应用程序使用另一个域访问 Web API。
- 管理员启用 内容安全策略(CSP) 标头,通过禁止任何跨域请求来防止跨站点脚本和数据注入攻击。 但是,由于新的业务需求,他们需要自定义标头,以允许网页从任何源加载图像,并将媒体限制为受信任的提供商。
HTTP 安全响应标头
AD FS 在发送到 Web 浏览器的传出 HTTP 响应中包含响应标头。 可以使用 Get-AdfsResponseHeaders
cmdlet 来列出标头,如以下屏幕截图所示。
屏幕截图中的 ResponseHeaders 属性标识 AD FS 在每个 HTTP 响应中包含的安全标头。 仅当 ResponseHeadersEnabled 设置为 True
(默认值)时,AD FS 才会发送响应标头。 可以将该值设置为 False
,以阻止 AD FS 在 HTTP 响应中包含任何安全标头。 但是,不建议使用此设置。 可以使用以下命令将 ResponseHeaders 设置为 False
:
Set-AdfsResponseHeaders -EnableResponseHeaders $false
HTTP Strict-Transport-Security (HSTS)
HTTP Strict-Transport-Security(HSTS)是一种 Web 安全策略机制,可帮助缓解具有 HTTP 和 HTTPS 终结点的服务的协议降级攻击和 Cookie 劫持。 它允许 Web 服务器声明 Web 浏览器或其他符合性的用户代理,应仅通过使用 HTTPS 与其交互,而绝不应通过 HTTP 协议与之交互。
Web 身份验证流量的所有 AD FS 终结点都以独占方式通过 HTTPS 打开。 因此,AD FS 可有效缓解 HTTP 严格传输安全策略机制提供的威胁。 默认情况下,不会降级为 HTTP,因为 HTTP 中没有侦听器。 可以通过设置以下参数来自定义标头:
- <max-age=>expire-time。 到期时间(以秒为单位)指定仅应使用 HTTPS 访问站点的时间。 默认值和建议值为 31536000 秒(一年)。
- includeSubDomains。 此参数是可选的。 如果指定,HSTS 规则也适用于所有子域。
HSTS 自定义
默认情况下,标头已启用并 max-age
设置为一年;但是,管理员可以修改(不建议降低 max-age
最大期限值)或通过 Set-AdfsResponseHeaders cmdlet 为子域启用 HSTS。
Set-AdfsResponseHeaders -SetHeaderName "Strict-Transport-Security" -SetHeaderValue "max-age=<seconds>; includeSubDomains"
示例:
Set-AdfsResponseHeaders -SetHeaderName "Strict-Transport-Security" -SetHeaderValue "max-age=31536000; includeSubDomains"
默认情况下, 标头包含在 ResponseHeaders 属性中;但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 删除标头。
Set-AdfsResponseHeaders -RemoveHeaders "Strict-Transport-Security"
X-Frame-Options
默认情况下,AD FS 不允许外部应用程序在执行交互式登录时使用 iFrame。 此配置可防止某些类型的网络钓鱼攻击。 由于先前建立的会话级别安全性,可以通过 iFrame 执行非交互式登录。
但是,在某些罕见情况下,你可能会信任需要支持 iFrame 的交互式 AD FS 登录页的特定应用程序。 标头 X-Frame-Options
用于此目的。
此 HTTP 安全响应标头用于与浏览器通信,是否可以在 < 框架>/<iframe> 中呈现页面。 标头可以设置为以下值之一:
- 拒绝。 框架中的页面未显示。 此配置是默认设置和建议的设置。
- sameorigin。 仅当原点与网页的原点相同时,页面才会显示在框架中。 除非所有上级也位于同一个源中,否则该选项无效。
- <allow-from >specified origin。 仅当原点(例如)
https://www.".com
与页眉中的特定源匹配时,页面才会显示在框架中。 某些浏览器可能不支持此选项。
X-Frame-Options 自定义
默认情况下,标头设置为拒绝;但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 修改该值。
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "<deny/sameorigin/allow-from<specified origin>>"
示例:
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "allow-from https://www.example.com"
默认情况下, 标头包含在 ResponseHeaders 属性中;但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 删除标头。
Set-AdfsResponseHeaders -RemoveHeaders "X-Frame-Options"
X-XSS-Protection
当浏览器检测到跨站点脚本 (XSS) 攻击时,此 HTTP 安全响应标头用于阻止网页加载。 此方法称为 XSS 筛选。 标头可以设置为以下值之一:
- 0 禁用 XSS 筛选。 不建议这样做。
- 1 启用 XSS 筛选。 如果检测到 XSS 攻击,浏览器会清理页面。
- 1;mode=block 启用 XSS 筛选。 如果检测到 XSS 攻击,浏览器将阻止页面呈现。 此设置是默认设置和建议的设置。
X-XSS-Protection 自定义
默认情况下,标头设置为 1;mode=block;。 但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 修改值。
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "<0/1/1; mode=block/1; report=<reporting-uri>>"
示例:
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "1"
默认情况下, 标头包含在 ResponseHeaders 属性中;但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 删除标头。
Set-AdfsResponseHeaders -RemoveHeaders "X-XSS-Protection"
跨源资源共享 (CORS) 标头
Web 浏览器安全性可防止网页发出从脚本中启动的跨域请求。 但是,你可能想要访问其他源(域)中的资源。 跨域资源共享 (CORS) 是一项 W3C 标准,可让服务器放宽同域策略。 通过使用 CORS,服务器可以显式允许某些跨域请求,同时拒绝其他请求。
为了更好地了解 CORS 请求,以下方案将演练单页应用程序(SPA)需要调用具有不同域的 Web API 的实例。 此外,请考虑在 AD FS 2019 上配置 SPA 和 API,并且 AD FS 已启用 CORS。 AD FS 可以在 HTTP 请求中标识 CORS 标头,验证标头值,并在响应中包含适当的 CORS 标头。 有关如何在 AD FS 2019 上启用和配置 CORS 的详细信息,请参阅 CORS 自定义部分。 以下示例流程将引导你了解场景:
用户通过客户端浏览器访问 SPA,并重定向到 AD FS 身份验证终结点进行身份验证。 由于 SPA 配置为隐式授予流,因此在身份验证成功后,请求会将 Access + ID 令牌返回到浏览器。
用户身份验证后,SPA 中包含的前端 JavaScript 发出访问 Web API 的请求。 该请求与以下标头一起重定向到 AD FS:
- 选项 - 描述目标资源的通信选项。
- 源 - 包括 Web API 的源。
- Access-Control-Request-Method - 标识在发出实际请求时要使用的 HTTP 方法(例如 DELETE)。
- Access-Control-Request-Headers - 标识在发出实际请求时要使用的 HTTP 标头。
注释
CORS 请求类似于标准 HTTP 请求。 但是,源标头的存在表明传入请求与 CORS 相关。
AD FS 验证标头中包含的 Web API 源是否在 AD FS 中配置的受信任源中列出。 有关如何修改受信任源的详细信息,请参阅 CORS 自定义。 然后,AD FS 使用以下标头进行响应:
- Access-Control-Allow-Origin - 值与 Origin 标头中的值相同。
- Access-Control-Allow-Method - 值与 Access-Control-Request-Method 标头中的值相同。
- Access-Control-Allow-Headers - 值与 Access-Control-Request-Headers 标头中的值相同。
浏览器发送实际请求,其中包括以下请求头:
- HTTP 方法(例如 DELETE)。
- 源 – 包括 Web API 的源。
- Access-Control-Allow-Headers 响应标头中包含的所有标头。
验证后,AD FS 通过在 Access-Control-Allow-Origin 响应标头中包含 Web API 域(源)批准请求。
包含 Access-Control-Allow-Origin 标头允许浏览器调用请求的 API。
CORS 自定义
默认情况下,CORS 功能未启用;但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 启用该功能。
Set-AdfsResponseHeaders -EnableCORS $true
启用后,管理员可以使用相同的 cmdlet 枚举受信任的源列表。 例如,以下命令将允许来自源 https://example1.com
和 https://example1.com
的 CORS 请求。
Set-AdfsResponseHeaders -CORSTrustedOrigins https://example1.com,https://example2.com
注释
管理员可以允许来自任何源的 CORS 请求,方法是在受信任的源列表中包括“*”,尽管不建议使用此方法,因为存在安全漏洞,如果选择这样做,则会提供警告消息。
内容安全策略 (CSP)
此 HTTP 安全响应标头用于防止跨站点脚本、点击劫持和其他数据注入攻击,防止浏览器无意中执行恶意内容。 不支持内容安全策略(CSP)的浏览器将忽略 CSP 响应标头。
CSP 自定义
CSP 标头的自定义涉及修改安全策略,该策略定义允许浏览器加载网页的资源。 默认安全策略为:
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:;
default-src 指令用于修改 -src 指令,而无需显式列出每个指令。 例如,在以下示例中,策略 1 与策略 2 相同。
策略 1
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "default-src 'self'"
策略 2
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "script-src 'self'; img-src 'self'; font-src 'self';
frame-src 'self'; manifest-src 'self'; media-src 'self';"
如果显式列出指令,则指定的值将替代为 default-src 提供的值。 在下面的示例中,img-src 将值视为“*”(允许从任何源加载图像),而其他 -src 指令将该值视为“self”(限制为网页的同一原点)。
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "default-src 'self'; img-src *"
可以为默认 src 策略定义以下源:
- 'self' - 通过指定此源,可将要加载的内容的源限制为网页的源。
- 'unsafe-inline' - 通过在策略中指定此源,可使用内联 JavaScript 和 CSS。
- 'unsafe-eval' - 通过在策略中指定此源,可使用文本到 JavaScript 机制(如 eval)。
- “none”——指定此来源会限制任何来源的内容加载。
- data: - 指定数据:URI 允许内容创建者将小文件嵌入到文档中。 不建议使用。
注释
AD FS 在身份验证过程中使用 JavaScript,因此通过在默认策略中包含“unsafe-inline”和“unsafe-eval”源来启用 JavaScript。
自定义标头
除了之前列出的安全响应标头(HSTS、CSP、X-Frame-Options、X-XSS-Protection 和 CORS),AD FS 2019 还允许设置新标头。
例如,可以将新的标头“TestHeader”和“TestHeaderValue”设置为值。
Set-AdfsResponseHeaders -SetHeaderName "TestHeader" -SetHeaderValue "TestHeaderValue"
设置后,新标头在 AD FS 响应中发送,如以下 Fiddler 代码片段所示:
Web 浏览器兼容性
使用下表和链接来确定哪些 Web 浏览器与每个安全响应标头兼容。
HTTP 安全响应标头 | 浏览器兼容性 |
---|---|
HTTP Strict-Transport-Security (HSTS) | HSTS 浏览器兼容性 |
X-Frame-Options | X-Frame-Options 浏览器兼容性 |
X-XSS-Protection | X-XSS-Protection 浏览器兼容性 |
跨源资源共享 (CORS) | CORS 浏览器兼容性 |
内容安全策略 (CSP) | CSP 浏览器兼容性 |