SQL Server プログラミングとホスト保護属性
SQL Server ホストでマネージ コードを読み込んで実行するには、コード アクセス セキュリティとホスト リソース保護の両方に対するホストの要件を満たす必要があります。 コード アクセス セキュリティ要件は、SAFE、EXTERNAL-ACCESS、UNSAFE という 3 つの SQL Server アクセス許可セットのうちのいずれかによって指定されます。 SAFE アクセス許可セットまたは EXTERNAL-ACCESS アクセス許可セット内で実行するコードでは、HostProtectionAttribute 属性が適用されている特定の型またはメンバーの使用を避ける必要があります。 HostProtectionAttribute は、ホストによって許可されない可能性がある特定のコード コンストラクター (型またはメソッド) を識別するという点で、信頼性の保証に相当するほどのセキュリティ アクセス許可とは言えません。 HostProtectionAttribute を使用すると、ホストの安定性を保護するのに役立つプログラミング モデルが適用されます。
ホスト保護属性
ホスト保護属性は、ホスト プログラミング モデルに適合せず、次のような信頼性に対する脅威を表す型やメンバーを識別します。
ホスト プログラミング モデルに適合しないこと以外に問題がない。
サーバー管理ユーザー コードの不安定化につながる可能性がある。
サーバー プロセス自体の不安定化につながる可能性がある。
SQL Server は、SharedState、Synchronization、MayLeakOnAbort、または ExternalProcessMgmt の HostProtectionResource 値を指定する HostProtectionAttribute を持つ型またはメンバーを許可しません。 これにより、共有状態を有効にしたり、同期を実行したり、終了時にリソース リークの原因になったり、SQL Server プロセスの整合性に影響したりするメンバーのアセンブリによる呼び出しが防止されます。
許可されない型およびメンバー
HostProtectionResource 値が SQL Server によって許可されない型とメンバーを次の表に示します。
SQL Server アクセス許可セット
SQL Server では、データベースに配置されるコードの信頼性要件をユーザーが指定できます。 アセンブリをデータベースにアップロードする際に、アセンブリの作成者は、そのアセンブリのアクセス許可セットとして、SAFE、EXTERNAL-ACCESS、UNSAFE の 3 つのうちのいずれかを指定できます。
アクセス許可セット |
SAFE |
EXTERNAL-ACCESS |
UNSAFE |
---|---|---|---|
コード アクセス セキュリティ |
実行のみ |
実行 + 外部リソースへのアクセス |
制限なし |
プログラミング モデルの制限 |
○ |
○ |
制限なし |
検証可能性の要求 |
○ |
○ |
X |
ネイティブ コードの呼び出し |
× |
× |
○ |
SAFE は、許可されるプログラミング モデルに関連付けられている制限を持つ、最も信頼できる安全なモードです。 SAFE コードは、高い信頼性とセキュリティ機能を備えています。 SAFE アセンブリには、動作、計算の実行、およびローカル データベースへのアクセスに関して十分なアクセス許可が与えられます。 SAFE アセンブリは、検証可能という点でタイプ セーフである必要があり、アンマネージ コードを呼び出すことができません。
EXTERNAL-ACCESS は中間的なセキュリティ オプションであり、コードに対してデータベース外部のリソースへのアクセスを許可しますが、SAFE と同じ信頼性と安全性を備えています。
UNSAFE は、データベース管理者のみが作成できる信頼性の高いコードを対象にしています。 この信頼されたコードにはコード アクセス制限がなく、アンマネージ (ネイティブ) コードを呼び出すことができます。
SQL Server では、ホスト レベルのコード アクセス セキュリティ ポリシー レイヤーを使って、SQL Server カタログに格納されているアクセス許可セットを基に 3 つのアクセス許可セットのいずれかを付与するホスト ポリシーを設定します。 データベース内部で動作するマネージ コードは、常にこれらのコード アクセス許可セットのいずれかを取得します。
プログラミング モデルの制限
SQL Server におけるマネージ コードのプログラミング モデルでは、複数の呼び出しにまたがって保持される状態を使用したり、複数のユーザー セッションにまたがって状態を共有したりする必要がない関数、プロシージャ、および型が必要です。 さらに、前述したように共有状態が存在すると、アプリケーションのスケーラビリティと信頼性に影響する重大な例外が発生する可能性があります。
これらの考慮事項により、SQL Server では、静的変数と静的データ メンバーを使用できません。 SAFE アセンブリや EXTERNAL-ACCESS アセンブリでは、SQL Server は、CREATE ASSEMBLY の実行時にアセンブリのメタデータを調べ、静的データ メンバーや静的変数の使用が認められた場合には、これらのアセンブリを作成しません。