1

私は答えのためにインターネットの多くを精査しました。私は、文法やアセンブリのチェックを除いて、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つあり:時間の任意の長さのために、複数のサーバー上の秘密鍵を暴露

    1. は避けてください。
    2. ASYMMETRIC KEYを作成するときに暗号化されたパスワードを設定するオプションで、ハッシュされたpublic snkを公開する代替方法を提供してください。

    私はpfxとシンプルなSNKファイルの両方を使用してこれを実現することができますが、ここでの組立が簡単なHTTP POSTアクションで、証明書のコストは、イントラネット環境での小さな使用与え法外であることに注意してください。

    公開鍵(ハッシュアルゴリズム::SHA256):今、私はマニフェストに以下を参照してください、署名済みアセンブリの確認

    002400000c80000014010000060200を...

    公開キートークンは

    b8ee775aa5bfbc5bです

    明らかに、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で遅延アセンブリを取得する作業例を知っている人はいますか?

  • +0

    注意: 'ALTER DATABASE [DB_Name] SET TRUSTWORTHY ON'は、アセンブリ管理のためのひどい、おそらく怠惰なアプローチです。 –

    +0

    それで、あなたはすべての署名をしました。しかし、UNSAFEアセンブリの重要な要素を信頼していることをSQL Serverに伝えましたか?つまり、キーベースまたは証明書ベースのログイン/ユーザーのいずれかを作成して、安全でないアセンブリのアクセス許可を与えましたか?もしそうなら、そのコードを投稿することもできます(実際の鍵素材から編集してください)。 –

    +0

    @BenThulは、ほこりの多い質問に答えるためのサンプルコード –

    答えて

    1

    SQL Serverは、同じ公開キーが存在すると思われるときに、正しい公開キーが見つからないのはなぜですか?

    あなたがアセンブリをロードできるように、一時的にがTRUSTWORTHY ONにデータベースを設定しなら、あなたが問題を見ることができるはずです。あなたがsys.asymmetric_keysの「拇印」欄はsys.assembliesの「clr_name」の欄に示す「なPublicKeyToken」プロパティと一致していないことを確認する必要があり、これらを実行した後

    SELECT * FROM sys.asymmetric_keys; 
    SELECT * FROM sys.assemblies; 
    

    。これは、sn -pを実行しているときにSHA-256を使用している可能性が最も高いですが、SHA-1が拡張ストロングネーミングでは機能しないため、選択肢がありません。非対称キーの「拇印」はSHA-1であり、あなたはそれを制御できないため、一致させる方法はありません。

    SQL Serverで遅延アセンブリを取得する作業例を知っている人はいますか?

    運にそれがあるので、Enhanced Strong Namingのドキュメントには、一部のレガシーシナリオが機能するようにAssemblySignatureKeyAttribute属性を使用して言及し、これは確かにいずれかになります。実際には、その属性を使用することにより、Strong Namingの拡張が有効になります。

    ステップSQLCLRで作業を強いネーミング(SQL Serverの2016 SP1上でテスト)の強化を取得する:

    sn -k 2048 IdentityKey.snk 
    sn -k 2048 SignatureKey.snk 
    
  • から公開鍵を抽出します。

    1. を識別し、署名鍵ペアの作成両方のキーペア:

      sn -p IdentityKey.snk IdentityPubKey.snk 
      sn -p SignatureKey.snk SignaturePubKey.snk sha256 
      

      IDキーはですはsha256であり、sha1のデフォルト値を使用し、sha256を使用してです。

    2. AssemblySignatureKey属性のために必要なpublicKeycounterSignature値を生成します。

      [assembly:System.Reflection.AssemblySignatureKey(
      "public" + 
      "key" + 
      "value", 
      "counter" + 
      "Signature" + 
      "value" 
      )] 
      
    3. :ソースファイルのいずれか(すなわち、通常 AssemblyInfo.cs)に前のステップで生成

      sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk 
      
    4. コピー二つの値

    5. 遅延署名を使用してアセンブリをコンパイルします。

      csc /target:library /out:MyAssembly.dll SqlStoredProcedure.cs 
           /keyfile:IdentityPubKey.snk /delaySign+ 
      
    6. アセンブリの再署名:

      SQL Serverでの
      sn -Ra MyAssembly.dll SignatureKey.snk 
      
    7. 、DLLからmasterに非対称キーを作成します。

      USE [master]; 
      
      CREATE ASYMMETRIC KEY [MyAsymKey] 
      FROM EXECUTABLE FILE = N'C:\path\to\MyAssembly.dll'; 
      
    8. は、非対称鍵と助成金からのログインを作成します。それはEXTERNAL ACCESS ASSEMBLYまたはUNSAFE ASSEMBLY

      CREATE LOGIN [MyAsymKeyLogin] 
      FROM ASYMMETRIC KEY [MyAsymKey]; 
      
      GRANT UNSAFE ASSEMBLY TO [MyAsymKeyLogin]; 
      

      UNSAFEEXTERNAL ACCESSを意味するものの1つを許可する必要がありますが、有効な既定の構成clr strictを使用している場合、SQL Server 2017ではUNSAFE ASSEMBLYである必要があります。ターゲット・データベースへ

    9. 変更およびアセンブリを作成します。

      USE [Test]; 
      ALTER DATABASE CURRENT SET TRUSTWORTHY OFF; -- Just to be sure! 
      
      CREATE ASSEMBLY [MyAssembly] 
      FROM N'C:\path\to\MyAssembly.dll' 
      WITH PERMISSION_SET = UNSAFE; 
      

    P.S.をあなたの他の懸念は、主に非問題です:

    1. ないあなたは、秘密鍵を露出することができることだと思うが、それは(それがアセンブリから作成されているので)ASYMMETRIC KEYの一部ではありませんので、ノーがあるか確認してくださいその可能性がある。
    2. CREATE ASYMMETRIC KEYでパスワードを設定することは、秘密鍵が存在しないため(アセンブリから作成されているため)、オプションではありません。
    3. 証明書を使用したい場合は、自己署名証明書(MAKECERTまたはPowerShell経由)は問題ありません。特に、これは小さな内部プロジェクトであるためです。証明書を使う利点は、ファイルやアセンブリではなく16進バイトから作成でき、16進バイトからアセンブリを作成できるため、インストールスクリプトはファイルを持たないため完全に移植可能ですシステム参照:-)。
  • +1

    +1を追加しました。以来、私は思考プロセスを変更しましたが(これはSQL Server 2008 R2から2017までの異なるバージョンで動作しなければなりませんでした)、詳細で明確な答えに感謝します。 –

    関連する問題