権限借用と CLR 統合のセキュリティ
マネージド コードが外部リソースにアクセスする場合、SQL Serverは、ルーチンが実行されている現在の実行コンテキストを自動的に偽装しません。 EXTERNAL_ACCESS
および UNSAFE
アセンブリのコードは、現在の実行コンテキストの権限を明示的に借用することができます。
注意
偽装での動作の変更については、「SQL Server 2014 でのデータベース エンジン機能の破壊的変更」を参照してください。
インプロセス データ アクセス プロバイダーには、SqlContext.WindowsIdentity
というアプリケーション プログラミング インターフェイスが用意されています。これを使用して、現在のセキュリティ コンテキストに関連付けられたトークンを取得できます。 EXTERNAL_ACCESS
アセンブリと UNSAFE
アセンブリのマネージド コードでは、このメソッドを使用してコンテキストを取得し、.NET Framework WindowsIdentity.Impersonate
メソッドを使用してそのコンテキストの権限を借用できます。 ユーザー コードから明示的に権限を借用するときは、次の制限事項が適用されます。
マネージド コードが権限を借用している状態のときは、インプロセス データ アクセスは許可されません。 コードで、権限借用を元に戻してから、インプロセス データ アクセスを呼び出すことができます。 このためには、元の
WindowsImpersonationContext
メソッドの戻り値 (Impersonate
オブジェクト) を格納し、このUndo
のWindowsImpersonationContext
メソッドを呼び出す必要があります。つまり、インプロセス データ アクセスは、常に、セッションに対して有効な現在のセキュリティ コンテキストで行われます。 マネージド コード内の明示的な権限借用によりこれを変更することはできません。
(たとえば、スレッドを作成してコードを非同期に実行する
UNSAFE
アセンブリを経由するなどして) 非同期に実行されているマネージド コードの場合、インプロセス データ アクセスは一切許可されません。 これは、権限借用の有無には関係ありません。
コードが SQL Server と異なる偽装コンテキストで実行されている場合、そのコードはインプロセス データ アクセス呼び出しを実行できません。そのコードがインプロセス データ アクセス呼び出しを行うには、偽装コンテキストを取り消す必要があります。 インプロセス データ アクセスがマネージド コードから行われる場合は、マネージド コードへの Transact-SQL エントリ ポイントの最初の実行コンテキストが常に認証に使用されます。
アセンブリとUNSAFE
アセンブリはどちらもEXTERNAL_ACCESS
、前述のように現在のセキュリティ コンテキストを自発的に偽装しない限り、SQL Server サービス アカウントを使用してオペレーティング システム リソースにアクセスします。 このため、EXTERNAL_ACCESS
アセンブリの作成者には、SAFE
アセンブリの作成者よりも高いレベルの信頼度が必要です。この信頼度は、EXTERNAL ACCESS
ログイン レベルの権限で指定されます。 SQL Server サービス アカウントでコードを実行することが信頼されているログインにのみ、アクセス許可を付与するEXTERNAL ACCESS
必要があります。