リクエスターのセキュリティに関する考慮事項

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

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

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

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

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

既定では、リクエスターが COM クライアントとして機能しているときに、これらのアカウントで実行されていない場合、COM 呼び出しはすべて、COM メソッドの実装に到達することなく E_ACCESSDENIED で自動的に拒否されます。

COM 例外処理を無効にする

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

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

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

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

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

リクエスターは、次の操作を明示的に実行できます。

  • リクエスター プロセスを呼び出すためのアクセスをすべてのプロセスに許可する。

    このオプションは、大多数のリクエスターには十分であり、他の COM サーバーで使用されています。たとえば、すべての SVCHOST ベースの Windows サービスは、すべての COM+ サービスと同様、このオプションが既に使用されています。

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

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

    すべてのプロセスに、リクエスターへの COM アクセスを許可にするには、CoInitializeSecurity の最初のパラメーターとして NULL セキュリティ記述子を渡します。 (CoInitializeSecurity は、プロセス全体に対して最大 1 回呼び出す必要があります。)

    次のコード例は、リモート ファイル共有 (RVSS) 用に VSS との互換性を確保するために、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_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 System

    • Local Service

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

    • Network Service

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

    • ローカル Administrators グループのメンバー

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

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

リクエスターへのユーザー アカウント アクセスを明示的に制御する

リクエスターへのアクセスを、ローカル システムとして、またはローカルの Administrators やローカルの Backup Operators グループによって実行されているプロセスに制限すると、制限が厳しすぎる場合があります。

たとえば、指定のリクエスター プロセスを、通常は Administrator または Backup Operators アカウントで実行する必要がない可能性があります。 セキュリティ上の理由から、VSS をサポートするためにプロセス特権を人為的に昇格しないことをお勧めします。

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

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

Value 意味
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 まではサポートされません。