TRUSTWORTHY
データベースのプロパティ (ON
に設定されている場合) ) は、基本的に、そのデータベース内に含まれ、偽装されたコンテキストで実行されるコードが、その偽装されたセキュリティ コンテキストを維持しながら、そのデータベースの外部にアクセスできるようにする必要があることを SQL Server に宣言します。また、すべてを許可します そのデータベースの SQLCLR アセンブリを EXTERNAL_ACCESS
に設定する と UNSAFE
、そのコードがサーバーの外部に到達するかどうか (外部の意味:ネットワーク アクセス、ファイル システム アクセス、レジストリ アクセス、環境アクセスなど)。
これは、データベース内のすべてのコードをカバーするため、これを可能にするかなり一般的な手段です。証明書や非対称キーを使用してモジュール (proc やアセンブリ) に署名すると、どのコードにどの権限が付与されるかをより細かく制御できます。
データベースを TRUSTWORTHY
に設定する また、このデータベースで開始するすべてのプロセスが、サーバーレベルおよび/または他のデータベースに到達できるようにします。通常、プロセスは開始されたデータベースに限定/隔離されます。データベースが「sa」ログインによって所有されている場合、そのデータベースで開始され、「dbo」として実行されているすべてのプロセスは、実質的に「sa」特権を持ちます (いいね!)。
なりすましの詳細を完全に伝えるために必要な詳細をここで説明しようとするのではなく、このトピックに関する次のリソースを熟読することをお勧めします:
- お願いします、偽装、TRUSTWORTHY、クロス DB 所有権チェーンの使用を停止してください
- SQL Server で TRUSTWORTHY データベース設定を使用するためのガイドライン
- EXECUTE AS を使用してデータベースの偽装を拡張する
これは、このトピックのほとんどの側面をカバーする非常に有益なドキュメントであり、上記のリンク先ページでも参照されています。 - への階段SQLCLR レベル 4:セキュリティ (EXTERNAL および UNSAFE アセンブリ)
これは、SQLCLR に関するシリーズの一部として私が書いた記事で、TRUSTWORTHY メソッドと Signed Assembly ベースの Login メソッドの違いを示す例が含まれています。無料登録が必要です。
データベースを TRUSTWORTHY
に設定することは避けるべきです できるだけ。本当にマルチスレッド/非同期呼び出しが必要で、ソース コードがあり、アセンブリをコンパイルしている場合、SET TRUSTWORTHY ON
を使用する理由が思いつきません。 オプション。代わりに、パスワードを使用してアセンブリに署名する必要があります 次のコマンドを使用して、EXTERNAL_ACCESS
を許可する優先方法を設定します。 と UNSAFE
アセンブリ:
USE [master];
CREATE ASYMMETRIC KEY [ClrPermissionsKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll';
CREATE LOGIN [ClrPermissionsLogin]
FROM ASYMMETRIC KEY [ClrPermissionsKey];
GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin];
配置したら、アセンブリが読み込まれて実行されたデータベースに移動できます。
ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;
または、WITH PERMISSION_SET = UNSAFE
を含めることもできます CREATE ASSEMBLY
の最後に コマンド。