共用方式為


遮蓋 (COM)

覆蓋是 COM 的一種安全功能,其決定在模擬期間用戶端投射到伺服器的身份識別。 設定隱藏時,中繼伺服器會遮罩自己的身分識別,並將用戶端的身分識別呈現給用戶端代表其呼叫的伺服器。 基本上;伺服器看到的用戶端身分識別是與 Proxy 相關聯的身分識別。 Proxy 的身分識別是由數個因素所決定,其中一個是所設定的遮蓋類型(如果有的話)。 安全通道 (Schannel) 安全性提供者不支援隱蔽。

下列主題提供有關遮蓋的詳細資訊:

遮蓋的類型

有兩種類型的遮蓋:靜態 遮蓋和 動態 遮蓋:

  • 使用靜態遮蓋(EOAC_STATIC_CLOAKING),伺服器會看到從用戶端到伺服器的第一次呼叫的線程令牌。 第一次呼叫時,如果在呼叫 CoSetProxyBlanket 期間設定 Proxy 身分識別,則會使用該 Proxy 身分識別。 不過,如果未設定 Proxy 身分識別,則會使用線程令牌。 如果沒有線程令牌存在,則會使用進程令牌。 針對所有未來的呼叫,會使用第一個呼叫上設定的身分識別。
  • 使用動態隱蔽(EOAC_DYNAMIC_CLOAKING),在每次函式呼叫中,會使用目前的執行緒令牌(如果有執行緒令牌)來判斷客戶端的身分識別。 如果沒有線程令牌,則會使用進程令牌。 這表示模擬期間代表用戶端進行呼叫的伺服器會看到產生呼叫的 COM 用戶端身分識別,這通常是預期的行為。 (當然,若要讓模擬成功,客戶端必須藉由設定適當的模擬層級,授權伺服器進行模擬。如需詳細資訊,請參閱 模擬層級。)此類型的隱蔽性很貴。

遮蓋如何影響用戶端身分識別

進行加密呼叫時,伺服器會向用戶端要求其身分識別,通常會取得系結至 Proxy 的身分識別。 (有時候驗證服務會從實際身分識別執行轉譯,但一般而言 Proxy 身分識別是伺服器看到的身分識別。Proxy 會將身分識別呈現給伺服器,此身分識別取決於所設定的遮蓋類型和其他因素。

總而言之,客戶端的身份識別取決於已設定的遮蓋標誌、進程令牌、線程令牌是否存在,以及代理身份識別先前是否已設定。 下表顯示當這些因素有所不同時產生的代理身分(用戶端身分)。

隱藏旗標 線程令牌存在 先前設定的 Proxy 身分識別 代理身分識別(用戶端身分識別)
遮蓋未設定
不在乎
不在乎
處理令牌或驗證身份
EOAC_STATIC_CLOAKING
目前

線程令牌
EOAC_STATIC_CLOAKING
目前
是的
目前的代理身分識別
EOAC_STATIC_CLOAKING
不存在

處理令牌
EOAC_STATIC_CLOAKING
不存在
是的
目前的代理身分識別
動態隱形技術 (EOAC)
目前
不在乎
線程令牌
動態隱形技術 (EOAC_DYNAMIC_CLOAKING)
不存在
不在乎
處理令牌

下列流程圖說明 Proxy 身分識別在不同情況下如何判斷。

顯示用來判斷 Proxy 身分識別流程的圖表。

設定遮蓋

在呼叫 CoInitializeSecurity時,會設定為作為遮蔽的功能旗標,以設定整個程式處理的遮蔽功能。 接著會設定隱藏功能,直到用戶端透過呼叫 IClientSecurity::SetBlanket(或 CoSetProxyBlanket)來變更它,這會為 Proxy 設定隱藏功能。

根據預設,不會設定遮蓋。 若要設定它,請將 EOAC_STATIC_CLOAKING 或 EOAC_DYNAMIC_CLOAKING 傳遞至 CoInitializeSecuritySetBlanket中的 pCapabilities 參數。

當使用 CoInitializeSecurity啟用靜態隱藏時,每個代理(Proxy)會在您首次呼叫時挑選一個令牌(線程或進程)。 當使用 SetBlanket啟用靜態遮蔽時,代理會在該時刻獲取線程上的令牌。 如果呼叫 SetBlanket 時沒有可用的線程令牌,進程令牌會用於 Proxy 的身分識別。 基本上,SetBlanket 修正 Proxy 的身分識別。

使用動態遮蓋時,不論動態遮蓋是使用 CoInitializeSecurity,還是使用 SetBlanket來設定動態遮蔽,Proxy 的身分識別都會以相同方式決定。 如果有,則會使用目前的線程令牌;否則會使用進程令牌。

如果透過呼叫 CoInitializeSecurity 來設定整個過程的隱藏,而且您想要使用進程權杖進行呼叫,請勿在進行呼叫時模擬。

隱匿與假冒層級

如先前所述,遮蔽功能會決定偽裝期間向伺服器呈現的身分識別。 Cloaking 提供了一種方式,讓伺服器在代表用戶端呼叫另一台伺服器時,以不同於自身的身分識別來投射。 模擬層級表示客戶端給予伺服器多少授權。

模擬而不遮蓋運作,但可能不是最佳選擇,因為在某些情況下,最終伺服器必須知道初始呼叫者的身分識別。 這在不使用遮蓋的情況下無法達成,因為很難確保只有授權的用戶端可以存取遠端計算機。 當使用模擬但不隱匿時,呈現給下游伺服器的身分識別就是立即呼叫過程的身分識別。

然而,沒有冒充,隱身並無用處。 只有當用戶端設定了「模擬」或「委派」的模擬層級时,Cloaking 才有意義。 (當使用較低的模仿層級時,伺服器無法進行隱藏的呼叫。)遮蓋是否成功取決於跨越的電腦邊界數目和模仿層級,這表示伺服器代表客戶端行使多少權限。

在某些情況下,當用戶端將模擬層級設定為RPC_C_IMP_LEVEL_IMPERSONATE時,伺服器必須設定遮蓋。 不過,某些限制實際上已生效。 如果原始用戶端將模擬層級設定為RPC_C_IMP_LEVEL_IMPERSONATE,中繼伺服器(作為同一部計算機上的用戶端)只能遮蓋一個計算機界限。 這是因為模擬層級模擬令牌只能傳遞至一個計算機邊界。 在跨過計算機界限之後,只能存取本機資源。 呈現給伺服器的身分識別取決於所設定的遮蓋類型。 如果未設定任何遮蓋,則呈現給伺服器的身分識別將會是立即呼叫的程式身分識別。

若要遮蓋多個計算機界限,您必須同時指定適當的遮蓋功能旗標和委派層級模擬。 使用這種類型的冒充,用戶端的本機和網路認證都會提供給伺服器,因此冒充令牌可以跨越任意數量的電腦界限。 同樣地,呈現給伺服器的身分識別取決於所設定的遮蓋類型。 如果未透過代表層級的模擬設定任何隱藏,則呈現給伺服器的身分識別就是執行呼叫的程式。

例如,假設進程 A 呼叫 B,而 B 呼叫 C。B 已設定遮蓋,A 已設定模擬層級來模擬。 如果 A、B 和 C 位於同一部電腦上,將模擬令牌從 A 傳遞至 B,然後傳遞至 C 即可運作。 但是,如果 A 和 C 位於同一部電腦上,且 B 不是,傳遞令牌會在 A 和 B 之間運作,但無法從 B 到 C。從 B 到 C 的呼叫將會失敗,因為 B 在遮蓋時無法呼叫 C。 不過,若 A 將冒充層級設定為委派,則令牌就可以從 B 傳遞至 C,因而呼叫可能會成功。

隱藏場景

在下圖中,進程 A 會在未設定遮蓋時呼叫 B、呼叫 C、呼叫 D。 因此,每個中繼進程都會看到呼叫它的處理程式身分識別。

未設定隱藏時顯示過程的圖表。

使用靜態遮蓋時,伺服器會看到用戶端第一次呼叫伺服器期間所設定的 Proxy 身分識別。 下圖顯示從 B 到 C 呼叫期間所設定的 Proxy 身分識別範例。在後續的呼叫中,進程 D 會在 B 和 C 設定靜態遮蓋時看到 B 的身分識別。

顯示靜態遮蓋程式的圖表。

使用動態遮蔽時,模擬期間呼叫者的身分識別基於當前線程令牌(如果存在)。 下圖顯示了 B 和 C 設置動態隱蔽的情況,而 D 還是看到了 A 的身份,雖然 B 之前曾經呼叫過 C。

顯示動態遮蓋程式的圖表。

委派和偽裝