CLR 統合プログラミング モデルの制限事項

適用対象:SQL ServerAzure SQL Managed Instance

マネージド ストアド プロシージャまたはその他のマネージド データベース オブジェクトをビルドすると、SQL Server は考慮する必要がある特定のコード チェックを実行します。 これらのチェックは、 CREATE ASSEMBLY ステートメントを使用して、データベースに最初に登録されたとき、および実行時にマネージド コード アセンブリに対して実行されます。 また、実行時にマネージド コードもチェックされます。アセンブリ内には、実行時に実際には到達できないコード パスがある可能性があるためです。

これらのコードチェックは、特にサードパーティアセンブリの登録に柔軟性を提供し、クライアント環境で実行されるべきでないものの、ホストされた共通言語ランタイム(CLR)では実行されない安全でない コード が存在する場合でもアセンブリがブロックされるのを防ぎます。 マネージド コードが満たす必要がある要件は、アセンブリが SAFEEXTERNAL_ACCESS、または UNSAFEとして登録されているかどうかによって異なります。 SAFE は最も厳密なセキュリティ レベルです。

マネージド コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。 CLR は、コード アクセス セキュリティ (CAS) と呼ばれるマネージド コード用のセキュリティ モデルをサポートしています。 このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。 SAFEEXTERNAL_ACCESS、および UNSAFE の各アセンブリには、それぞれ異なる CAS 権限が付与されます。 詳細については、「 CLR 統合コード アクセス セキュリティ」を参照してください。

パブリッシャーポリシーが設定されていれば、CREATE ASSEMBLY失敗します。

コード アクセス セキュリティはサポートされていません

CLR では、セキュリティ境界としてサポートされなくなった、.NET Framework のコード アクセス セキュリティ (CAS) が使用されます。 PERMISSION_SET = SAFE で作成された CLR アセンブリが、外部のシステム リソースにアクセスし、非管理対象コードを呼び出し、sysadmin 特権を取得できる場合があります。 SQL Server 2017 (14.x) 以降のバージョンでは、sp_configure オプション、clr strict security により CLR アセンブリのセキュリティが強化されます。 clr strict security は既定で有効になり、SAFE および EXTERNAL_ACCESS アセンブリを UNSAFE とマークされている場合と同様に扱います。 clr strict security オプションは、旧バージョンとの互換性のために無効にできますが、これは推奨されません。

UNSAFE ASSEMBLYデータベースで master アクセス許可が付与されている対応するログインを含む証明書または非対称キーで、すべてのアセンブリに署名することをお勧めします。 SQL Server 管理者は、データベース エンジンが信頼するアセンブリのリストにアセンブリを追加することもできます。 詳細については、「sys.sp_add_trusted_assembly」を参照してください。

CREATE ASSEMBLY チェック

CREATE ASSEMBLY ステートメントを実行すると、セキュリティ レベルごとに次のチェックが実行されます。 チェックが失敗した場合、 CREATE ASSEMBLY はエラー メッセージで失敗します。

グローバル (すべてのセキュリティ レベル)

参照されるすべてのアセンブリは、次の条件のうち 1 つ以上を満たす必要があります。

  • 既にデータベースに登録されていること。

  • サポートされているアセンブリの 1 つであること。 詳細については、「サポートされている .NET Framework ライブラリの」を参照してください。

  • CREATE ASSEMBLY FROM <location>を使用しており、参照されているすべてのアセンブリとその依存関係を<location>で使用できます。

  • CREATE ASSEMBLY FROM <bytes ...>を使用しており、すべての参照はスペース区切りバイトで指定されます。

EXTERNAL_ACCESS

すべての EXTERNAL_ACCESS アセンブリは、次の条件を満たす必要があります。

  • 静的フィールドは、情報を格納するために使用されません。 読み取り専用の静的フィールドは許可されます。

  • PEVerify テストに合格しました。 共通中間言語 (CIL) コードと関連するメタデータが型の安全性要件を満たしていることを確認する PEVerify ツール (peverify.exe) は、.NET Framework SDK で提供されます。

  • たとえば、 SynchronizationAttribute クラスとの同期は使用されません。

  • ファイナライザー メソッドは使用されません。

EXTERNAL_ACCESS アセンブリでは、次のカスタム属性が許可されません。

  • System.ContextStaticAttribute
  • System.MTAThreadAttribute
  • System.Runtime.CompilerServices.MethodImplAttribute
  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute
  • System.Runtime.Remoting.Contexts.ContextAttribute
  • System.Runtime.Remoting.Contexts.SynchronizationAttribute
  • System.Runtime.InteropServices.DllImportAttribute
  • System.Security.Permissions.CodeAccessSecurityAttribute
  • System.Security.SuppressUnmanagedCodeSecurityAttribute
  • System.Security.UnverifiableCodeAttribute
  • System.STAThreadAttribute
  • System.ThreadStaticAttribute

SAFE

  • EXTERNAL_ACCESS アセンブリの条件がすべてチェックされていること。

ランタイムチェック

コード アセンブリは、実行時に次の条件をチェックされます。 これらの条件のいずれかが見つかった場合、マネージド コードの実行は許可されず、例外がスローされます。

UNSAFE

バイト配列から System.Reflection.Assembly.Load() メソッドを明示的に呼び出すか、 Reflection.Emit 名前空間を使用して暗黙的にアセンブリを読み込むことはありません。

EXTERNAL_ACCESS

UNSAFE の条件がすべてチェックされていること。

サポートされているアセンブリの一覧の中で、次のホスト保護属性 (HPA) 値で注釈を付けられている型およびメンバーはすべて許可されません。

  • SelfAffectingProcessMgmt
  • SelfAffectingThreading
  • Synchronization
  • SharedState
  • ExternalProcessMgmt
  • ExternalThreading
  • SecurityInfrastructure
  • MayLeakOnAbort
  • UI

HPA の詳細と、サポートされているアセンブリの許可されていない型とメンバーの一覧については、「ホスト保護属性と CLR 統合プログラミング」を参照してください。

SAFE

EXTERNAL_ACCESS の条件がすべてチェックされていること。