ACS 安全性指導方針
更新日期:2015年6月19日
適用於:Azure
適用於
Microsoft Azure Active Directory 訪問控制 (也稱為訪問控制服務或 ACS)
Windows Identity Foundation (WIF)
總結
本主題合併 ACS 的安全性指導方針。 從安全性的觀點來看,使用這些指導方針來改善實作的品質。 檢閱應用程式的架構、檢閱程式代碼和記錄安全性錯誤,以及檢閱生產部署時,您可以使用這些指導方針。 這些指導方針會參考如何使用規範步驟來完成特定工作,以及概念性主題,以深入瞭解 ACS 的特定功能或功能的詳細資訊。
目標
解決與 ACS 內容中應用程式程式代碼和設定相關的安全性問題。
解決與 ACS 設定相關的安全性問題。
解決 ACS 內容中與 Azure 部署相關的安全性問題。
解決與應用程式相關的安全性問題
以下是與應用程式程式代碼和設定相關的安全性指導方針。
請考慮將重新執行偵測功能 (DetectReplayedTokens) 設定為 true。
將 requireHttps 屬性設定為 true wsFederation。
將 requireSsl 屬性設定為 true cookieHandler。
為 sessionTokenRequirement
sessionTokenRequirement 的存留期屬性設定積極值。 列出 issuerNameRegistry中受信任的 STS(令牌簽發者)。
使用 audienceUri的應用程式應接受的範圍令牌。
請考慮將重新執行偵測功能 (DetectReplayedTokens) 設定為 true
WIF 有特別針對安全性令牌服務 (STS) 持有人令牌的重新執行偵測快取,這隻是先前使用的 STS 令牌快取。 當用戶端第一次使用 STS 令牌向信賴憑證者進行驗證時,它會收到會話安全性令牌,用來向信賴憑證者驗證任何其他要求。 它會透過安全套接字層 (SSL) 執行這項作業,讓會話安全性令牌無法遭竊。 如果客戶端或攻擊者嘗試向信賴憑證者驗證客戶端已經使用的 STS 令牌,信賴憑證者可以在重新執行快取中查閱 STS 令牌,並拒絕要求。
此快取不保證永遠無法重新執行令牌。 它會根據快取的大小、STS 令牌的到期時間,以及信賴憑證者所接收的唯一驗證要求速率,執行最佳工作偵測。 強烈建議您為信賴憑證者設定快取大小和 STS 令牌到期時間,以在效能和安全性之間取得正確的平衡。
例:
<securityTokenHandlers>
<securityTokenHandlerConfiguration>
<tokenReplayDetection enabled="true" capacity="1000" expirationPeriod="500"/>
</securityTokenHandlerConfiguration>
</securityTokenHandlers>
注意
使用此功能引進伺服器親和性,可能會導致負載平衡環境中的延展性問題,包括 Azure。 若要克服這一點,您可以考慮使用基底抽象類來實作自己的令牌重新執行偵測,Microsoft.IdentityModel.Tokens.TokenReplayCache,然後在組態檔中參考它,程式代碼如下所示。
<system.identityModel>
<identityConfiguration>
<tokenReplayDetection>
<replayCache type='FQTN of your type' />
</tokenReplayDetection>
</identityConfiguration>
</system.identityModel>
將 wsFederation 的 requireHttps 屬性設定為 true
需要Https 屬性可控制模組是否只會重新導向 STS 的安全 URL。 默認值為 「true」。 這可確保透過清除 HTTPS/SSL 流量與 STS 的安全通訊,降低透過網路探查的認證和令牌。
例:
<federatedAuthentication>
<wsFederation
passiveRedirectEnabled="true"
issuer="http://STS URL GOES HERE/"
realm="http://RP REALM GOES HERE/"
requireHttps="ture" />
<cookieHandler requireSsl="true" />
</federatedAuthentication>
將 cookieHandler 的 requireSsl 屬性設定為 true
此值為布爾值;默認值為 false。 需要Ssl 屬性控制是否針對任何寫入的Cookie發出「安全」旗標。 如果已設定此值,則登入會話Cookie只能透過 HTTPS 使用。 這可防止透過清除流量傳送會話 Cookie,降低透過網路探查令牌的威脅。
例:
<federatedAuthentication>
<wsFederation
passiveRedirectEnabled="true"
issuer="http://STS URL GOES HERE/"
realm="http://RP REALM GOES HERE/"
requireHttps="ture" />
<cookieHandler requireSsl="true" />
</federatedAuthentication>
設定 sessionTokenRequirement 存留期屬性的激進值
請考慮要求令牌發行具有積極的存留期限制。 這會限制攻擊者重新執行令牌的時間範圍,以防它遭竊。
例:
<add type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel">
<sessionTokenRequirement securityTokenCacheType="Microsoft.IdentityModel.MruSecurityTokenCache, Microsoft.IdentityModel"
saveBootstrapTokens="true"
securityTokenCacheSize="500"
useWindowsTokenService="false"
lifetime="10:00" />
</add>
列出 issuerNameRegistry 中的受信任 STS (令牌簽發者)
所有簽發者令牌都會使用IssuerNameRegistry進行驗證。 IssuerNameRegistry 的目的是將簽發者令牌對應至字串名稱。 如果驗證失敗,將不會接受令牌。 這樣可減輕接受不受信任令牌的威脅。 任何自定義類型都可以使用 <issuerNameRegistry> 項目的 類型 屬性來註冊。 <issuerNameRegistry> 可以有一個子元素,做為 IssuerNameRegistry 的自定義組態。 現成提供一個IssuerNameRegistry類型,即 ConfigurationBasedIssuerNameRegistry,可用來在組態中設定一組受信任的簽發者憑證。 此類型需要子組態專案 <信任的Issuers> 其中已設定受信任的簽發者憑證。 <信任的Issuers> 組態會使用 ASN.1 編碼形式的憑證指紋來新增受信任的憑證。
例:
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel">
<trustedIssuers>
<add thumbprint="97249e1a5fa6bee5e515b82111ef524a4c9158de" name="contoso.com" />
<remove thumbprint="97249e1a5fa6bee5e515b82111ef524a4c9158de" />
<clear/>
</trustedIssuers>
</issuerNameRegistry>
僅使用 audienceUri 將令牌範圍設定為您的應用程式
<audienceUris> 指定可接受的 URI 集合,以識別此信賴憑證者。 除非令牌的範圍是其中一個允許的物件 URI,否則不會接受令牌。 這樣可降低重新執行其他信賴憑證者所發行之有效令牌的威脅。 根據預設,不會將 URI 新增至集合。 SAML 1.1 和 SAML 2.0 令牌類型的 SecurityTokenHandler 會使用此集合中的值,在 SamlSecurityTokenRequirement 物件中設定任何允許的物件 URI 限制。
例:
<audienceUris>
<clear/>
<add value="http://www.example.com/myapp/" />
<remove value="http://www.example.com/myapp/" />
</audienceUris>
解決與 ACS 相關的安全性問題
以下是與 ACS 管理入口網站設定相關的安全性指導方針。
設定 STS 令牌的主動到期日
使用錯誤 URL 功能時提供適當的數據驗證
請考慮加密高敏感性案例的令牌
設定 STS 令牌的主動到期日
令牌存留期屬性會控制令牌的存留期。 當您使用 ACS 入口網站或管理服務建立或設定信賴憑證者時,會指定它。 您可以使用 Token Lifetime 屬性來指定 ACS 發給信賴憑證者應用程式之安全性令牌的時間量,以維持有效狀態。 根據預設,在 ACS 中,此值會設定為 10 分鐘(600 秒)。 在 ACS 中,此值必須大於零,但小於或等於 24 小時(86400 秒)。
使用錯誤 URL 功能時提供適當的數據驗證
您可以使用錯誤 URL 來指定如果登入程式期間發生錯誤,ACS 會將使用者重新導向的 URL。 它可以裝載在信賴憑證者應用程式的自訂頁面,例如,http://www.fabrikam.com/billing/error.aspx。 作為重新導向的一部分,ACS 會將錯誤的詳細數據以 JSON 編碼的 HTTP URL 參數的形式提供給信賴憑證者應用程式。 您可以製作自定義錯誤頁面來取用 JSON 編碼的錯誤資訊,以轉譯收到的實際錯誤訊息,或顯示靜態說明文字。 如果頁面需要授權,在 ACS 嘗試存取它並傳送 JSON 編碼錯誤的情況下,結果將會是無限重新導向迴圈。 因此,應該設定為匿名存取。 因為頁面可以匿名存取,而且因為它可能包含回呼 HTML 或將數據寫入資料庫的程式代碼,因此您應該採取步驟來防止跨網站腳本和 SQL 插入式攻擊。
請考慮加密高敏感性案例的令牌
對於被動同盟的高敏感性案例,請考慮加密令牌。 如需加密和解密令牌的詳細資訊,請參閱 憑證和密鑰 主題。
解決與 Azure 部署相關的安全性問題
以下是與使用 ACS 且部署至 Azure 的應用程式相關的安全性考慮。
- 使用 RSA 加密 Cookie
使用 RSA 加密 Cookie
在 Azure 中,預設 Cookie 加密機制(使用資料保護應用程式開發介面 (DPAPI)並不合適,因為每個實例都有不同的密鑰。 這表示另一個 Web 角色實例無法讀取由一個 Web 角色實例建立的 Cookie。 這可能會導致服務失敗,有效地造成拒絕服務。 如果您使用預設 Cookie 加密機制,則會發生下列錯誤訊息:
[CryptographicException: Key not valid for use in specified state.
]
System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) +577
Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) +80
[InvalidOperationException: ID1073: A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API (see inner exception for details). If you are using IIS 7.5, this could be due to the loadUserProfile setting on the Application Pool being set to false. ]
Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) +433
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +189
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver) +862
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) +109
Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) +356
Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +123
Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +61
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270
若要解決此問題,請使用使用所有 Web 角色實例所共用密鑰的 Cookie 加密機制。 下列程式代碼示範如何取代預設的 SessionSecurityHandler 物件,並將其設定為使用 RsaEncryptionCookieTransform 類別。
private void OnServiceConfigurationCreated(object sender,
ServiceConfigurationCreatedEventArgs e)
{
List<CookieTransform> sessionTransforms =
new List<CookieTransform>(
new CookieTransform[]
{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(
e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(
e.ServiceConfiguration.ServiceCertificate)
});
SessionSecurityTokenHandler sessionHandler =
new
SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(
sessionHandler);
}
void Application_Start(object sender, EventArgs e)
{
FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}
其他資源
如何:防止 ASP.NET中的跨网站脚本处理(https://go.microsoft.com/fwlink/?LinkID=178708)。
如何:防止 ASP.NET中的插入式攻击(https://go.microsoft.com/fwlink/?LinkID=157572)。
如何:在 ASP.NEThttps://go.microsoft.com/fwlink/?LinkID=212978中保護 SQL 插入。