SQL Server 2014のバックアップ暗号化

今回は、バックアップの作成に関してSQL Server 2014が提供するもう1つの改善点、つまり完全暗号化の可能性について説明します。 パスワードでバックアップを保護し、間違った人が回復できないようにする機能は昔から存在していました。SQLServerを長い間扱ってきた人は、BACKUPコマンドのWITH PASSWORDオプションを覚えておく必要があります。 ただし、この方法は強力な保護を提供しませんでした。mssqltips記載されているように 、パスワードをクラックしたい場合はセキュリティレベルが追加 され ますが、データを保護する追加の方法を探してください 。 実際には、SQL Server 2008 TDEで導入されたバックアップ、つまり データベースは、バックアップを作成する前に透過的に暗号化されました。 したがって、SQL Server 2012以降では、バックアップの作成時にPASSWORDおよびMEDIAPASSWORDパラメーターは使用されません 。 パスワードを使用して作成されたバックアップを復元することは可能です。

ただし、データの暗号化とバックアップの暗号化は、意図した目的のための2つの異なるシナリオです。 明らかに、バックアップを疎外するとき、良い形のルールはそれを保護することです。 たとえば、通信チャネルまたは他の方法を介した送信中のリークを排除するために、別のデータセンターにベースを転送する場合。 ただし、暗号化にはオーバーヘッドが必要であり、データベースがローカルデータセンターに安全に保存されている場合、バックアップのためだけに暗号化するのはなぜですか? 幸いなことに、SQL Server 2014では、これは2つの独立したプロセスになりました。 データ暗号化と同様に、バックアップは証明書または非対称キーに基づいて暗号化できます。 暗号化アルゴリズムAES 128、AES 192、AES 256、Triple DESがサポートされています。



例として、ローカルのSQL Server 2014 CTP2にお気に入りのAdventureWorksデータベースの暗号化されたバックアップを作成し、クラウドベースの仮想マシンでそれから回復します。

バックアップを保護するには、暗号化装置を作成する必要があります。暗号化装置は、非対称キーまたは証明書です。これらは、復元が行われるターゲットSQL Serverに転送されます。 これを行うには、エンコーダーをSQL Serverのソースインスタンスからエクスポートし、ターゲットにインポートする必要があります。 この点で証明書に問題はありません。 非対称キーはより困難です。 BACKUP ASYMMETRIC KEYコマンドがまだ表示されておらず、対称キーとは異なり非対称キーを複製できないことを考えると、唯一の合理的な方法は、sn.exeユーティリティを使用して、SQLの外部で非対称キーを作成することです。その内部では、CREATE ASYMMETRIC KEY ... FROM FILE = '.... snk'のように、ソースインスタンスのバックアップを暗号化し、同じsnkファイルから、暗号化されたバックアップを復元する宛先インスタンスに非対称キーを作成します。 非対称キーでhemoをしないために、この例では証明書を使用します。これは理想的には同じ公開/秘密キーのペアであるためです。



バックアップの暗号化に使用されるサーバー証明書を作成します。



use master if exists (select 1 from sys.certificates where name = '') drop certificate  create certificate  with subject = '    '
      
      



スクリプト1



ENCRYPTION BYを指定しなかったため、これは、実際には必要なデータベースのマスターキーによって証明書が保護されることを意味します。 バックアップの暗号化には、マスターキーで署名された証明書のみが適しています。 たとえば、パスワード(ENCRYPTION BY PASSWORD = 'Very Strong Password')で証明書を保護する場合、

バックアップを暗号化しようとすると、秘密キーが存在しないか、データベースマスターキーによって保護されていないため、証明書を使用できません 'TestCert'エラーが表示されます。

暗号化されたバックアップは、通常のバックアップと同様に、ディスクまたはAzure Storageで従来から作成できます。 バックアップファイルの転送に煩わされないように、<a href= whole habrahabr.ru/company/microsoft/blog/201568> Windows AzureでのSQL Server 2014 CTP2データベースのバックアップコピーの作成で検討した2番目の方法を使用します。



 if exists (select 1 from sys.credentials where name = '') drop credential  create credential  with identity= 'bakstorage' , secret = '<        ,      >' backup database AdventureWorks to url = 'http://bakstorage.blob.core.windows.net/container1/AdventureWorks2.bak' with credential = '' , format, compression, stats = 10 , encryption (algorithm = aes_256, server certificate = )
      
      



スクリプト2





図1



同じコンテナ内で同じ名前のバックアップを既に作成している場合、エラーが発生する場合があります(412)現在、blobにリースがあり、リクエストにリースIDが指定されていません...これは、作成または復元するときWindows Azureバックアップは、SQL ServerにBLOBへの排他的アクセスをブロックする無限リースを提供します。 バックアップまたは復元プロセスが正常に完了すると、リースはキャンセルされます。 ただし、障害が発生した場合、ネットワーク障害が発生した場合、または何か他の問題が発生した場合は、リースがハングしたままになり、バックアップBLOBが上書きまたは削除されなくなります。 アクティブなレントでブロブを削除するためのPowerShellスクリプトをここに示します 。 簡単にします。 バックアップを含むコンテナには他に何もないので、コンテナを削除して再作成します。 コンテナが同じ名前で再作成される場合、Windows Azureが名前が解放されたことを認識するまでに数分かかることに留意する必要があります。



SSMS GUIでも同じことができます。





図2





図3



スクリプト2コマンドを実行すると、バックアップの付いたblobが順序付けられたコンテナーに形成されます。





図4



もちろん、クラウドではなく従来のローカルファイルでデータベースのバックアップコピーを作成する場合、バックアップ暗号化は完全に適用可能です。 これを行うには、データベースのバックアップコマンド(スクリプト2)の最初の行を次のように変更する必要があります。



 backup database AdventureWorks to disk = 'c:\Temp\AdventureWorks.bak' ...
      
      





このファイルは、復元を計画しているSQL Serverのインスタンスから見る必要があります。 私たちの場合、これはクラウド仮想マシン上のSQL Serverです。 バックアップファイルをコピーするか、Azure Storageにアップロードして、バックアップデータベースを2つのステップでURLに分割します。バックアップデータベース...をディスクに保存してから、バックアップをBLOBコンテナーに読み込みます。 ダウンロードはVisual Studio 2012から手動で行うことができます| 2013(サーバーエクスプローラー)。AzureSDKを最初にインストールする必要があります





図5



ただし、restore database ... from urlコマンド(Azure Storageからの直接データベースリカバリ)は、このバックアップもStorageで実行された場合にのみ実行できることに注意してください。 バックアップがディスクで行われた後、クラウドBLOBとして転送された場合は、宛先サーバー上のファイルに変換し、ディスクからデータベースを復元する...として復元する必要もあります。



これで、バックアップ方法に関係なく、Windows Azureの仮想マシンにインストールされている宛先SQL Serverに移動します。 これは、 ここで説明するように、リモートデスクトップ経由で実行するか、ローカルSSMSから接続できます





図6



5555はクラウド仮想マシンのエンドポイントのパブリックTCPポートであり、1433に対応します





図7



Windowsファイアウォールクラウド仮想でプリオープン





図8



スクリプト2の最初の部分と同様に、Azurovストーリーのクレジットの作成を繰り返します。



 if exists (select 1 from sys.credentials where name = N'') drop credential  create credential  with identity= 'bakstorage' ...
      
      





そして回復しようとしています



 restore database AdventureWorks from url = 'http://bakstorage.blob.core.windows.net/container1/AdventureWorks.bak' with replace, stats = 10, credential = 'AzureStorageCredential'
      
      



スクリプト4



このバックアップがディスクに作成され、Azure Storageに読み込まれた場合、再度bakファイルとして提示し、ディスクからデータベースAdventureWorksの復元を実行する必要があることを思い出させてください。

どちらの場合でも、バックアップは暗号化されているため、当然、たわごとが発生します

Msg 33111, Level 16, State 3, Line 5

Cannot find server certificate with thumbprint '0...'.

Msg 3013, Level 16, State 1, Line 5

RESTORE DATABASE is terminating abnormally.









バックアップに加えて、暗号化された秘密を宛先サーバーに送信する必要があります。 証明書については、非対称キーとは異なり、証明書のバックアップ/復元コマンドが提供されます。 TDE場合と同様に、ソースインスタンスのバックアップ証明書を秘密鍵とともにエクスポートする必要があります。エクスポートしない場合、エラーが表示されます。

Msg 15507, Level 16, State 30, Line 5

A key required by this operation appears to be corrupted.

Msg 3013, Level 16, State 1, Line 5

RESTORE DATABASE is terminating abnormally.









 backup certificate  to file = 'c:\Temp\BackupCert.cer' with private key (file = 'c:\Temp\BackupCert.pvk', encryption by password = 'Abra@Cadabra')
      
      



スクリプト4



.cerおよび.pvkファイルを移行先サーバーに転送し、バックアップからの回復のために証明書を作成します。 仮想マシンは新しいため、最初にmasterデータベースのマスターキーを作成する必要があります。 保護されているパスワードは、ソースサーバーのマスターキーパスワードとは関係ありません。 保護されたコンテンツを転送するときにどのキー/証明書とSQL ServerからSQL Serverに転送するかという話に気を取られないように、 データベースマスターキーを使用するSQL Serverデータベースの移行の記事をお勧めします



 use master create master key encryption by password = 'Passw0rd1' if exists (select 1 from sys.certificates where name = N'') drop certificate  create certificate  from file = 'c:\Temp\BackupCert.cer' with private key (file = 'c:\Temp\BackupCert.pvk', decryption by password = 'Abra@Cadabra')
      
      



スクリプト5



その後、データベースリカバリコマンドを繰り返し、正常に完了することを確認します。



 restore database AdventureWorks from disk = 'd:\Temp\AdventureWorks.bak' with move 'AdventureWorks2012_Data' to 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\AdvnetureWorks_Data.mdf', move 'AdventureWorks2012_Log' to 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\AdvnetureWorks_Log.ldf', replace, stats = 10
      
      



スクリプト6





図9



All Articles