権限借用と CLR 統合のセキュリティ

マネージ コードが外部リソースにアクセスする際に、SQL Server は、そのルーチンを実行している現在の実行コンテキストの権限を自動的には借用しません。EXTERNAL_ACCESS および UNSAFE アセンブリのコードは、現在の実行コンテキストの権限を明示的に借用することができます。

注意注意

SQL Server 2008 では、権限借用の動作が変更されています。詳細については、「SQL Server 2008 におけるデータベース エンジン機能の重大な変更」を参照してください。

インプロセス データ アクセス プロバイダには、SqlContext.WindowsIdentity というアプリケーション プログラミング インターフェイスが用意されています。これを使用して、現在のセキュリティ コンテキストに関連付けられたトークンを取得できます。EXTERNAL_ACCESS アセンブリと UNSAFE アセンブリのマネージ コードでは、このメソッドを使用してコンテキストを取得し、.NET Framework WindowsIdentity.Impersonate メソッドを使用してそのコンテキストの権限を借用できます。ユーザー コードから明示的に権限を借用するときは、次の制限事項が適用されます。

  • マネージ コードが権限を借用している状態のときは、インプロセス データ アクセスは許可されません。コードで、権限借用を元に戻してから、インプロセス データ アクセスを呼び出すことができます。このためには、元の Impersonate メソッドの戻り値 (WindowsImpersonationContext オブジェクト) を格納し、この WindowsImpersonationContext の Undo メソッドを呼び出す必要があります。

    つまり、インプロセス データ アクセスは、常に、セッションに対して有効な現在のセキュリティ コンテキストで行われます。マネージ コード内の明示的な権限借用によりこれを変更することはできません。

  • (たとえば、スレッドを作成してコードを非同期に実行する UNSAFE アセンブリを経由するなどして) 非同期に実行されているマネージ コードの場合、インプロセス データ アクセスは一切許可されません。これは、権限借用の有無には関係ありません。

SQL Server とは異なる権限を借用したコンテキストでコードを実行している場合、インプロセス データ アクセスの呼び出しを行うことはできません。つまり、インプロセス データ アクセスの呼び出しを行う前に、権限借用のコンテキストを元に戻す必要があります。マネージ コードからのインプロセス データ アクセスでは常に、マネージ コードへの Transact-SQL エントリ ポイントの本来の実行コンテキストが承認に使用されます。

既に説明したように、EXTERNAL_ACCESS アセンブリと UNSAFE アセンブリはどちらも、現在のセキュリティ コンテキストの権限を自主的に借用する場合以外は、SQL Server サービス アカウントでオペレーティング システム リソースにアクセスします。このため、EXTERNAL_ACCESS アセンブリの作成者には、SAFE アセンブリの作成者よりも高いレベルの信頼度が必要です。この信頼度は、EXTERNAL ACCESS ログイン レベルの権限で指定されます。EXTERNAL ACCESS 権限は、SQL Server サービス アカウントでコードを実行できるログインのみに許可する必要があります。