TDEデータベースのマスターキーをバックアップしようとしていますが、SQL Serverでは、TDEデータベースは存在しないとしています。少し変ですが、何か間違ったことをしていると確信しています。私はサーバーのsysadminなので、すべてを表示できるはずです。
これは失敗しているステートメントです:
USE [my_db];
BACKUP MASTER KEY
TO FILE = 'C:\master_key'
ENCRYPTION BY PASSWORD = 'some_killer_password';
そして返されたエラーメッセージ:
メッセージ15151、レベル16、状態1、行11
対称キー 'マスターキー'が存在しないか、権限がないため、見つかりません。
以下を使用してデータベース暗号化キーと関連する証明書の詳細を表示しましたが、sys.certificates
テーブルの証明書の詳細が空です。
USE [my_db];
SELECT DatabaseName = d.name
, ddek.encryptor_type
, ddek.opened_date
, c.name
, c.cert_serial_number
, c.pvt_key_encryption_type_desc
, c.subject
FROM sys.dm_database_encryption_keys ddek
INNER JOIN sys.databases d ON ddek.database_id = d.database_id
LEFT JOIN sys.certificates c ON ddek.encryptor_thumbprint = c.thumbprint
WHERE d.name <> 'tempdb' /* tempdb is auto-encrypted by SQL Server */
╔══════════════╦════════════════╦═════════════════ ════════╦══════╦════════════════════╦═════════════ ═════════════════╦═════════╗ ║DatabaseName║encryptor_type║opened_date║name║cert_serial_number║pvt_key_encryption_type_desc║subject║ ╠══════════════╬════════════════╬══════════════ ═══════════╬══════╬════════════════════╬══════════ ════════════════════╬═════════╣ ║my_db║CERTIFICATE║2017-09-20 11:24: 13.590║NULL║NULL║NULL║NULL║ ╚══════════════╩════════════════╩══ ═══════════════════════╩══════╩═══════════════════ ═╩══════════════════════════════╩═════════╝
したがって、データベース暗号化キーは[my_db]
で確認できます。また、証明書によって暗号化されていることは確認できますが、証明書が存在しません。
TDEがデータベース暗号化キーを暗号化するために使用する証明書は、実際にはmaster
データベースに格納され、次にmaster
データベースに格納されているdatabase master key
によって暗号化されます。
my_db
TDE暗号化データベースの復号化に使用される証明書を確認するクエリは、次のとおりです。
SELECT DatabaseName = d.name
, ddek.encryptor_type
, ddek.opened_date
, c.name
, c.cert_serial_number
, c.pvt_key_encryption_type_desc
, c.subject
FROM sys.dm_database_encryption_keys ddek
INNER JOIN sys.databases d ON ddek.database_id = d.database_id
LEFT JOIN master.sys.certificates c ON ddek.encryptor_thumbprint = c.thumbprint
WHERE d.name <> 'tempdb' /* tempdb is auto-encrypted by SQL Server */
唯一の変更点はmaster
データベースのsys.certificates
を参照することです。
そのクエリの結果は次のとおりです。
╔══════════════╦════════════════╦═════════════════ ════════╦════════════════════╦════════════════════ ╦══════════════════════════════╦══════════════════ ═════════╗ ║DatabaseName║encryptor_type║opened_date║CertName║cert_serial_number║pvt_key_encryption_type_desc║Certsubject║ ╠══════════════ ╬════════════════╬═════════════════════════╬══════ ══════════════╬════════════════════╬══════════════ ════════════════╬═══════════════════════════╣ ║my_db║CERTIFICATE║2017-09-20 11:24:13.590║db_encryption_cert║<編集済み>║ENCRYPTED_BY_MASTER_KEY║DB暗号化証明書║ ╚══════════════╩═ ═══════════════╩═════════════════════════╩════════ ════════════╩════════════════════╩════════════════ ══════════════╩═══════════════════════════╝
クエリは証明書がENCRYPTED_BY_MASTER_KEY
であることを示していることに注意してください。ここで参照されているマスターキーはmaster
データベースのマスターキーです。
my_db
を別のサーバーに復元するには、データベースの暗号化に使用した証明書(秘密キーを含む)をバックアップしてから、ターゲットのSQL Serverに復元する必要があります。
これは、ソースSQL Serverで発生するはずです。
BACKUP CERTIFICATE db_encryption_cert
TO FILE = 'C:\db_encryption_cert'
WITH PRIVATE KEY (
FILE = 'C:\db_encryption_cert_private_key'
, ENCRYPTION BY PASSWORD = 'new private key password'
);
結果の証明書ファイルと秘密鍵、およびそのパスワードをオフサイトの安全なファイルシステムに保存します。
これは、ターゲットSQLサーバーで発生するはずです。
CREATE CERTIFICATE db_encryption_cert
FROM FILE = 'C:\db_encryption_cert'
WITH PRIVATE KEY (
FILE = 'C:\db_encryption_cert_private_key'
, DECRYPTION BY PASSWORD = 'new private key password'
);
ターゲットサーバーで証明書を作成したら、問題なくデータベースを復元できるはずです。
災害復旧の準備をしていて、ソースSQL Serverのマスターデータベースなどを復元できるようにする場合は、サービスマスターキーとマスターデータベースマスターキーもバックアップする必要があります。
USE master;
GO
BACKUP SERVICE MASTER KEY
TO FILE = 'C:\service_master_key'
ENCRYPTION BY PASSWORD = 'new service master key password';
BACKUP MASTER KEY
TO FILE = 'C:\master_database_master_key'
ENCRYPTION BY PASSWORD = 'new master database master key password';
これらのキーとそれに関連する暗号化パスワードは、サイト外の安全な場所に保管する必要があります。