共用方式為


要求者的安全性考慮

VSS 基礎結構需要 VSS 要求者,例如備份應用程式,才能以 COM 用戶端和伺服器的形式運作。

當做伺服器時,要求者會公開一組可從外部進程叫用的 COM 回呼介面(例如寫入器或 VSS 服務)。 因此,要求者必須安全地管理哪些 COM 用戶端能夠對其程序進行連入 COM 呼叫。

同樣地,要求者也可以做為 VSS 寫入器或 VSS 服務所提供之 COM API 的 COM 用戶端。 要求者特定的安全性設定必須允許從要求者連出 COM 呼叫至這些其他進程。

管理要求者安全性問題的最簡單機制牽涉到適當選擇其執行所在的用戶帳戶。

要求者通常需要在系統管理員群組或備份操作員群組的成員使用者下執行,或以本機系統帳戶執行。

根據預設,當要求者做為 COM 用戶端時,如果它未在這些帳戶下執行,則任何 COM 呼叫都會使用 E_ACCESSDENIED 自動拒絕,甚至無法取得 COM 方法實作。

停用 COM 例外狀況處理

開發要求者時,將 COM COMGLB_EXCEPTION_DONOT_HANDLE全域選項旗標設定為停用 COM 例外狀況處理。 請務必這樣做,因為 COM 例外狀況處理可以遮罩 VSS 應用程式中的嚴重錯誤。 遮罩的錯誤可能會使進程處於不穩定且無法預測的狀態,這可能會導致損毀和停止回應。 如需此旗標的詳細資訊,請參閱 IGlobalOptions

設定要求者預設 COM 存取權檢查許可權

要求者必須注意,當他們的進程作為伺服器時(例如,允許寫入器修改備份元件檔),他們必須允許來自其他 VSS 參與者的來電,例如寫入器或 VSS 服務。

不過,根據預設,Windows 進程只會允許在相同登入工作階段 (SELF SID) 下執行的 COM 用戶端,或是在本機系統帳戶下執行。 這是潛在的問題,因為這些預設值不適用於 VSS 基礎結構。 例如,寫入器可能會以「備份操作員」用戶帳戶的形式執行,該用戶帳戶既不在與要求者進程相同的登入會話中,也不是本機系統帳戶。

若要處理這種類型的問題,每個 COM 伺服器進程都可以進一步控制是否允許 RPC 或 COM 用戶端執行伺服器所實作的 COM 方法(在此案例中為要求者),方法是使用 CoInitializeSecurity 來設定整個進程的「預設 COM 存取檢查許可權」。

要求者可以明確地執行下列動作:

  • 允許所有進程存取以呼叫要求者進程。

    這個選項可能適用於絕大多數要求者,而且由其他 COM 伺服器使用,例如,所有以 SVCHOST 為基礎的 Windows 服務都已使用此選項,預設為所有 COM+ 服務。

    允許所有進程執行連入 COM 呼叫不一定是安全性弱點。 做為 COM 伺服器的要求者,就像所有其他 COM 伺服器一樣,一律保留在其進程中實作的每個 COM 方法上授權其客戶端的選項。

    請注意,VSS 實作的內部 COM 回呼預設會受到保護。

    若要允許所有進程 COM 存取要求者,您可以將 NULL 安全性描述元傳遞為 CoInitializeSecurity 的第一個參數 (請注意 整個程式最多必須呼叫 CoInitializeSecurity 一次。

    下列程式代碼範例示範要求者如何在 Windows 8 和 Windows Server 2012 和更新版本中呼叫 CoInitializeSecurity ,以便與遠端檔案共用的 VSS 相容(RVSS):

    // 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_IMPERSONATE,   //  DWORD                        dwImpLevel,
            NULL,                          //  void                        *pAuthList,
            EOAC_STATIC,                   //  DWORD                        dwCapabilities,
            NULL                           //  void                        *pReserved3
            );
    

    使用 CoInitializeSecurity 明確設定要求者的 COM 層級安全性時,您應該執行下列動作:

    • 將驗證層級設定為至少 RPC_C_AUTHN_LEVEL_PKT_INTEGRITY。 為了獲得更好的安全性,請考慮使用 RPC_C_AUTHN_LEVEL_PKT_PRIVACY
    • 將模擬層級設定為 RPC_C_IMP_LEVEL_IMPERSONATE
    • 將遮蓋安全性功能設定為 EOAC_STATIC。 如需遮蓋安全性的詳細資訊,請參閱 遮蓋

    下列程式代碼範例示範要求者如何在 Windows 7 和 Windows Server 2008 R2 和更早版本中呼叫 CoInitializeSecurity (或在 Windows 8 和 Windows Server 2012 和更新版本中,如果不需要 RVSS 兼容性):

    // 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 用戶端有權呼叫其進程。 在第一個參數中指定安全性描述元的要求者,必須允許下列使用者對要求者進程執行連入呼叫:

    • 本機系統

    • 本機服務

      Windows XP: 在 Windows Server 2003 之前不支援此值。

    • 網路服務

      Windows XP: 在 Windows Server 2003 之前不支援此值。

    • 本機 Administrators 群組的成員

    • 本機備份操作員群組的成員

    • 在下列登錄位置中指定的特殊使用者,使用 「1」 作為其REG_DWORD值

明確控制要求者的用戶帳戶存取權

在某些情況下,限制要求者的存取權,以本機系統或本機系統管理員或本機備份操作員群組執行的進程可能太嚴格。

例如,指定的要求者進程通常不需要在系統管理員或備份操作員帳戶下執行。 基於安全性考慮,最好不要人為地提升程式許可權以支援 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 = 2<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 要求者。

執行系統狀態的檔案備份

如果要求者藉由備份個別檔案來執行系統狀態備份,而不是使用磁碟區映像進行備份,它必須呼叫 FindFirstFileNameW 和 FindNextFileNameW 函式,以列舉位於下列目錄中之檔案的硬式連結:

  • Windows\system32\WDI\perftrack\
  • Windows\WINSXS\

這些目錄只能由Administrators群組的成員存取。 基於這個理由,這類要求者必須在系統帳戶或屬於 Administrators 群組成員的用戶帳戶下執行。

Windows XP 和 Windows Server 2003:在 Windows Vista 和 Windows Server 2008 之前,不支援 FindFirstFileNameW FindNextFileNameW 函式。