CLR 統合のコード アクセス セキュリティ
適用対象: SQL サーバー
共通言語ランタイム (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 (CREATE ASSEMBLY (Transact-SQL) のPERMISSION_SETオプションを使用して指定) の 3 つのアクセス許可セットがあります。
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 | コンテキスト接続 = true、context connection = yes: コンテキスト接続のみを使用でき、接続文字列は "context connection=true" または "context connection=yes" の値のみを指定できます。 AllowBlankPassword = false: 空白のパスワードは許可されません。 |
EXTERNAL_ACCESS
EXTERNAL_ACCESS アセンブリには、 SAFE アセンブリと同じアクセス許可があり、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにアクセスする追加の機能があります。
EXTERNAL_ACCESS アセンブリには、次のアクセス許可と値もあります。
権限 | 値/説明 |
---|---|
DistributedTransactionPermission | 無制限: 分散トランザクションが許可されます。 |
DNSPermission | 無制限: ドメイン ネーム サーバーから情報を要求するアクセス許可。 |
EnvironmentPermission | 無制限: システム環境変数とユーザー環境変数へのフル アクセスが許可されます。 |
EventLogPermission | 管理: イベント ソースの作成、既存のログの読み取り、イベント ソースまたはログの削除、エントリへの応答、イベント ログのクリア、イベントのリッスン、およびすべてのイベント ログのコレクションへのアクセスが許可されます。 |
FileIOPermission | 無制限: ファイルとフォルダーへのフル アクセスが許可されます。 |
KeyContainerPermission | 無制限: キー コンテナーへのフル アクセスが許可されます。 |
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 | 無制限: データソースへのフル アクセスが許可されます。 |
StorePermission | 無制限: X.509 証明書ストアへのフル アクセスが許可されます。 |
WebPermission | Connect: Web リソースへの送信接続が許可されます。 |
UNSAFE
UNSAFE を使用すると、アセンブリは SQL Server 内と外部の両方のリソースに無制限にアクセスできます。 UNSAFE アセンブリ内から実行されるコードは、アンマネージ コードを呼び出すこともできます。
UNSAFE アセンブリには、FullTrust 指定されます。
推奨されるアクセス許可の設定
SAFE は、SQL Server の外部のリソースにアクセスせずに計算タスクとデータ管理タスクを実行するアセンブリに推奨されるアクセス許可設定です。
EXTERNAL_ACCESS は、SQL Server の外部のリソースにアクセスするアセンブリに推奨されます。 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 統合アセンブリの管理を参照してください。
重要
SQL Server には、データベース エンジン エンジンが特定の機能を提供するために使用する CLR アセンブリが含まれています。 SQL Server のインストールに含まれる Microsoft.SQLServer.Types
アセンブリは、メタデータに UNSAFE アセンブリとして表示されます。 これは仕様です。 これらのアセンブリは、既定で信頼済みで安全と見なされます。
外部リソースへのアクセス
ユーザー定義型 (UDT)、ストアド プロシージャ、またはその他の種類のコンストラクト アセンブリが SAFE アクセス許可セットに登録されている場合、コンストラクトで実行されているマネージド コードは外部リソースにアクセスできません。 ただし、 EXTERNAL_ACCESS または UNSAFE 権限セットを指定し、マネージド コードが外部リソースへのアクセスを試みる場合、SQL Server は次の規則を適用します。
次の場合 | Then |
---|---|
実行コンテキストは、SQL Server ログインに対応します。 | 外部リソースへのアクセスが拒否され、セキュリティ例外が発生します。 |
実行コンテキストが Windows ログインに対応していると同時に、本来の呼び出し元である場合。 | 外部リソースは、SQL Server サービス アカウントのセキュリティ コンテキストでアクセスされます。 |
呼び出し元が、本来の呼び出し元ではない場合。 | アクセスが拒否され、セキュリティ例外が発生します。 |
実行コンテキストが Windows ログインに対応していて、実行コンテキストが本来の呼び出し元であり、呼び出し元の権限が借用されている場合。 | アクセスにはサービス アカウントではなく、呼び出し元のセキュリティ コンテキストが使用されます。 |
権限セットの概要
次の表は、 SAFE、 EXTERNAL_ACCESS、および UNSAFE 権限セットに付与される制限とアクセス許可をまとめたものです。
機能 | SAFE | EXTERNAL_ACCESS | UNSAFE |
---|---|---|---|
コード アクセス セキュリティのアクセス許可 | 実行のみ | 実行および外部リソースへのアクセス | 無制限 (P/Invoke を含む) |
プログラミング モデルの制限事項 | はい | はい | 制限事項なし |
検証可能性の要件 | はい | はい | いいえ |
ローカル データ アクセス | はい | イエス | はい |
ネイティブ コードを呼び出す機能 | いいえ | 番号 | 有効 |
参照
CLR 統合のセキュリティ
ホスト保護属性と CLR 統合プログラミング
CLR 統合プログラミング モデルの制限事項
CLR ホスト環境