遮蓋 (COM)
Cloaking 是 COM 安全性功能,可決定模擬期間用戶端專案對伺服器的身分識別。 設定隱藏時,中繼伺服器會遮罩自己的身分識別,並將用戶端的身分識別呈現給用戶端代表其呼叫的伺服器。 基本上;伺服器看到的用戶端身分識別是與 Proxy 相關聯的身分識別。 Proxy 的身分識別是由數個因素所決定,其中一個是所設定的遮蓋類型(如果有的話)。 安全通道安全性提供者不支援遮蓋。
下列主題提供有關遮蓋的詳細資訊:
遮蓋的類型
有兩種類型的遮蓋: 靜態 遮蓋和 動態 遮蓋:
- 使用靜態遮蓋(EOAC_STATIC_CLOAKING),伺服器會看到從用戶端到伺服器的第一次呼叫的線程令牌。 第一次呼叫時,如果在呼叫 CoSetProxyBlanket 期間設定 Proxy 身分識別,則會使用該 Proxy 身分識別。 不過,如果未設定 Proxy 身分識別,則會使用線程令牌。 如果沒有線程令牌存在,則會使用進程令牌。 針對所有未來的呼叫,會使用第一個呼叫上設定的身分識別。
- 使用動態遮蓋(EOAC_DYNAMIC_CLOAKING),每次呼叫目前的線程令牌時(如果有線程令牌),都會用來判斷用戶端的身分識別。 如果沒有線程令牌,則會使用進程令牌。 這表示模擬期間代表用戶端呼叫的伺服器會看到產生呼叫的 COM 用戶端身分識別,這通常是所需的行為。 (當然,若要讓模擬成功,客戶端必須藉由設定適當的模擬層級,為伺服器授權單位提供模擬。如需詳細資訊,請參閱 模擬層級。)這種類型的遮蓋很貴。
遮蓋如何影響用戶端身分識別
進行加密呼叫時,伺服器會向用戶端要求其身分識別,通常會取得系結至 Proxy 的身分識別。 (有時候驗證服務會從實際身分識別執行轉譯,但一般而言 Proxy 身分識別是伺服器看到的身分識別。Proxy 會將身分識別呈現給伺服器,此身分識別取決於所設定的遮蓋類型和其他因素。
總而言之,用戶端的身分識別是已設定的遮蓋旗標、進程令牌、線程令牌是否存在,以及 Proxy 身分識別先前是否已設定的函式。 下表顯示當這些因素有所不同時產生的 Proxy 身分識別(用戶端身分識別)。
遮蓋旗標 | 線程令牌存在 | 先前設定的 Proxy 身分識別 | Proxy 身分識別 (用戶端身分識別) |
---|---|---|---|
遮蓋未設定 |
Don't care |
Don't care |
處理令牌或驗證身分識別 |
EOAC_STATIC_CLOAKING |
展示 |
No |
線程令牌 |
EOAC_STATIC_CLOAKING |
展示 |
Yes |
目前的 Proxy 身分識別 |
EOAC_STATIC_CLOAKING |
不存在 |
No |
處理令牌 |
EOAC_STATIC_CLOAKING |
不存在 |
Yes |
目前的 Proxy 身分識別 |
EOAC_DYNAMIC_CLOAKING |
展示 |
Don't care |
線程令牌 |
EOAC_DYNAMIC_CLOAKING |
不存在 |
不在乎 |
處理令牌 |
下列流程圖說明 Proxy 身分識別在不同情況下如何判斷。
設定遮蓋
擷取設定為 CoInitializeSecurity 呼叫中的功能旗標,這會設定整個程式的遮蓋。 接著會設定遮蓋功能,直到用戶端透過呼叫 IClientSecurity::SetBlanket(或 CoSetProxyBlanket)來變更它,以設定 Proxy 的遮蓋。
根據預設,不會設定遮蓋。 若要加以設定,請將EOAC_STATIC_CLOAKING或EOAC_DYNAMIC_CLOAKING傳遞至 CoInitializeSecurity 或 SetBlanket 中的 pCapabilities 參數。
使用 CoInitializeSecurity 啟用靜態遮蓋時,每個 Proxy 會在您第一次對 Proxy 進行呼叫時,挑選令牌(線程或進程)。 使用 SetBlanket 啟用靜態遮蓋時,Proxy 會在該時間挑選線程上的令牌。 如果呼叫 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 的情況。