寫入器的安全性考慮

VSS 基礎結構要求寫入器進程能夠同時作為 COM 用戶端和伺服器運作。

當做伺服器時,VSS 寫入器會公開 COM 介面 (例如 CVssWriter::OnIdentify) ,並從 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 服務。

不過,根據預設,進程只會允許在與 SELF 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

  • 只允許指定的進程存取權以呼叫寫入器進程。

    COM 伺服器 (,例如呼叫 CoInitializeSecurity 且具有非Null 安全性描述元的寫入器) ,可以使用描述項來設定本身,只接受屬於特定帳戶集之使用者的來電。

    寫入器必須確保在有效使用者下執行的 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 寫入器。