私は答えのためにインターネットの多くを精査しました。私は、文法やアセンブリのチェックを除いて、VISUAL STUDIOのようなIDEを使わなくても、複数の(100以上の)SQL Server
インスタンスとサーバにCLR Assemblies
をデプロイするためのテンプレートを作成しました。 。 :)非対称キーが一致しません強化された強い名前
C#コンパイラcsc.exe
はSHA-1ハッシュを使用してアセンブリに署名するため、唯一のキャッチは私が署名した公開鍵のようです。したがって、唯一の回避策はEnhanced Strong Naming
またはMSBuild
です(ここでは実際にはオプションではありません)。
強化された強力なネーミングは、単純な十分なプロセスです:公開鍵を公開し、SHA-2
sn.exe -k [RSA_Length] CLR_IdentityKey.snk
:
は、厳密な名前のキー(
snk
)ファイルを作成します。sn.exe -p CLR_IdentityKey.snk CLR_PubKey.snk sha256
遅延が
csc.exe /target:library /keyfile:CLR_PubKey.snk /out:CLR_Assembly.dll "YourCSFiles.cs" "YourCSFiles2.cs" "YourCSFiles3.cs" /DelaySign+
(csc.exeのソースは、アセンブリの.NetFrameworkの互換性を規定する)は、公開鍵を使用してアセンブリに署名し、その後、厳密な名前を持つ元のキーとアセンブリを辞任ツール。
sn.exe -Ra CLR_Assembly.dll CLR_IdentityKey.snk
強化された厳密な名前のメソッドで私のアセンブリに署名したい主な理由は2つあり:時間の任意の長さのために、複数のサーバー上の秘密鍵を暴露
- は避けてください。
ASYMMETRIC KEY
を作成するときに暗号化されたパスワードを設定するオプションで、ハッシュされたpublic snkを公開する代替方法を提供してください。
私はpfx
とシンプルなSNKファイルの両方を使用してこれを実現することができますが、ここでの組立が簡単なHTTP POST
アクションで、証明書のコストは、イントラネット環境での小さな使用与え法外であることに注意してください。
b8ee775aa5bfbc5bです公開鍵(ハッシュアルゴリズム::SHA256):今、私はマニフェストに以下を参照してください、署名済みアセンブリの確認
002400000c80000014010000060200を...
公開キートークンは
明らかに、sn.exeはSHA-2メソッドを使用してアセンブリに正常に署名しました。
残念ながら、SQL Serverでこの署名付きアセンブリに基づいて非対称キーを作成しようとすると、公開キーが誤って関連付けられているようです。 'CLR_Assembly' アセンブリが PERMISSION_SET = UNSAFEを許可されていないため
アセンブリ ためのアセンブリを作成
メッセージ10327、レベル14、状態1、行14は 'CLR_Assembly' に失敗しました。データベースの所有者(DBO)にUNSAFE ASSEMBLY 権限があり、データベースにTRUSTWORTHYデータベースプロパティがある場合、アセンブリには のいずれかが当てはまるときに承認されます。 、またはアセンブリが、 にUNSAFE ASSEMBLY権限を持つログインがある証明書または非対称キーで署名されている。
例コード: 場所とセキュリティ権限の両方で、名前付きインスタンスとデフォルト名の間に違いがあることに注意してください。選択したフォルダに十分な権限がないため、追加する必要があります。
のPowershell:
# The version of csc.exe dictates the version of .NetFramework your assembly is created.
$csc_path="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"
$sn_path="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\sn.exe"
$CLR_path="C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\"
$CLR_Assembly_SNK=$CLR_path + "CLR_SNK.dll"
$CLR_Assembly_DelaySign=$CLR_path + "CLR_DelaySign.dll"
$cs_BackComp="C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\BackwardsCompatibility.cs "
$cs_MyMethods="C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\MyMethods.cs "
$cs_Main="C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\CLR_JSON_Program.cs"
$CLR_IdentityKey=$CLR_path + "CLR_IdentityKey.snk"
$CLR_IdentityKey1=$CLR_path + "CLR_IdentityKey1.snk"
$CLR_PubKey=$CLR_path + "CLR_PubKey.snk"
#using SNK method
& $sn_path -k 2048 $CLR_IdentityKey
& $csc_path /target:library /out:$CLR_Assembly_SNK /keyfile:$CLR_IdentityKey $cs_BackComp $cs_MyMethods $cs_Main
& $sn_path -Tp $CLR_Assembly_SNK
# using delaySign+ method version
& $sn_path -k 2048 $CLR_IdentityKey1
& $sn_path -p $CLR_IdentityKey $CLR_PubKey sha256
& $csc_path /target:library /out:$CLR_Assembly_DelaySign /keyfile:$CLR_PubKey $cs_BackComp $cs_MyMethods $cs_Main /DelaySign+
& $sn_path -Ra $CLR_Assembly_DelaySign $CLR_IdentityKey
& $sn_path -Tp $CLR_Assembly_DelaySign
T-SQLコード:
USE MASTER
GO
CREATE ASYMMETRIC KEY CLR_SNK_KEY
FROM EXECUTABLE FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\CLR_SNK.dll'
CREATE LOGIN CLR_SNK
FROM ASYMMETRIC KEY CLR_SNK_KEY
GRANT UNSAFE ASSEMBLY TO CLR_SNK
GO
CREATE ASSEMBLY CLR_SNK_ASSEMBLY
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\CLR_SNK.dll'
WITH PERMISSION_SET = UNSAFE
GO
DROP LOGIN CLR_SNK
DROP ASYMMETRIC KEY CLR_SNK_KEY
DROP ASSEMBLY CLR_SNK_ASSEMBLY
GO
/*DelaySign+ Version*/
CREATE ASYMMETRIC KEY CLR_Delay_KEY
FROM EXECUTABLE FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\CLR_DelaySign.dll'
CREATE LOGIN CLR_Delay
FROM ASYMMETRIC KEY CLR_Delay_KEY
GRANT UNSAFE ASSEMBLY TO CLR_Delay
GO
-- fails here due to the ASYMMETRIC key not matching the assembly
CREATE ASSEMBLY CLR_Delay_Assembly
AUTHORIZATION [dbo]
FROM 'C:\Program Files\Microsoft SQL Server\MSSQL13.TESTSQL\MSSQL\JOBS\CLR_DelaySign.dll'
WITH PERMISSION_SET = UNSAFE
私のC#のアセンブリは、安全な方法ではなく、少なくともEXTERNAL_ACCESSを必要とvar postRequest = (HttpWebRequest)WebRequest.Create(uri);
を使用しています。
ただし、SQL Server 2017はCASセキュリティメソッドのサポートを中止し、クイックフィックスsp_configure 'clr strict security'設定を導入しています。 UNSAFEを使用して将来のCLRを作成します。 Microsoft (April 19, 2017): CLR String Security
SQL Serverは、同じ公開キーが存在すると思われるときに、正しい公開キーを見つけることができないのはなぜですか?
SQL Serverで遅延アセンブリを取得する作業例を知っている人はいますか?
注意: 'ALTER DATABASE [DB_Name] SET TRUSTWORTHY ON'は、アセンブリ管理のためのひどい、おそらく怠惰なアプローチです。 –
それで、あなたはすべての署名をしました。しかし、UNSAFEアセンブリの重要な要素を信頼していることをSQL Serverに伝えましたか?つまり、キーベースまたは証明書ベースのログイン/ユーザーのいずれかを作成して、安全でないアセンブリのアクセス許可を与えましたか?もしそうなら、そのコードを投稿することもできます(実際の鍵素材から編集してください)。 –
@BenThulは、ほこりの多い質問に答えるためのサンプルコード –