次の方法で共有


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

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

注意

偽装での動作の変更については、「SQL Server 2014 でのデータベース エンジン機能の破壊的変更」を参照してください。

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

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

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

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

コードが SQL Server と異なる偽装コンテキストで実行されている場合、そのコードはインプロセス データ アクセス呼び出しを実行できません。そのコードがインプロセス データ アクセス呼び出しを行うには、偽装コンテキストを取り消す必要があります。 インプロセス データ アクセスがマネージド コードから行われる場合は、マネージド コードへの Transact-SQL エントリ ポイントの最初の実行コンテキストが常に認証に使用されます。

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

参照

CLR 統合のセキュリティ
接続の権限借用と資格情報