Applies to:SQL Server
Azure SQL Managed Instance
マネージド ストアド プロシージャまたはその他のマネージド データベース オブジェクトをビルドすると、SQL Server は考慮する必要がある特定のコード チェックを実行します。 これらのチェックは、 CREATE ASSEMBLY
ステートメントを使用して、データベースに最初に登録されたとき、および実行時にマネージド コード アセンブリに対して実行されます。 また、実行時にマネージド コードもチェックされます。アセンブリ内には、実行時に実際には到達できないコード パスがある可能性があるためです。
These code checks provide flexibility for registering third-party assemblies especially, so that an assembly isn't blocked where there's unsafe code designed to run in a client environment, but would never be executed in the hosted common language runtime (CLR). マネージド コードが満たす必要がある要件は、アセンブリが SAFE
、 EXTERNAL_ACCESS
、または UNSAFE
として登録されているかどうかによって異なります。
SAFE
は最も厳密なセキュリティ レベルです。
マネージド コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。 CLR は、コード アクセス セキュリティ (CAS) と呼ばれるマネージド コード用のセキュリティ モデルをサポートしています。 このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。
SAFE
、EXTERNAL_ACCESS
、および UNSAFE
の各アセンブリには、それぞれ異なる CAS 権限が付与されます。 詳細については、「 CLR 統合コード アクセス セキュリティ」を参照してください。
If the publisher policy is set, CREATE ASSEMBLY
fails.
コード アクセス セキュリティはサポートされていません
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 管理者は、データベース エンジンが信頼するアセンブリのリストにアセンブリを追加することもできます。 For more information, see 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
アセンブリの条件がすべてチェックされていること。
Runtime checks
コード アセンブリは、実行時に次の条件をチェックされます。 これらの条件のいずれかが見つかった場合、マネージド コードの実行は許可されず、例外がスローされます。
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
の条件がすべてチェックされていること。