偽装レベル
偽装が成功した場合、クライアントはサーバーをある程度クライアントにすることに同意したことを意味します。 さまざまな権限借用の度合いは、偽装レベルと呼ばれ、クライアントを偽装するときにサーバーに与えられる権限の量を示します。
現在、4 つの偽装レベルがあります。匿名 、の識別、の偽装、委任 。 次の一覧では、各偽装レベルについて簡単に説明します。
-
匿名 (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値を CoInitializeSecurity渡すか、dwImpLevel パラメーターを使用して CoSetProxyBlanketをします。
認証サービスによって、異なるエクステントへの委任レベルの偽装がサポートされます。 たとえば、NTLMSSP はクロススレッドおよびクロスプロセス デリゲート レベルの偽装をサポートしますが、クロスコンピューターはサポートしません。 一方、Kerberos プロトコルでは、コンピューターの境界を越えた委任レベルの偽装がサポートされますが、Schannel では委任レベルでの偽装はサポートされません。 偽装レベルのプロキシがあり、権限借用レベルをデリゲートに設定する場合は、偽装レベルを除くすべてのパラメーターの既定の定数 使用して SetBlanket を呼び出す必要があります。 COM は NTLM をローカルに選択し、Kerberos プロトコルをリモートで選択します (Kerberos プロトコルが機能する場合)。
関連トピック