web-dev-qa-db-ja.com

データベース所有者(DBO)に外部アクセスアセンブリのアクセス許可を付与する方法

.NETアセンブリ(.Net 3.5)からSQL 2008でアセンブリを作成しようとすると、以下のエラーが表示されます。エラーは、以下のプロパティのいずれかをtrueに設定する必要があることを示しています。

データベース所有者(DBO)に外部アクセスアセンブリ権限がTRUEである

データベースには、TRUSTWORTHYデータベースプロパティがあります

アセンブリは、外部アクセスアセンブリのアクセス許可を持つ、対応するログインを持つ証明書または非対称キーで署名されます。

完全なエラーは以下のとおりです。

アセンブリ 'SQLLogger'はPERMISSION_SET = EXTERNAL_ACCESSに対して許可されていないため、アセンブリ 'SQLLogger'のCREATEアセンブリは失敗しました。次のいずれかに該当する場合、アセンブリは承認されます。データベース所有者(DBO)に外部アクセスアセンブリ権限があり、データベースのTRUSTWORTHYデータベースプロパティがオンになっている。または、外部アクセスアセンブリのアクセス許可を持つ対応するログインを持つ証明書または非対称キーでアセンブリが署名されます。

前もって感謝します!

29
Dev

これらの設定はプロジェクトファイルで設定する必要があります!プロジェクトを右クリックして、プロジェクト構成から[データベース設定]をクリックし、[その他]タブを選択します。私がここに持っているものに類似した何かを見るはずです: Project Settings

これは次の質問と同じです: Error Running CLR Stored Proc

13
bleepzter

これは私のために働いた:

EXEC sp_changedbowner 'sa'
ALTER DATABASE [dbase] SET trustworthy ON

私もこれをやった:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO
35
hoggar

どうしても必要な場合を除いて、TRUSTWORTHY ONを設定notしてください!そして、ビルドせずに再署名できないアセンブリを読み込むときにのみ「必要」になります。また、「サポート」されていないためにSQL ServerのCLRホストにまだ含まれていない.NET Frameworkライブラリをロードする場合にほとんど発生します。これらの状況以外では、データベースをTRUSTWORTHY ONに設定しないでください。セキュリティホールが開くからです。

代わりに、次のことを行うことをお勧めします。

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ファイルを使用する場合、上記の手順はSQL Serverインスタンスごとに1回だけ実行する必要があります。アセンブリとそれらのアセンブリを含むデータベースの数は関係ありません。

このアプローチにより、(TRUSTWORTHYOFFに設定したままにして)データベースのセキュリティを維持し、EXTERNAL_ACCESSおよび/またはUNSAFEに設定できるアセンブリをさらにきめ細かく制御できます(異なるキーを使用して分離できるため)これらの異なるキーに基づく署名とログイン)。

ただし、mustTRUSTWORTHY ONメソッドを使用する必要がある場合、データベース所有者はsaである必要はありません。要件は、データベース所有者として登録されたログインにEXTERNAL ACCESS AssemblyまたはUNSAFE Assemblyのいずれかが付与されていることだけです(上記の非対称キーベースのログインの2つの権限)。

セキュリティオプションの詳細なウォークスルーについては、SQL Server Centralで書いた次の記事を参照してください。 SQLCLRレベル4への階段:セキュリティ(EXTERNALおよびUNSAFEアセンブリ) (無料登録が必要です)。


Visual Studio/SSDTを使用してこれを自動化する方法の詳細なウォークスルーについては、SQL Server Centralの次の3つの記事(3部構成シリーズ)を参照してください。

また、これらの3つの記事を書いて以来、T4テンプレートを使用してより簡単な方法を考え出しましたが、まだそれを書く時間がありませんでした。その場合、この回答をその記事へのリンクで更新します。

更新

SQL Server 2017では、「CLR strict security」という名前のサーバーレベルの構成オプションという形で新しい複雑さが導入されました。これはデフォルトで有効になっており、SAFEとしてマークされたものであっても、すべてのアセンブリに証明書または非対称キーで署名され、関連付けられたログインおよびにログインにUNSAFE Assemblyパーミッションが付与されている必要があります(EXTERNAL ACCESS Assemblyを付与するには不十分です)。次のSOへの私の答えをご覧ください。この新しい「機能」の詳細についての質問:

SQL Server 2017のCLR厳格なセキュリティ

25
Solomon Rutzky

次のコードは統合セキュリティのために私のために働いた:

ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO

ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
6
Stefan Michev

これは私がそれをうまく機能させる方法です:

ALTER DATABASE databasename SET trustworthy ON

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO

sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO

/
DROP Assembly assemblyname

GO


CREATE Assembly assemblyname
FROM 0x4D5A9000.....
WITH PERMISSION_SET = EXTERNAL_ACCESS
3
Michael Nielo

これは以下に対して機能します:

  • Visual Studio 2015 Update 2。
  • Visual Studio 2017。

プロジェクト設定で、「外部アクセス」を選択します。

enter image description here

公開時に、アセンブリが「信頼できる」に設定されていない限り、「EXTERNAL_ACCESS」を受け入れることができないというエラーメッセージが表示されます。

そのため、プロジェクト設定で、アセンブリを「信頼できる」に設定します。

enter image description here

これは、 ローカルハードドライブ上のファイルをリストするユーザー定義関数のサンプル を実行できたことを意味します。

それでもセキュリティが厳しすぎる場合は、属性DataAccess = DataAccessKind.Read UDFに、たとえば:

[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]

更新2017-07-02

SQL Server 2016 + Visual Studio 2015、次のことも必要になる場合があります。

  • use master;grant unsafe Assembly to [Domain\Username];
  • Administratorモードでプログラム(Visual StudioやC#ユーティリティなど)を実行して、UNSAFEアセンブリを公開するための十分なアクセス許可を与えます。

うまくいかない場合は、ユーザー名saと管理者パスワードを使用して接続してみてください。 Visual StudioがAdministratorモードで実行されているかどうかに関係なく、これは常に機能します。

3
Contango

この単一の行は私のために問題を解決します

use master;
grant external access Assembly to [domain\username]
2
Iman Abidi