偽装レベル

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

現時点では、匿名識別、偽装、委任の 4 つの偽装レベルがあります。 次の一覧では、各偽装レベルについて簡単に説明します。

anonymous (RPC_C_IMP_LEVEL_ANONYMOUS)

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

identify (RPC_C_IMP_LEVEL_IDENTIFY)

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

偽装 (RPC_C_IMP_LEVEL_IMPERSONATE)

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

delegate (RPC_C_IMP_LEVEL_DELEGATE)

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

代理人レベルで権限借用を機能させるには、次の要件を満たす必要があります。

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

偽装レベルを選択すると、クライアントは、クライアントの偽装にどの程度進むことができるかをサーバーに指示します。 クライアントは、サーバーとの通信に使用するプロキシの偽装レベルを設定します。

偽装レベルの設定

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

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

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

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

委任と偽装