私はSQL Server 2017より前のデータベースをSQL Server 2017に復元したり、SQL Server 2017にアップグレードしたりしています。このデータベースにはSQLCLRアセンブリがあります。アセンブリはSAFE
としてマークされています。これは、より高いレベルの権限を必要とすることは何も行わず、データベースでTRUSTWORTHY
が無効/ OFF
になっているためです。 SQLCLR関数とストアドプロシージャは、SQL Server 2017に移行する前に期待どおりに機能しましたが、これらのいずれかを実行しようとすると、次のエラーが発生します。
メッセージ10314、レベル16、状態11、サーバーXXXXXXXXXXX、行YYYYYY
アセンブリID ZZZZZを読み込もうとしたときに、Microsoft .NET Frameworkでエラーが発生しました。サーバーでリソースが不足しているか、アセンブリが信頼されていない可能性があります。クエリを再度実行するか、ドキュメントをチェックして、アセンブリの信頼の問題を解決する方法を確認してください。このエラーの詳細については:
System.IO.FileLoadException:ファイルまたはアセンブリ '{Assembly_name}、Version = 0.0.0.0、Culture = neutral、PublicKeyToken = null'またはその依存関係の1つを読み込めませんでした。セキュリティに関するエラーが発生しました。 (HRESULTからの例外:0x8013150A)
CLR統合/ SQLCLRがサーバー/インスタンスで有効になっていることを確認しました。
エラーは、SQL Server 2017の新しい_clr strict security
_サーバーレベルの構成オプションの結果です。この新しいセキュリティ設定では、SAFE
とマークされているものでも、作成またはロードできませんanyアセンブリ次の場合を除いて、実行のためにメモリに保存します。
TRUSTWORTHY
のデータベースプロパティはON
です(これは不要なセキュリティリスクであるため、行わないでください)andデータベース所有者であるログイン(つまり、_[dbo]
_ユーザーが使用する同じSID) _UNSAFE Assembly
_権限が必要です(所有者がsa
の場合はすでに許可されている可能性がありますorsysadmin
固定サーバーロールのメンバーorおそらく_CONTROL SERVER
_権限)。clr strict security
_のサーバーレベルの構成オプションが無効になっている/ _0
_(不要なセキュリティリスクであるため、これを行わないでください)UNSAFE Assembly
_権限が付与された対応する署名ベースのログインがある(お願いこれを行う)この状況を修正するために必要なのは、次の手順のみです(これは難しくありませんand最高レベルのセキュリティを提供します)。
SAFE
アセンブリ:[master]
_にコピー(公開鍵のみ!)UNSAFE Assembly
_権限を付与しますこれの簡単な例(オプションのバックアップと秘密鍵の削除を除く)は次のようになります。
_USE [{database_containing_unsigned_safe_Assembly}];
CREATE CERTIFICATE [{certificate_name}]
ENCRYPTION BY PASSWORD = '{some password}'
WITH SUBJECT = '{simple description}',
EXPIRY_DATE = '2099-12-31';
ADD SIGNATURE
TO Assembly::[{Assembly_name}]
BY CERTIFICATE [{certificate_name}]
WITH PASSWORD = '{some password}';
DECLARE @PublicKey VARBINARY(MAX),
@SQL NVARCHAR(MAX);
SET @PublicKey = CERTENCODED(CERT_ID(N'{certificate_name}'));
SET @SQL = N'
CREATE CERTIFICATE [{certificate_name}]
FROM BINARY = ' + CONVERT(NVARCHAR(MAX), @PublicKey, 1) + N';';
PRINT @SQL; -- DEBUG
EXEC [master].[sys].[sp_executesql] @SQL;
EXEC [master].[sys].[sp_executesql] N'
CREATE LOGIN [{login_name}]
FROM CERTIFICATE [{certificate_name}];
GRANT UNSAFE Assembly TO [{login_name}]; -- REQUIRED!!!!
';
_
これの完全に機能する例(バックアップと秘密鍵の削除を除く)はPastebinにあります。
「信頼できるアセンブリ」を回避-デモ
なぜshould証明書を使用するのか、なぜnot "Trusted Assemblies"を使用するのかについての詳細な説明は、このブログ投稿で提供されています。
SQLCLRとSQL Server 2017、パート4:「信頼できるアセンブリ」–失望
また、セキュリティ上の問題を含む多数の問題と、それを使用することによる全体的な利点の欠如を考慮して、Microsoftに新しい「信頼されたアセンブリ」機能を削除するという私の要求をサポートすることを検討してください。