要求者のセキュリティに関する考慮事項

VSS インフラストラクチャでは、バックアップ アプリケーションなどの VSS リクアスターが COM クライアントとサーバーの両方として機能できるようにする必要があります。

サーバーとして機能する場合、リクエスターは、外部プロセス (ライターや VSS サービスなど) から呼び出すことができる一連の COM コールバック インターフェイスを公開します。 そのため、要求者は、どの COM クライアントがそのプロセスに着信 COM 呼び出しを行うことができるかを安全に管理する必要があります。

同様に、要求元は、VSS ライターまたは VSS サービスによって提供される COM API の COM クライアントとして機能できます。 リクエスター固有のセキュリティ設定では、要求元からこれらの他のプロセスへの COM 呼び出しの発信を許可する必要があります。

リクエスターのセキュリティの問題を管理するための最も簡単なメカニズムは、それを実行するユーザー アカウントを適切に選択することです。

通常、リクエスターは、Administrators グループまたは Backup Operators グループのメンバーであるユーザーの下で実行するか、ローカル システム アカウントとして実行する必要があります。

既定では、要求元が COM クライアントとして機能している場合、これらのアカウントで実行されていない場合、COM メソッドの実装にアクセスすることなく、 E_ACCESSDENIEDを使用して COM 呼び出しが自動的に拒否されます。

COM 例外処理の無効化

リクエスターを開発する場合は、COM COMGLB_EXCEPTION_DONOT_HANDLEグローバル オプション フラグを設定して、COM 例外処理を無効にします。 これは、COM 例外処理によって VSS アプリケーションで致命的なエラーがマスクされる可能性があるため、これを行う必要があります。 マスクされたエラーにより、プロセスが不安定で予測不可能な状態になり、破損やハングが発生する可能性があります。 このフラグの詳細については、「 IGlobalOptions」を参照してください。

リクエスターの既定の COM アクセスチェック権限の設定

要求者は、プロセスがサーバーとして機能する場合 (たとえば、ライターがバックアップ コンポーネント ドキュメントを変更できるようにする場合)、ライターや VSS サービスなどの他の VSS 参加者からの着信呼び出しを許可する必要があることに注意する必要があります。

ただし、既定では、Windows プロセスでは、同じログオン セッション (SELF SID) で実行されているか、ローカル システム アカウントで実行されている COM クライアントのみが許可されます。 これらの既定値は VSS インフラストラクチャに適していないため、これは潜在的な問題です。 たとえば、ライターは、リクエスター プロセスと同じログオン セッションでもローカル システム アカウントでもない "バックアップ オペレーター" ユーザー アカウントとして実行される場合があります。

この種の問題を処理するために、すべての COM サーバー プロセスは、プロセス全体の "既定の COM アクセス チェックアクセス許可" を設定するために CoInitializeSecurity を使用して、サーバー (この場合はリクエスター) によって実装された COM メソッドの実行を RPC または COM クライアントに許可するかどうかをさらに制御できます。

要求者は、次の操作を明示的に実行できます。

  • すべてのプロセスがリクエスター プロセスを呼び出せるようにします。

    このオプションは、要求者の大部分に適している可能性があり、他の COM サーバーで使用されます。たとえば、すべての SVCHOST ベースの Windows サービスでは、既定ですべての COM+ サービスと同様に、このオプションが既に使用されています。

    すべてのプロセスが着信 COM 呼び出しを実行できるようにするのは、必ずしもセキュリティ上の弱点ではありません。 他のすべての COM サーバーと同様に、COM サーバーとして機能する要求者は、そのプロセスで実装されるすべての COM メソッドでクライアントを承認するオプションを常に保持します。

    VSS によって実装される内部 COM コールバックは、既定でセキュリティで保護されることに注意してください。

    すべてのプロセスの COM がリクエスターにアクセスできるようにするには、CoInitializeSecurity の最初のパラメーターとして NULL セキュリティ記述子を渡すことができます。 ( CoInitializeSecurity は、プロセス全体で最大 1 回呼び出す必要があることに注意してください。 CoInitializeSecurity 呼び出しの詳細については、COM ドキュメントまたは MSDN を参照してください)。

    次のコード例は、リモート ファイル共有 (RVSS) の VSS Windows Server 2012 と互換性を持つように、リクエスターが Windows 8 以降で 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_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 以前 (RVSS 互換性が不要な場合は、Windows 8およびWindows Server 2012以降) で 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 クライアントがそのプロセスを呼び出す権限を持っていることを確認する必要があります。 最初のパラメーターでセキュリティ記述子を指定するリクエスターは、次のユーザーがリクエスター プロセスへの着信呼び出しを実行できるようにする必要があります。

    • [ローカル システム]

    • Local Service

      Windows XP: この値は、Windows Server 2003 までサポートされていません。

    • Network Service

      Windows XP: この値は、Windows Server 2003 までサポートされていません。

    • ローカル管理者グループのメンバー

    • ローカル Backup Operators グループのメンバー

    • 以下のレジストリの場所で指定された特別なユーザーで、REG_DWORD値として "1" が指定されています

要求者へのユーザー アカウント アクセスを明示的に制御する

要求元へのアクセスを、ローカル システムとして実行されているプロセス、またはローカル管理者またはローカル バックアップオペレーター グループの下で実行するように制限する場合があります。

たとえば、通常、指定された要求元プロセスを管理者またはバックアップ オペレーター アカウントで実行する必要がない場合があります。 セキュリティ上の理由から、VSS をサポートするためにプロセス特権を人為的に昇格しないことをお勧めします。

このような場合は、指定されたユーザーが VSS リクエスターを実行しても安全であることをVSS\ に指示するために、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ VSSVssAccessControl レジストリ キーを変更する必要があります。

このキーの下に、アクセスを許可または拒否するアカウントと同じ名前のサブキーを作成する必要があります。 このサブキーは、次の表のいずれかの値に設定する必要があります。

説明
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:FindFirstFileNameW 関数と FindNextFileNameW 関数は、Windows Vista および Windows Server 2008 まではサポートされません。