下列各節列出使用 Windows Communication Foundation 建立安全應用程式時要考慮的最佳做法(WCF)。 如需安全性的詳細資訊,請參閱 安全性考慮、 數據的安全性考慮,以及 元數據的安全性考慮。
識別使用SPN執行 Windows 驗證的服務
服務可以使用用戶主體名稱 (UPN) 或服務主體名稱 (SPN) 來識別。 在像網路服務這類系統帳戶下執行的服務,其 SPN 身分識別會對應至運行這些服務的電腦。 在使用者帳戶下執行的服務具有與執行的使用者相對應的 UPN 身分識別,雖然可以使用 setspn 工具來將 SPN 指派給用戶帳戶。 設定服務以便透過SPN加以識別,並將連線到服務的客戶端設定為使用SPN,可讓某些攻擊更加困難。 本指南適用於使用 Kerberos 或 SSPI 協商的系結。 在 SSPI 回復至 NTLM 的情況下,用戶端仍應指定 SPN。
驗證 WSDL 中的服務識別
WS-SecurityPolicy 可讓服務在元數據中發佈自己身分識別的相關信息。 透過svcutil或其他方法如WsdlImporter擷取時,此身分識別資訊會轉譯為WCF服務端點位址的身分識別屬性。 未驗證這些服務身分識別正確且有效的用戶端會有效略過服務驗證。 惡意服務可以藉由變更其 WSDL 中宣告的身分識別,利用這類客戶端來執行認證轉送和其他「中間人」攻擊。
使用 X509 憑證,而不是 NTLM
WCF 提供了兩種 peer-to-peer 驗證機制:X509 憑證(由對等通道使用)和 Windows 驗證,在此過程中,SSPI 協商會從 Kerberos 降級至 NTLM。 使用金鑰大小為 1024 位或更多位的憑證式驗證,是 NTLM 的慣用,原因有數個:
相互驗證功能的可用性,
使用更強大的密碼編譯演算法,以及
使用已轉送 X509 憑證的困難度更高。
一律在偽裝之後還原
使用啟用客戶端身份模擬的 API 時,請務必恢復原始身份。 例如,使用 WindowsIdentity 和 WindowsImpersonationContext時,請使用 C# using 語句或 Visual Basic Using 語句,如下列程式代碼所示。 類別 WindowsImpersonationContext 會實作 IDisposable 介面,因此,一旦程式代碼離開 using 區塊,Common Language Runtime (CLR) 就會自動還原為原始身分識別。
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
using (identity.Impersonate())
{
// Run code under the caller's identity.
}
Dim identity = ServiceSecurityContext.Current.WindowsIdentity
Using identity.Impersonate()
' Run code under the caller's identity.
End Using
僅視需要模擬
使用Impersonate類別的WindowsIdentity方法,可以在範圍非常受控制的條件下進行身份模擬。 這與使用 Impersonation 的 OperationBehaviorAttribute 屬性相反,此屬性可允許在整個作業範圍內進行模擬。 盡可能使用更精確的 Impersonate 方法來控制仿真的範圍。
從信任的來源取得元數據
請確定您信任元數據的來源,並確定沒有人竄改元數據。 使用 HTTP 通訊協定擷取的元數據會以純文字傳送,而且可能會遭到竄改。 如果服務使用 HttpsGetEnabled 和 HttpsGetUrl 屬性,請使用服務建立者提供的 URL,以使用 HTTPS 通訊協定下載數據。
通過安全性發佈元數據
若要防止竄改服務的已發佈元數據,請使用傳輸或訊息層級安全性來保護元數據交換端點。 如需詳細資訊,請參閱 發佈元數據端點 和 如何:使用程式代碼發佈服務的元數據。
確保使用本地簽發者
如果指定了某個系結的簽發者地址和系結,則使用該系結的端點不會使用本機簽發者。 預期始終使用本地簽發者的客戶端應確保不使用此類繫結,或修改繫結以使簽發者位址為空值。
SAML 令牌大小配額
當安全性判斷提示標記語言 (SAML) 令牌在訊息中串行化時,當安全性令牌服務 (STS) 發出令牌時,或當用戶端將其呈現為驗證的一部分時,訊息大小上限配額必須足夠大,以容納 SAML 令牌和其他訊息部分。 在一般情況下,預設訊息大小配額就已足夠。 不過,如果 SAML 令牌因為包含數百個宣告而很大,則應增加配額以容納序列化的令牌。 如需配額的詳細資訊,請參閱 數據的安全性考慮。
在自定義系結上將 SecurityBindingElement.IncludeTimestamp 設定為 True
當您建立自訂系結時,必須將 設定 IncludeTimestamp 為 true。 否則,如果 IncludeTimestamp 設定為 false,且用戶端使用非對稱密鑰型令牌,例如 X509 憑證,則不會簽署訊息。