Active Directory 联合身份验证服务 (AD FS) 2019 添加了用于自定义 AD FS 发送的 HTTP 安全响应标头的功能。 这些工具可帮助管理员防范常见的安全漏洞,并允许管理员利用基于浏览器的保护机制的最新改进。 此功能来自引入两个新的 cmdlet: Get-AdfsResponseHeaders
和 Set-AdfsResponseHeaders
。
Note
使用 cmdlet 自定义 HTTP 安全响应标头(CORS 标头除外)的功能: Get-AdfsResponseHeaders
并 Set-AdfsResponseHeaders
已向后移植到 AD FS 2016。 You can add the functionality to your AD FS 2016 by installing KB4493473 and KB4507459.
本文讨论常用的安全响应标头,演示如何自定义 AD FS 2019 发送的标头。
Note
本文假定你安装了 AD FS 2019。
Scenarios
以下方案演示了管理员可能需要自定义安全标头的需求。
- 管理员启用 HTTP Strict-Transport-Security (HSTS), 以保护可能通过使用 HTTP 从可能遭到黑客攻击的公共 wifi 接入点访问 Web 应用的用户。 HSTS 强制要求所有连接使用 HTTPS 加密。 他们希望通过为子域启用 HSTS 来进一步加强安全性。
- An administrator configured the X-Frame-Options response header to protect the web pages from being clickjacked. X-Frame-Options 阻止在 iFrame 中呈现任何网页。 但是,由于新的业务要求(在 iFrame 中显示来自不同源(域)的应用程序中的数据),他们需要自定义标头值。
- An administrator enabled X-XSS-Protection to sanitize and block the page if browser detects cross scripting attacks. X-XSS-Protection 可防止跨脚本攻击。 但是,他们需要自定义页眉,以允许页面在清理后加载。
- 管理员需要启用 跨域资源共享(CORS),他们需要在 AD FS 上设置源(域),以允许单页应用程序使用另一个域访问 Web API。
- 管理员启用 内容安全策略(CSP) 标头,通过禁止任何跨域请求来防止跨站点脚本和数据注入攻击。 但是,由于新的业务需求,他们需要自定义标头,以允许网页从任何源加载图像,并将媒体限制为受信任的提供商。
HTTP 安全响应标头
AD FS 在发送到 Web 浏览器的传出 HTTP 响应中包含响应标头。 可以使用 Get-AdfsResponseHeaders
cmdlet 来列出标头,如以下屏幕截图所示。
The ResponseHeaders attribute in the screenshot identifies the security headers included by AD FS in every HTTP response. AD FS sends the response headers only if ResponseHeadersEnabled is set to True
(default value). 可以将该值设置为 False
,以阻止 AD FS 在 HTTP 响应中包含任何安全标头。 但是,不建议使用此设置。 You can set ResponseHeaders to False
with the following command:
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 customization
By default, the header is enabled and max-age
is set to one year; however, administrators can modify the max-age
(lowering max-age value isn't recommended) or enable HSTS for subdomains through the Set-AdfsResponseHeaders cmdlet.
Set-AdfsResponseHeaders -SetHeaderName "Strict-Transport-Security" -SetHeaderValue "max-age=<seconds>; includeSubDomains"
Example:
Set-AdfsResponseHeaders -SetHeaderName "Strict-Transport-Security" -SetHeaderValue "max-age=31536000; includeSubDomains"
By default, the header is included in the ResponseHeaders attribute; however, administrators can remove the header through the Set-AdfsResponseHeaders
cmdlet.
Set-AdfsResponseHeaders -RemoveHeaders "Strict-Transport-Security"
X-Frame-Options
默认情况下,AD FS 不允许外部应用程序在执行交互式登录时使用 iFrame。 此配置可防止某些类型的网络钓鱼攻击。 由于先前建立的会话级别安全性,可以通过 iFrame 执行非交互式登录。
但是,在某些罕见情况下,你可能会信任需要支持 iFrame 的交互式 AD FS 登录页的特定应用程序。 标头 X-Frame-Options
用于此目的。
此 HTTP 安全响应标头用于与浏览器通信,是否可以在 < 框架>/<iframe> 中呈现页面。 标头可以设置为以下值之一:
- deny. 框架中的页面未显示。 此配置是默认设置和建议的设置。
- sameorigin. 仅当原点与网页的原点相同时,页面才会显示在框架中。 除非所有上级也位于同一个源中,否则该选项无效。
- <allow-from >specified origin。 仅当原点(例如)
https://www.".com
与页眉中的特定源匹配时,页面才会显示在框架中。 某些浏览器可能不支持此选项。
X-Frame-Options customization
默认情况下,标头设置为拒绝;但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 修改该值。
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "<deny/sameorigin/allow-from<specified origin>>"
Example:
Set-AdfsResponseHeaders -SetHeaderName "X-Frame-Options" -SetHeaderValue "allow-from https://www.example.com"
By default, the header is included in the ResponseHeaders attribute; however, administrators can remove the header through the Set-AdfsResponseHeaders
cmdlet.
Set-AdfsResponseHeaders -RemoveHeaders "X-Frame-Options"
X-XSS-Protection
当浏览器检测到跨站点脚本 (XSS) 攻击时,此 HTTP 安全响应标头用于阻止网页加载。 此方法称为 XSS 筛选。 标头可以设置为以下值之一:
- 0 disables XSS filtering. Not recommended.
- 1 enables XSS filtering. 如果检测到 XSS 攻击,浏览器会清理页面。
- 1; mode=block enables XSS filtering. 如果检测到 XSS 攻击,浏览器将阻止页面呈现。 此设置是默认设置和建议的设置。
X-XSS-Protection customization
By default, the header is set to 1; mode=block;. 但是,管理员可以通过 Set-AdfsResponseHeaders
cmdlet 修改值。
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "<0/1/1; mode=block/1; report=<reporting-uri>>"
Example:
Set-AdfsResponseHeaders -SetHeaderName "X-XSS-Protection" -SetHeaderValue "1"
By default, the header is included in the ResponseHeaders attribute; however, admins can remove the header through the 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 标头。
Note
CORS 请求类似于标准 HTTP 请求。 但是,源标头的存在表明传入请求与 CORS 相关。
AD FS 验证标头中包含的 Web API 源是否在 AD FS 中配置的受信任源中列出。 For more information on how to modify trusted origins, see CORS Customization. 然后,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 customization
默认情况下,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
Note
管理员可以允许来自任何源的 CORS 请求,方法是在受信任的源列表中包括“*”,尽管不建议使用此方法,因为存在安全漏洞,如果选择这样做,则会提供警告消息。
内容安全策略 (CSP)
此 HTTP 安全响应标头用于防止跨站点脚本、点击劫持和其他数据注入攻击,防止浏览器无意中执行恶意内容。 不支持内容安全策略(CSP)的浏览器将忽略 CSP 响应标头。
CSP customization
CSP 标头的自定义涉及修改安全策略,该策略定义允许浏览器加载网页的资源。 默认安全策略为:
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:;
The default-src directive is used to modify -src directives without listing each directive explicitly. 例如,在以下示例中,策略 1 与策略 2 相同。
Policy 1
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "default-src 'self'"
Policy 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 允许内容创建者将小文件嵌入到文档中。 不建议使用。
Note
AD FS 在身份验证过程中使用 JavaScript,因此通过在默认策略中包含“unsafe-inline”和“unsafe-eval”源来启用 JavaScript。
Custom headers
除了之前列出的安全响应标头(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 安全响应标头 | Browser Compatibility |
---|---|
HTTP Strict-Transport-Security (HSTS) | HSTS 浏览器兼容性 |
X-Frame-Options | X-Frame-Options 浏览器兼容性 |
X-XSS-Protection | X-XSS-Protection 浏览器兼容性 |
跨源资源共享 (CORS) | CORS 浏览器兼容性 |
内容安全策略 (CSP) | CSP 浏览器兼容性 |