寫入器的安全性考慮
VSS 基礎結構需要寫入器進程才能同時作為 COM 用戶端和伺服器運作。
當做伺服器時,VSS 寫入器會公開 COM 介面(例如,CVssWriter::OnIdentify)的 VSS 事件處理程式,並從 VSS 行程接收連入 COM 呼叫(例如要求者和 VSS 服務)或來自 VSS 外部進程的 RPC 呼叫,通常是當這些進程產生 VSS 事件時(例如, 當要求者呼叫 IVssBackupComponents::GatherWriterMetadata時。 因此,VSS 寫入器必須安全地管理哪些 COM 用戶端能夠對其程式進行連入 COM 呼叫。
同樣地,VSS 寫入器也可以作為 COM 用戶端,對 VSS 基礎結構所提供的回呼進行傳出 COM 呼叫,或對 VSS 外部進程的 RPC 呼叫。 備份應用程式或 VSS 服務所提供的這些回呼可讓寫入器執行工作,例如透過 IVssComponent 介面更新備份元件檔。 因此,VSS 安全性設定必須允許寫入器對其他 VSS 進程進行連出 COM 呼叫。
管理寫入器安全性問題的最簡單機制牽涉到適當選取其執行所在的用戶帳戶。 寫入器通常需要在屬於Administrators群組或備份作員群組成員的使用者下執行,或者它必須以本機系統帳戶身分執行。
根據預設,當寫入器做為 COM 用戶端時,如果它未在這些帳戶下執行,則任何 COM 呼叫都會使用 E_ACCESSDENIED 自動拒絕,甚至不需要進入 COM 方法實作。
停用 COM 例外狀況處理
開發寫入器時,將 COM COMGLB_EXCEPTION_DONOT_HANDLE全域選項旗標設定為停用 COM 例外狀況處理。 請務必這樣做,因為 COM 例外狀況處理可以遮罩 VSS 應用程式中的嚴重錯誤。 遮罩的錯誤可能會使進程處於不穩定且無法預測的狀態,這可能會導致損毀和停止回應。 如需此旗標的詳細資訊,請參閱 IGlobalOptions。
設定寫入器預設 COM 存取檢查許可權
寫入器必須注意,當他們的進程作為伺服器時(例如,若要處理 VSS 事件),他們必須允許來自其他 VSS 參與者的來電,例如要求者或 VSS 服務。
不過,根據預設,進程將只允許在自我 SID 相同的登入工作階段下執行的 COM 用戶端,或是在本機系統帳戶下執行。 這是潛在的問題,因為這些預設值不足以支援 VSS 基礎結構。 例如,要求者可以執行為「備份作員」用戶帳戶,該用戶帳戶既不在與寫入器進程相同的登入會話中,也不是本機系統帳戶。
若要處理這種類型的問題,每個 COM 伺服器進程都可以進一步控制是否允許 RPC 或 COM 用戶端執行伺服器 (在此案例中為寫入器) 實作的 COM 方法,方法是使用 CoInitializeSecurity 來設定全進程的預設 COM 存取檢查許可權。
寫入器可以明確地執行下列動作:
允許所有進程存取以呼叫寫入器進程。
這個選項可能適用於許多寫入器,並供其他 COM 伺服器使用,例如,所有 SVCHOST 型 Windows 服務都已使用此選項,預設為所有 COM+ 服務。
允許所有進程執行連入 COM 呼叫不一定是安全性弱點。 做為 COM 伺服器的寫入器,就像所有其他 COM 伺服器一樣,一律保留在其進程中實作的每個 COM 方法上授權其用戶端的選項。
若要允許所有進程 COM 存取寫入器,您可以將 NULL 安全性描述元傳遞為 CoInitializeSecurity的第一個參數。 (請注意,CoInitializeSecurity 必須針對整個程式最多呼叫一次。如需 CoInitializeSecurity的詳細資訊,請參閱 COM 檔。
下列程式代碼範例包含對 CoInitializeSecurity 的呼叫:
// Initialize COM security. hr = CoInitializeSecurity( NULL, // PSECURITY_DESCRIPTOR pSecDesc, -1, // LONG cAuthSvc, NULL, // SOLE_AUTHENTICATION_SERVICE *asAuthSvc, NULL, // void *pReserved1, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // DWORD dwAuthnLevel, RPC_C_IMP_LEVEL_IDENTIFY, // DWORD dwImpLevel, NULL, // void *pAuthList, EOAC_NONE, // DWORD dwCapabilities, NULL // void *pReserved3 );
使用 CoInitializeSecurity明確設定寫入器的 COM 層級安全性時,您應該執行下列動作:
將驗證層級設定為至少 RPC_C_AUTHN_LEVEL_CONNECT。
為了獲得更好的安全性,請考慮使用 RPC_C_AUTHN_LEVEL_PKT_PRIVACY。
除非寫入器進程需要允許與 VSS 無關的特定 RPC 或 COM 呼叫模擬,否則請將模擬層級設定為 RPC_C_IMP_LEVEL_IDENTIFY。
只允許指定的進程存取權,以呼叫寫入器進程。
使用非NULL 安全性描述元呼叫 coInitializeSecurity 的 COM 伺服器(例如寫入器)可以使用描述項來設定自己,只接受屬於特定帳戶集之使用者的來電。
寫入器必須確保在有效使用者下執行的 COM 用戶端有權呼叫其進程。 指定第一個參數中安全性描述元的寫入器,必須允許下列使用者對要求者進程執行連入呼叫:
- 本機系統
- 本機 Administrators 群組的成員
- 本機備份作員群組的成員
- 寫入器執行所在的帳戶
明確控制寫入器的用戶帳戶存取權
在某些情況下,限制寫入器存取以本機系統執行的進程,或在本機系統管理員或本機備份作員本地組之下,可能會太嚴格。
例如,寫入器程式(可能是第三方非系統寫入器)通常不需要在系統管理員或備份作員帳戶下執行。 基於安全性考慮,最好不要人為地提升程序支援 VSS 的許可權。
在這些情況下,必須修改 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\VssAccessControl 登錄機碼,以指示 VSS 指定使用者安全地執行 VSS 寫入器。
在此密鑰下,您必須建立子機碼,其名稱與要授與或拒絕存取的帳戶相同。 此子機碼必須設定為下表中的其中一個值。
價值 | 意義 |
---|---|
0 | 拒絕使用者存取您的寫入器和要求者。 |
1 | 授與使用者對寫入器的存取權。 |
2 | 將要求者的存取權授與使用者。 |
3 | 將寫入器和要求者的存取權授與使用者。 |
下列範例會授與 「MyDomain\MyUser」 帳戶的存取權:
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
VSS
VssAccessControl
MyDomain\MyUser = 1<dl>
<dt>
Data type
</dt>
<dd> REG_DWORD</dd>
</dl>
這個機制也可以用來明確限制其他允許的使用者執行 VSS 寫入器。 下列範例會限制來自 “ThatDomain\Administrator” 帳戶的存取:
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
VSS
VssAccessControl
ThatDomain\Administrator = 0<dl>
<dt>
Data type
</dt>
<dd> REG_DWORD</dd>
</dl>
使用者 ThatDomain\Administrator 將無法執行 VSS 寫入器。