⚠‼設定しないでくださいTRUSTWORTHY ON
...⚠
...絶対に必要な場合を除いて‼そして、ビルドしていないアセンブリをロードする場合でも、「必要」になることはほとんどありません( SQL Serverにロードした後、いつでも別の証明書を追加できます。最悪の場合は署名できます)。または、「サポート」されていないためにSQL ServerのCLRホストにまだ存在しない.NETFrameworkライブラリをロードする場合(署名された証明書を使用できます。最悪の場合:SQL Serverにロードした後に署名します)。データベースを設定TRUSTWORTHY ON
してセキュリティホールを開くように設定します。詳細については、以下を参照してください。
お願いします、お願いします、なりすまし、信頼できる、およびクロスDB所有権チェーンの使用を停止してください
その代わり、
次のことを行う方がはるかに優れています。
USE [master];
CREATE ASYMMETRIC KEY [SomeKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\Some.dll';
CREATE LOGIN [SomeLogin]
FROM ASYMMETRIC KEY [SomeKey];
GRANT EXTERNAL ACCESS ASSEMBLY TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"
上記は、インスタンスごと、キーごとに1回だけ実行する必要があります。したがって、すべてのアセンブリに同じsnk
/pfx
ファイルを使用する場合、上記の手順はSQLServerインスタンスごとに1回だけ実行する必要があります。アセンブリとそれらのアセンブリを含むデータベースの数は重要ではありません。または、証明書を使用して署名する場合は、上記のサンプルコードでに置き換えASYMMETRIC KEY
てください。CERTIFICATE
このアプローチにより、データベースのセキュリティを向上させ(にTRUSTWORTHY
設定したままにすることで)、どのアセンブリに設定したり、(署名やログインに基づいて異なるキーを使用して分離OFF
できるため)を許可するかをより細かく制御できます。それらの異なるキーで)。EXTERNAL_ACCESS
UNSAFE
ただし、このメソッドを使用する必要がある場合は、データベースの所有者がである必要はありません。要件は、データベース所有者として登録されたログインに、または(非対称キーベースのログインについて上記で示したのと同じ2つのアクセス許可)が付与されていることだけです。意味:TRUSTWORTHY ON
sa
EXTERNAL ACCESS ASSEMBLY
UNSAFE ASSEMBLY
USE [master];
GRANT UNSAFE ASSEMBLY TO [{Login-that-is-dbo-for-DB-containing-Assembly}];
セキュリティオプションの詳細なウォークスルーについては、SQL Server Centralで作成した次の記事を参照してください。SQLCLRレベル4への階段:セキュリティ(EXTERNALおよびUNSAFEアセンブリ)。
Visual Studio / SSDTを介してこれを自動化する方法の詳細なウォークスルーについては、SQL Server Centralに関する次の3つの記事(3部構成のシリーズ)を参照してください。
また、これら3つの記事を書いたので、T4テンプレートを使用するより簡単な方法を思いつきましたが、まだそれを書く時間がありませんでした。私がそうするとき、私はその記事へのリンクでこの答えを更新します。
アップデート
SQL Server 2017では、「CLRstrictsecurity」という名前のサーバーレベルの構成オプションの形式で新しい複雑さが導入されました。これはデフォルトで有効になっており、マークが付けられているアセンブリも含め、すべてのアセンブリにSAFE
証明書または非対称キーで署名され、関連付けられたログインがあり、ログインにUNSAFE ASSEMBLY
アクセス許可が付与されている必要があります(付与するには不十分EXTERNAL ACCESS ASSEMBLY
です)。この新しい「機能」の詳細については、次のSOの質問に対する私の回答を参照してください。
SQLServer2017でのCLRの厳格なセキュリティ