ライターのセキュリティに関する考慮事項

VSS インフラストラクチャでは、ライター プロセスが COM クライアントとサーバーの両方として機能できる必要があります。

サーバーとして機能する場合、VSS ライターは COM インターフェイス (たとえば、 CVssWriter::OnIdentify などの VSS イベント ハンドラー) を公開し、VSS プロセス (リクエスターや VSS サービスなど) からの着信 COM 呼び出しまたは VSS 外部のプロセスからの RPC 呼び出しを受け取ります。通常、これらのプロセスが VSS イベントを生成する場合 (たとえば、要求者が IVssBackupComponents を呼び出すとき:GatherWriterMetadata)。 そのため、VSS ライターは、プロセスに着信 COM 呼び出しを行うことができる COM クライアントを安全に管理する必要があります。

同様に、VSS ライターは COM クライアントとして機能し、VSS インフラストラクチャによって提供されるコールバックへの発信 COM 呼び出しや、VSS 外部のプロセスへの RPC 呼び出しを行う場合もあります。 バックアップ アプリケーションまたは VSS サービスによって提供されるこれらのコールバックを使用すると、ライターは IVssComponent インターフェイスを使用してバックアップ コンポーネント ドキュメントを更新するなどのタスクを実行できます。 したがって、VSS セキュリティ設定では、ライターが他の VSS プロセスに対して発信 COM 呼び出しを行えるようにする必要があります。

ライターのセキュリティの問題を管理するための最も簡単なメカニズムは、それが実行されるユーザー アカウントを適切に選択することです。 ライターは通常、Administrators グループまたは Backup Operators グループのメンバーであるユーザーの下で実行する必要があります。または、ローカル システム アカウントとして実行する必要があります。

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

COM 例外処理の無効化

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

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

ライターは、プロセスがサーバーとして機能する場合 (VSS イベントを処理する場合など)、要求元や VSS サービスなど、他の VSS 参加者からの着信呼び出しを許可する必要があることに注意する必要があります。

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

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

ライターは、次の操作を明示的に実行できます。

  • すべてのプロセスがライター プロセスを呼び出すアクセスを許可します。

    このオプションは、多くのライターに適しており、他の COM サーバーで使用される場合があります。たとえば、すべての SVCHOST ベースの Windows サービスでは、既定ですべての COM+ サービスと同様に、このオプションが既に使用されています。

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

    すべてのプロセスの COM がライターにアクセスできるようにするには、CoInitializeSecurity の最初のパラメーターとして NULL セキュリティ記述子を渡します。 ( CoInitializeSecurity は、プロセス全体で最大で 1 回呼び出す必要があることに注意してください。 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 をサポートするためにプロセスの特権を人為的に昇格させないようにすることをお勧めします。

このような場合は、指定したユーザーが 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 = 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 ライターを実行できません。