使用 AD FS 2019 自訂 HTTP 安全性回應標頭

Active Directory Federation Services (AD FS) 2019 新增可自訂 AD FS 所傳送 HTTP 安全性回應標頭的功能。 這些工具可協助系統管理員防禦常見的安全性弱點,並讓他們利用瀏覽器型保護機制的最新進展。 此功能來自引進兩個新的 Cmdlet:Get-AdfsResponseHeadersSet-AdfsResponseHeaders

注意

使用 Get-AdfsResponseHeadersSet-AdfsResponseHeaders Cmdlet 來自訂 HTTP 安全性回應標頭 (CORS 標頭除外) 的功能已反向修補回 AD FS 2016。 您可以安裝 KB4493473KB4507459,以將功能新增至 AD FS 2016。

本文討論常用的安全性回應標頭,以示範如何自訂 AD FS 2019 所傳送的標頭。

注意

本文假設您已安裝 AD FS 2019。

案例

下列案例示範系統管理員可能必須自訂安全性標頭的需求。

  • 系統管理員已啟用 HTTP Strict-Transport-Security (HSTS) 來保護使用者,而使用者可能會從可能遭到駭客攻擊的公用 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 會在傳送網頁瀏覽器的傳出 HTTP 回應中包括回應標頭。 您可以使用 Get-AdfsResponseHeaders Cmdlet 來列出標頭,如下列螢幕擷取畫面所示。

Screenshot that shows the PowerShell output from Get-AdfsResponseHeaders.

螢幕擷取畫面中的 ResponseHeaders 屬性會識別每個 HTTP 回應中 AD FS 所含的安全性標頭。 只有在 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 劫持。 其可讓網頁伺服器宣告:網頁瀏覽器 (或其他符合規範的使用者代理程式) 只應該使用 HTTPS 與其互動,而不得透過 HTTP 通訊協定。

Web 驗證流量的所有 AD FS 端點都會以獨佔方式透過 HTTPS 開啟。 因此,AD FS 會有效地減輕 HTTP Strict Transport Security 原則機制所提供的威脅。 根據預設,因為 HTTP 中沒有接聽程式,所以不會降級至 HTTP。 設定下列參數,即可自訂標頭:

  • max-age=<expire-time>。 到期時間 (秒) 指定只應該使用 HTTPS 來存取網站的時間長度。 預設和建議值是 31536000 秒 (一年)。
  • includeSubDomains。 這是選擇性參數。 如果指定,則 HSTS 規則也適用於所有子網域。

HSTS 自訂

根據預設,已啟用標頭,而且 max-age 設定為一年;不過,系統管理員可以修改 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 安全性回應標頭用來與瀏覽器通訊,瞭解其是否可以在 <frame>/<iframe> 中呈現頁面。 標頭可以設定為下列其中一個值:

  • deny。 未顯示框架中的頁面。 此設定是預設和建議設定。
  • sameorigin。 只有在原點與網頁的原點相同時,才會在框架中顯示頁面。 除非所有上階也都位於相同的原點,否則此選項並不有用。
  • allow-from <specified origin>。 只有在原點 (例如,https://www.".com) 符合標頭中的特定原點時,才會在框架中顯示頁面。 有些瀏覽器可能不支援此選項。

X-Frame-Options 自訂

根據預設,標頭會設定為 deny;不過,系統管理員可以透過 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) 標頭

網頁瀏覽器安全性可防止網頁發出從指令碼內起始的跨原點要求。 不過,您可能想要存取其他原點 (網域) 中的資源。 跨原點資源共用 (CORS) 是 W3C 標準,可讓伺服器放寬 same-origin 原則。 使用 CORS,伺服器就可以明確允許一些跨原點要求,同時拒絕其他要求。

若要進一步瞭解 CORS 要求,下列案例會逐步解說單一頁面應用程式 (SPA) 需要呼叫網域不同之 Web API 的情況。 此外,請考慮在 AD FS 2019 上同時設定 SPA 和 API,而且 AD FS 已啟用 CORS。 AD FS 可以識別 HTTP 要求中的 CORS 標頭、驗證標頭值,並在回應中包括適當的 CORS 標頭。 如需如何在 AD FS 2019 上啟用和設定 CORS 的詳細資料,請參閱 CORS 自訂小節。 下列範例流程會逐步引導您完成此案例:

  1. 使用者透過用戶端瀏覽器來存取 SPA,並且會重新導向至 AD FS 驗證端點以進行驗證。 因為已針對隱含授與流程設定 SPA,所以要求會在驗證成功之後將「存取 + 識別碼權杖」傳回給瀏覽器。

  2. 使用者驗證之後,SPA 中所含的前端 JavaScript 會提出存取 Web API 的要求。 重新導向至 AD FS 的要求包含下列標頭:

    • 選項 - 描述目標資源的通訊選項。
    • Origin - 包括 Web API 的原點。
    • Access-Control-Request-Method - 識別要在提出實際要求時使用的 HTTP 方法 (例如 DELETE)。
    • Access-Control-Request-Headers - 識別要在提出實際要求時使用的 HTTP 標頭。

    注意

    CORS 要求與標準 HTTP 要求類似。 不過,原點標頭的存在表示連入要求與 CORS 相關。

  3. 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 標頭中的值相同。
  4. 瀏覽器會傳送實際要求,包括下列標頭:

    • HTTP 方法 (例如,DELETE)。
    • Origin – 包括 Web API 的原點。
    • Access-Control-Allow-Headers 回應標頭中所含的所有標頭。
  5. 驗證之後,AD FS 會在 Access-Control-Allow-Origin 回應標頭中包括 Web API 網域 (原點) 來核准要求。

  6. 包括 Access-Control-Allow-Origin 標頭可讓瀏覽器呼叫所要求的 API。

CORS 自訂

根據預設,未啟用 CORS 功能;不過,系統管理員可以透過 Set-AdfsResponseHeaders Cmdlet 來啟用此功能。

Set-AdfsResponseHeaders -EnableCORS $true

啟用之後,系統管理員可以使用相同的 Cmdlet 來列舉受信任原點清單。 例如,下列命令會允許來自原點 https&#58;//example1.comhttps&#58;//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 *"

下列是可以針對 default-src 原則所定義的來源:

  • 'self' - 指定此來源會限制將內容的原點載入至網頁的原點。
  • 'unsafe-inline' - 在原則中指定此來源允許使用內嵌 JavaScript 和 CSS。
  • 'unsafe-eval' - 在原則中指定此來源允許使用 eval 這類 JavaScript 機制的文字。
  • 'none' - 指定此來源會限制從任何原點載入的內容。
  • data: - 指定資料:URI 可讓內容建立者內嵌文件中內嵌的小型檔案。 不建議使用。

注意

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 程式碼片段所示:

Screenshot of Fiddler on the headers tab that highlights TestHeader: TestHeaderValue under Miscellaneous.

網頁瀏覽器相容性

使用下表和連結來判斷哪些網頁瀏覽器與每個安全性回應標頭相容。

HTTP 安全性回應標頭 瀏覽器相容性
HTTP Strict-Transport-Security (HSTS) HSTS 瀏覽器相容性
X-Frame-Options X-Frame-Options 瀏覽器相容性
X-XSS-Protection X-XSS-Protection 瀏覽器相容性
跨原始資源共用 (CORS) CORS 瀏覽器相容性
內容安全性原則 (CSP) CSP 瀏覽器相容性

下一筆