偽装レベル

偽装が成功した場合、クライアントがサーバーをクライアントにすることにある程度同意したことになります。 さまざまな程度の偽装は偽装レベルと呼ばれ、クライアントを偽装するときにサーバーに与えられる権限の量を示します。

現在、匿名識別偽装委任の 4 つの偽装レベルがあります。 次のリストは、各偽装レベルを簡単に説明したものです。

anonymous (RPC_C_IMP_LEVEL_ANONYMOUS)

クライアントはサーバーに対して匿名です。 サーバー プロセスはクライアントを偽装できますが、偽装トークンにはそのクライアントに関する情報は格納されていません。 このレベルは、ローカルのプロセス間通信トランスポート上でのみサポートされます。 他のすべてのトランスポートは、このレベルを暗黙的にプロモートして識別します。

識別 (RPC_C_IMP_LEVEL_IDENTIFY)

システム既定のレベル。 サーバーはクライアントの ID を取得できるため、クライアントを偽装して ACL チェックを実行できます。

偽装 (RPC_C_IMP_LEVEL_IMPERSONATE)

サーバーはクライアントのセキュリティ コンテキストを偽装しつつ、そのクライアントに代わってアクションを実行できます。 サーバーはクライアントとしてローカル リソースにアクセスできます。 サーバーがローカルの場合は、クライアントとしてネットワーク リソースにアクセスできます。 サーバーがリモートの場合は、サーバーと同じコンピューター上にあるリソースにのみアクセスできます。

委任 (RPC_C_IMP_LEVEL_DELEGATE)

最も強力な偽装レベル。 このレベルを選択すると、サーバーはローカル、リモートにかかわらず、クライアントのセキュリティ コンテキストを偽装しつつ、そのクライアントに代わってアクションを実行できます。 偽装中、クライアントの資格情報 (ローカルとネットワークの両方) を任意の数のコンピューターに渡すことができます。

委任レベルで偽装が機能するには、次の要件を満たす必要があります。

  • クライアントは、偽装レベルを RPC_C_IMP_LEVEL_DELEGATE に設定する必要があります。
  • クライアント アカウントは、Active Directory サービスで「アカウントは機密であるため委任できません」とマークされていてはなりません。
  • サーバー アカウントは、Active Directory サービスで「委任を信頼済み」属性でマークされている必要があります。
  • クライアント、サーバー、および「ダウンストリーム」サーバーをホストするコンピューターはすべてドメイン内で実行されている必要があります。

偽装レベルを選択することにより、クライアントはサーバーに、クライアントの偽装でどこまで実行できるかを伝えます。 クライアントは、サーバーとの通信に使用するプロキシの偽装レベルを設定します。

偽装レベルの設定

偽装レベルを設定するには、次の 2 つの方法があります。

  • クライアントは、CoInitializeSecurity の呼び出しを通じて、プロセス全体に設定できます。
  • クライアントは、IClientSecurity::SetBlanket (またはヘルパー関数 CoSetProxyBlanket) の呼び出しを通じて、リモート オブジェクトのインターフェイスにプロキシ レベルのセキュリティを設定できます。

偽装レベルを設定するには、適切なRPC_C_IMP_LEVEL_xxx値を dwImpLevel パラメーターを使用して、CoInitializeSecurity または CoSetProxyBlanket に渡します。

さまざまな認証サービスが、さまざまな範囲で委任レベルの偽装をサポートしています。 たとえば、NTLMSSP は、クロススレッドおよびクロスプロセスの委任レベルの偽装をサポートしますが、クロスコンピューターはサポートしません。 一方、Kerberos プロトコルはコンピューターの境界を越えたデリゲート レベルの偽装をサポートしますが、Schannel はデリゲート レベルでの偽装をサポートしません。 偽装レベルにプロキシがあり、権限借用レベルを委任に設定する場合は、偽装レベルを除くすべてのパラメーターの既定の定数を使用して SetBlanket を呼び出す必要があります。 COM は、ローカルでは NTLM を選択し、リモートでは Kerberos プロトコルを選択します (Kerberos プロトコルが機能する場合)。

委任と偽装