Active Directory Federation Services (AD FS) 2019 新增功能,以自定義 AD FS 所傳送的 HTTP 安全性回應標頭。 這些工具可協助系統管理員防範常見的安全性弱點,並讓他們利用瀏覽器型保護機制的最新進展。 這項功能來自引進兩個新的 Cmdlet:Get-AdfsResponseHeaders
和 Set-AdfsResponseHeaders
。
備註
使用 Cmdlet Get-AdfsResponseHeaders
和 Set-AdfsResponseHeaders
來自定義 HTTP 安全回應標頭(不包括 CORS 標頭)的功能已移植到 AD FS 2016。 您可以藉由安裝 KB4493473 和 KB4507459,將功能新增至 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 列出標頭,如下列螢幕快照所示。
螢幕快照中的 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 劫持。 它可讓網頁伺服器宣告網頁瀏覽器或其他符合規範的使用者代理程式,只應該使用 HTTPS 與其互動,且永遠不會透過 HTTP 通訊協定進行互動。
Web 驗證流量的所有AD FS端點都會透過 HTTPS 獨占開啟。 因此,AD FS 可有效降低 HTTP 嚴格傳輸安全策略機制所提供的威脅。 根據預設,由於 HTTP 中沒有接聽程式,因此不會降級為 HTTP。 您可以藉由設定下列參數來自訂標題。
- 最大年齡=<有效期限>。 到期時間(以秒為單位)會指定網站只能使用 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 預設不允許外部應用程式在執行互動式登錄時使用 iFrames。 此設定可防止特定類型的網路釣魚攻擊。 由於先前已建立的會話層級安全性,因此可以透過iFrame執行非互動式登入。
即使在一些非常罕見的情況下,您可能會信任特定應用程式,而這些應用程式需要具有 iFrame 功能的互動式 AD FS 登入頁面。
X-Frame-Options
標頭用於此用途。
此 HTTP 安全性回應標頭可用來與瀏覽器通訊,其是否可以在 <框架>/<iframe>轉譯頁面。 標頭可以設定為下列其中一個值:
- 拒絕。 框架中的頁面不會顯示。 此組態是預設和建議的設定。
- sameorigin。 只有當原點與網頁的來源相同時,才會在框架中顯示頁面。 除非所有祖先也位於相同的原點,否則此選項並不有用。
-
允許來自 <指定來源>。 只有當來源 (例如,
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) 標頭
網頁瀏覽器安全性可防止網頁發出從腳本內起始的跨原始來源要求。 不過,您可能想要存取其他來源的資源(網域)。 跨原點資源共用 (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 自定義一節。 下列範例流程會逐步引導您完成該情境:
使用者透過用戶端瀏覽器存取 SPA,並重新導向至 AD FS 驗證端點以進行驗證。 由於 SPA 已設定為隱含授與流程,因此要求會在驗證成功之後,將存取 + 識別元令牌傳回瀏覽器。
使用者驗證之後,SPA 中包含的前端 JavaScript 會提出存取 Web API 的要求。 要求會重新導向至具有下列標頭的AD FS:
- 選項 - 描述目標資源的通訊選項。
- Origin - 包含 Web API 的來源。
- 訪問控制 -Request-Method - 識別在提出實際要求時要使用的 HTTP 方法(例如 DELETE)。
- 訪問控制 -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)。
- Origin – 包含 Web API 的來源。
- Access-Control-Allow-Headers 回應標頭中包含的所有標頭。
驗證之後,AD FS 會在訪問控制-Allow-Origin 回應標頭中包含 Web API 網域 (origin) 來核准要求。
包含 Access-Control-Allow-Origin 標頭可讓瀏覽器呼叫要求的 API。
CORS 自定義
根據預設,CORS 功能不會啟用;不過,系統管理員可以透過 Set-AdfsResponseHeaders
Cmdlet 來啟用此功能。
Set-AdfsResponseHeaders -EnableCORS $true
啟用之後,系統管理員可以使用相同的 Cmdlet 列舉受信任的來源清單。 例如,下列命令會允許 CORS 請求來自於來源 https://example1.com
和 https://example1.com
。
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' - 在原則中指定此選項,允許使用文本轉換為 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 程式碼片段所示:
網頁瀏覽器相容性
使用下表和連結來判斷哪些網頁瀏覽器與每個安全性回應標頭相容。
HTTP 安全性回應標頭 | 瀏覽器相容性 |
---|---|
HTTP Strict-Transport-Security (HSTS) | HSTS 瀏覽器相容性 |
X-Frame-Options | X-Frame-Options 瀏覽器相容性 |
X-XSS-Protection | X-XSS-Protection 瀏覽器相容性 |
跨原始來源資源分享 (CORS) | CORS 瀏覽器相容性 |
內容安全原則 (CSP) | CSP 瀏覽器相容性 |