安全性概觀
Windows Web 服務 API (WWSAPI) 中的安全性架構提供:
- 使用傳輸安全性來確保訊息完整性、機密性、重播偵測以及伺服器驗證。
- 透過SOAP訊息安全性或傳輸安全性進行用戶端驗證,例如安全性令牌驗證、憑證信任和撤銷檢查等。
安全性程序設計模型
安全性與 信道相關聯。 保護通道包含下列步驟。
- 建立並初始化一或多個 安全性系結, 適合應用程式的安全性需求。
- 建立 安全性描述,包含這些安全性系結。
- 建立 信道 或 服務代理(在用戶端),或者建立 聆聽器 或 服務主機(在伺服器端),並傳入該安全性描述。
- 執行 Open、Accept、Send、Receive、Close 等一般通道程式設計步驟。
根據提供的安全性描述,通道上的訊息在執行時環境中發送和接收時會自動加以保護。 您可以選擇性地在安全性描述中指定一或多個 通道範圍安全性設定,或在安全性系結中指定一或多個 系結範圍安全性設定,來微調這些步驟。
應用程式必須使用附加在每封已接收訊息中的 安全性處理結果,來執行對發送者身分的任何必要授權。 授權步驟不會在安全性描述中指定,也不會由運行時間自動執行。
安全性描述中的錯誤,例如不支援的系結、無法套用的屬性/欄位、缺少必要的屬性/欄位或無效的屬性/域值,會導致通道或接聽程式建立失敗。
選取安全性系結
設計應用程式安全性時,主要的決策是選擇要包含在安全性描述中的安全性綁定。 以下是選擇適合應用程式安全性案例之安全性系結的一些指導方針。 實用的啟發學習法是先瞭解哪些安全性認證類型(例如 X.509 憑證、Windows 網域使用者名稱/密碼、應用程式定義的使用者名稱/密碼)可供應用程式使用,然後選擇可使用該認證類型的安全性系結。
傳輸安全性,其中安全性會套用在傳輸位元組數據流層級(低於SOAP訊息界限),這是要考慮的第一個選項。
針對因特網案例,以及可在伺服器上部署 X.509 憑證的內部網路案例,應用程式可以使用 WS_SSL_TRANSPORT_SECURITY_BINDING。 下列範例說明此選項。 用戶端:HttpClientWithSslExample 伺服器:HttpServerWithSslExample。
如果需要透過 HTTP 標頭驗證進行客戶端驗證,則可以新增 WS_HTTP_HEADER_AUTH_SECURITY_BINDING 以提供該功能。
針對適用於 Kerberos、NTLM 和 SPNEGO 等 Windows 整合式驗證通訊協定的內部網路案例,應用程式可以使用 WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING。 下列範例說明此選項:用戶端:RequestReplyTcpClientWithWindowsTransportSecurityExample 伺服器:RequestReplyTcpServerWithWindowsTransportSecurityExample。
用戶端透過命名管道:使用Windows傳輸安全的RequestReplyNamedPipesClient示例
透過命名管道的伺服器:RequestReplyNamedPipesServerWithWindowsTransportSecurityExample
針對適用於 Kerberos、NTLM 和 SPNEGO 等 Windows 整合式驗證通訊協定的本機電腦案例,應用程式可以使用 WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING 或 WS_NAMEDPIPE_SSPI_TRANSPORT_SECURITY_BINDING。 WS_NAMEDPIPE_CHANNEL_BINDING 在這類案例中是慣用的,因為它保證流量不會離開機器(這是 WS_NAMEDPIPE_CHANNEL_BINDING的 屬性)。
混合模式安全性,其中傳輸安全性會保護連線,而SOAP訊息中的 WS-Security 標頭會提供客戶端驗證,這是下一個要考慮的選項。 下列系結會與上一節所述的其中一個傳輸安全性系結搭配使用。
當用戶端由應用層級的使用者名稱/密碼組驗證時,應用程式可以使用 WS_USERNAME_MESSAGE_SECURITY_BINDING 來提供驗證數據。 下列範例說明此系結搭配 WS_SSL_TRANSPORT_SECURITY_BINDING的使用方式:
當用戶端透過 Kerberos 票證進行驗證時,應用程式可以使用 WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING 來提供驗證數據。
使用 安全性內容時,用戶端會先與伺服器建立安全性內容,然後使用該內容來驗證訊息。 若要開啟這項功能,安全性描述必須包含 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING。 一旦建立,安全上下文可以透過輕量令牌進行傳輸,這避免了在每個訊息中傳送可能龐大且計算成本高的客戶端憑證。
在 同盟安全性 案例中,用戶端會先取得安全性令牌服務發行的安全性令牌(STS),然後將發行的令牌呈現給服務。 用戶端:若要從 STS 取得安全性令牌,應用程式可以使用 WsRequestSecurityToken。 或者,應用程式可以使用像 CardSpace 或 LiveID 這樣的客戶端安全性憑證提供程式庫,然後使用它們的輸出,在本機通過 WsCreateXmlSecurityToken建立安全性憑證。 無論哪種方式,一旦安全性令牌可供用戶端使用,就可以使用包含 WS_XML_TOKEN_MESSAGE_SECURITY_BINDING的安全性描述來呈現給服務。 伺服器端:如果 STS 簽發的安全性憑證是 SAML 憑證,那麼伺服器可能會使用搭配 WS_SAML_MESSAGE_SECURITY_BINDING的安全性描述。
注意
Windows 7 和 Windows Server 2008 R2:WWSAPI 僅支援 Ws-Trust 和 Ws-SecureConversation,如 輕量型 Web 服務安全性配置檔 (LWSSP)所定義。 如需Microsoft實作的詳細資訊,請參閱 LWSSP 的 MESSAGE 語法 一節。
要考慮的最後一個選項是使用驗證系結,而不需使用保護系結,例如 WS_SSL_TRANSPORT_SECURITY_BINDING。 這會導致認證以純文本傳輸,而且可能會造成安全性影響。 應仔細評估此選項的使用,以確保不會造成任何弱點。 可能的用法範例是透過安全的專用網在後端伺服器之間交換訊息。 下列組態支援此選項。
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING 在所有組態中都支援此選項。
- WS_USERNAME_MESSAGE_SECURITY_BINDING 使用 HTTP 做為傳輸時,支援伺服器上的此選項。
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING 使用 HTTP 做為傳輸時,支援伺服器上的此選項。
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING 使用 HTTP 做為傳輸時,支援伺服器上的此選項。
- WS_SAML_MESSAGE_SECURITY_BINDING 使用 HTTP 做為傳輸時,支援伺服器上的此選項。
啟用此選項需要明確地將 WS_PROTECTION_LEVEL 設定為 WS_PROTECTION_LEVEL_SIGN_AND_ENCRYPT以外的值。
通道和安全性
如上所述,安全性的範圍限於各個頻道。 此外,通道操作會一致對應至所有安全綁定的安全步驟。
- 通道建立:驗證安全性描述中指定的一組安全性系結,之後會維持通道的固定狀態。 也會決定通道堆疊的形狀,包括用於 WS-Trust 型交涉的任何側邊通道。
- 通道開啟:任何作為安全綁定一部分提供的認證都已載入,且安全會話已建立。 一般而言,開放式通道包含「即時」安全性狀態。 開啟客戶端通道同時也會指定伺服器的端點位址,而執行時將會針對該端點位址進行伺服器驗證。
- 在通道開啟和關閉之間:在此階段可以安全地傳送和接收訊息。
- 訊息傳送:安全性內容令牌會視需要取得或更新,且安全性會根據安全性描述套用至每個傳輸的訊息。 套用安全性時發生的錯誤會以傳送錯誤的形式傳回應用程式。
- 訊息接收:每個收到的訊息會根據安全性描述進行驗證。 任何訊息安全性驗證錯誤會當做接收錯誤傳回給應用程式。 這些個別訊息錯誤不會影響通道狀態或後續接收。 應用程式可能會捨棄失敗的接收,並重新啟動另一則訊息的接收。
- 通道中止:通道可以隨時中止,以停止通道上的所有 I/O。 在中止時,通道會進入錯誤狀態,且不允許再傳送或接收。 不過,通道仍可能會保留一些「即時」安全性狀態,因此後續的通道關閉將需要清除所有狀態。
- 通道關閉:開啟時建立的安全性狀態已被釋放,會話被結束。 安全性內容令牌已取消。 通道堆疊會維持不變,但不包含「即時」安全性狀態或已載入的認證。
- 通道釋放:在建立時所建置的通道堆疊與所有安全性資源會一同被釋放。
安全 API
安全性的 API 檔會分組為下列主題。
安全
使用 WWSAPI 安全性 API 時,應用程式面臨數個安全性風險:
-
意外設定錯誤
-
WWSAPI 支援一系列與安全性相關的組態選項。 請參閱 WS_SECURITY_BINDING_PROPERTY_ID範例。 其中一些選項,例如 WS_SECURITY_BINDING_PROPERTY_ALLOW_ANONYMOUS_CLIENTS 可讓應用程式降低各種安全性系結所提供的預設安全性層級。 應仔細評估這類選項的使用,以確保沒有任何產生的攻擊媒介。
此外,如上述所述,WWSAPI 可讓應用程式刻意停用完全保護訊息交換所需的特定步驟,例如允許停用加密,即使傳輸安全性認證也一樣。 這是為了啟用某些特定情境而被允許的,不應用於一般溝通。 WS_PROTECTION_LEVEL 必須特別降低才能啟用此案例,除非絕對必要,否則應用程式不應該變更該值,因為這樣做會停用許多旨在確保安全設定的檢查。
-
將機密資訊儲存在記憶體中
-
儲存在記憶體中的機密資訊,例如密碼,容易被具有特權的攻擊者透過例如頁面檔案的方法擷取。 WWSAPI 會複製提供的認證,並加密該複本,讓原始數據不受保護。 應用程式有責任保護原始實例。 此外,加密的複本會在使用時短暫地解密,並開啟視窗來擷取它。
-
拒絕服務
-
安全性處理可能會耗用大量資源。 每個額外的安全性系結都會增加這些成本。 WWSAPI 會在發生安全性驗證失敗時立即中止安全性處理,但在執行重大工作之前,可能不會進行某些檢查,例如授權決策。
在伺服器上處理訊息時,安全性狀態會儲存在訊息堆積上。 應用程式可以在安全性處理期間限制記憶體耗用量,方法是透過WS_MESSAGE_PROPERTY_HEAP_PROPERTIES減少該堆積的大小。 此外,某些安全性系結,例如WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING可能會導致伺服器代表用戶端配置資源。 這些資源的限制可以透過下列 WS_SECURITY_BINDING_PROPERTY_ID 值來設定:
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_PENDING_CONTEXTS
- 保安綁定屬性安全上下文最大活動上下文數
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_RENEWAL_INTERVAL
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_ROLLOVER_INTERVAL
將這些限制設定為較低的值可以減少最大記憶體使用量,但可能會導致在達到配額時拒絕合法的客戶端。