CLR 統合のコード アクセス セキュリティ

共通言語ランタイム (CLR) では、マネージ コードに対してコード アクセス セキュリティというセキュリティ モデルがサポートされます。このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。詳細については、.NET Framework Software Development Kit の「コード アクセス セキュリティ」を参照してください。

アセンブリに許可される権限を決定するセキュリティ ポリシーは、次の 3 つに分類されます。

  • コンピューター ポリシー : SQL Server がインストールされているコンピューターで実行されるすべてのマネージ コードに対して効力を持つポリシーです。

  • ユーザー ポリシー : 特定のプロセスをホストとするマネージ コードに対して効力を持つポリシーです。SQL Server の場合、ユーザー ポリシーは SQL Server サービスを実行している Windows アカウントに対して固有になります。

  • ホスト ポリシー : CLR のホスト (この場合は SQL Server) によって設定され、そのホストで実行されるマネージ コードに対して効力を持つポリシーです。

CLR でサポートされるコード アクセス セキュリティ メカニズムは、ランタイムが完全に信頼されるコードと部分的に信頼されるコードの両方をホストできるという前提に基づいています。CLR コード アクセス セキュリティで保護されるリソースは、通常、そのリソースへのアクセスを許可する前に適切な権限を必要とするマネージ アプリケーション プログラミング インターフェイスによってラップされます。権限の要求が満たされるのは、(アセンブリ レベルで) 呼び出し履歴内のすべての呼び出し元に、対応するリソース権限がある場合のみです。

マネージ コードを SQL Server 内部で実行する際に許可されるコード アクセス セキュリティ権限のセットは、上記の 3 つのポリシー レベルで許可される権限のセットの共通部分です。SQL Server に読み込まれたアセンブリに SQL Server が一連の権限を許可しても、最終的にユーザー コードに許可される権限セットは、ユーザー レベルおよびコンピューター レベルのポリシーによってさらに制限されることがあります。

SQL Server ホスト ポリシー レベルの権限セット

SQL Server ホスト ポリシー レベルでアセンブリに許可されるコード アクセス セキュリティ権限のセットは、アセンブリの作成時にどの権限セットを指定するかによって決定されます。この権限セットには、SAFE、EXTERNAL_ACCESS、および UNSAFE の 3 つがあります (CREATE ASSEMBLY (Transact-SQL) の PERMISSION_SET オプションを使用して指定)。

SQL Server は、CLR のホスト時に、ホスト レベルのセキュリティ ポリシー レベルを提供します。このポリシーは、常に効力を持つ 2 つのポリシー レベルより下位の追加ポリシー レベルになります。このポリシーは、SQL Server によって作成されるアプリケーション ドメインごとに設定されます。このポリシーは、SQL Server が CLR のインスタンスを作成するときに有効になる、既定のアプリケーション ドメイン用ではありません。

SQL Server ホスト レベル ポリシーは、システム アセンブリの SQL Server 固定ポリシーと、ユーザー アセンブリのユーザー指定ポリシーの組み合わせです。

CLR アセンブリと SQL Server システム アセンブリの固定ポリシーでは、これらのアセンブリを完全に信頼します。

SQL Server ホスト ポリシーのユーザー指定部分は、アセンブリの所有者がアセンブリごとに指定する 3 つの権限バケットのいずれかに基づきます。次に示すセキュリティ権限の詳細については、.NET Framework SDK を参照してください。

SAFE

内部コンピューター処理とローカル データのアクセスだけが許可されます。SAFE は最も制限が厳しい権限セットです。SAFE 権限が設定されているアセンブリで実行されるコードは、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにアクセスできません。

SAFE アセンブリには、次の権限および値が含まれます。

権限

値/説明

SecurityPermission

Execution: マネージ コードを実行する権限です。

SqlClientPermission

Context connection = true、context connection = yes: context-connection のみを使用できます。接続文字列に指定できる値は、"context connection=true" または "context connection=yes" だけです。

AllowBlankPassword = false: パスワードは空白にはできません。

EXTERNAL_ACCESS

EXTERNAL_ACCESS アセンブリの権限は、SAFE アセンブリの権限に、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにアクセスできる機能を加えたものです。

EXTERNAL_ACCESS アセンブリには、次の権限および値も含まれます。

権限

値/説明

DistributedTransactionPermission

Unrestricted: 分散トランザクションが許可されます。

DNSPermission

Unrestricted: ドメイン ネーム サーバーから情報を要求する権限です。

EnvironmentPermission

Unrestricted: システム環境変数およびユーザー環境変数への完全アクセスが許可されます。

EventLogPermission

Administer: イベント ソースの作成、既存ログの読み取り、イベント ソースまたはログの削除、エントリに対する応答、イベント ログの消去、イベントの待機、およびすべてのイベント ログのコレクションへのアクセスが許可されます。

FileIOPermission

Unrestricted: ファイルおよびフォルダーへの完全アクセスが許可されます。

KeyContainerPermission

Unrestricted: キー コンテナーへの完全アクセスが許可されます。

NetworkInformationPermission

Access: ping の実行が許可されます。

RegistryPermission

HKEY_CLASSES_ROOT、HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER、HKEY_CURRENT_CONFIG、および HKEY_USERS への読み取り権限が許可されます。

SecurityPermission

Assertion: このコードのすべての呼び出し元が操作に必要な権限を持っていることをアサートする機能です。

ControlPrincipal: プリンシパル オブジェクトを操作する機能です。

Execution: マネージ コードを実行する権限です。

SerializationFormatter: シリアル化サービスを提供する機能です。

SmtpPermission

Access: SMTP ホストの 25 番ポートへの発信接続が許可されます。

SocketPermission

Connect: トランスポート アドレスでの発信接続 (すべてのポートおよびプロトコル) が許可されます。

SqlClientPermission

Unrestricted: データ ソースへの完全アクセスが許可されます。

StorePermission

Unrestricted: X.509 証明書ストアへの完全アクセスが許可されます。

WebPermission

Connect: Web リソースへの発信接続が許可されます。

UNSAFE

UNSAFE では、アセンブリから SQL Server の内外のリソースにも無制限にアクセスできます。UNSAFE アセンブリ内からコードを実行することによって、アンマネージ コードを呼び出すこともできます。

UNSAFE アセンブリには、FullTrust が与えられます。

セキュリティに関する注意セキュリティに関する注意

SQL Server 外部のリソースにアクセスせずにコンピューター処理やデータ管理タスクを実行するアセンブリには、SAFE 権限を設定することをお勧めします。SQL Server 外部のリソースにアクセスするアセンブリには、EXTERNAL_ACCESS 権限をお勧めします。既定では、EXTERNAL_ACCESS アセンブリは、SQL Server サービス アカウントとして実行されます。EXTERNAL_ACCESS コードでは、呼び出し元の Windows 認証セキュリティ コンテキストの権限を明示的に借用できます。既定では SQL Server サービス アカウントとして実行されるので、EXTERNAL_ACCESS を実行する権限の付与は、サービス アカウントとしての実行が許可されているログインに限定する必要があります。セキュリティの点では、EXTERNAL_ACCESS アセンブリと UNSAFE アセンブリに変わりはありません。ただし、EXTERNAL_ACCESS アセンブリには、UNSAFE アセンブリにはない、信頼性や堅牢性を目的としたさまざまな保護機能が備わっています。UNSAFE を指定すると、アセンブリのコードから SQL Server プロセス空間に対して無効な操作を実行できるので、結果的には SQL Server の堅牢性やスケーラビリティを侵害する可能性があります。SQL Server での CLR アセンブリ作成の詳細については、「CLR 統合アセンブリの管理」を参照してください。

外部リソースへのアクセス

UDT (ユーザー定義型)、ストアド プロシージャ、または他の種類のコンストラクト アセンブリを SAFE 権限セットで登録すると、コンストラクト内で実行しているマネージ コードから外部リソースにアクセスできなくなります。EXTERNAL_ACCESS または UNSAFE のいずれかの権限セットを指定し、マネージ コードから外部リソースにアクセスする場合は、SQL Server によって次の規則が適用されます。

状況

結果

実行コンテキストが SQL Server ログインに対応している場合。

外部リソースへのアクセスが拒否され、セキュリティ例外が発生します。

実行コンテキストが Windows ログインに対応していると同時に、本来の呼び出し元である場合。

外部リソースへのアクセスは、SQL Server サービス アカウントのセキュリティ コンテキストで行われます。

呼び出し元が、本来の呼び出し元ではない場合。

アクセスが拒否され、セキュリティ例外が発生します。

実行コンテキストが Windows ログインに対応していて、実行コンテキストが本来の呼び出し元であり、呼び出し元の権限が借用されている場合。

アクセスにはサービス アカウントではなく、呼び出し元のセキュリティ コンテキストが使用されます。

権限セットの概要

次の表は、SAFE、EXTERNAL_ACCESS、および UNSAFE の各権限セットに付与される制限事項と権限を示しています。

SAFE

EXTERNAL_ACCESS

UNSAFE

Code Access Security Permissions

実行のみ

実行および外部リソースへのアクセス

無制限 (P/Invoke を含む)

Programming model restrictions

あり

あり

無制限

Verifiability requirement

あり

あり

なし

Local data access

あり

あり

あり

Ability to call native code

なし

なし

あり