web-dev-qa-db-ja.com

BACKUP MASTER KEYが失敗し、対称マスターキーが存在しないため見つからない

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]で確認できます。また、証明書によって暗号化されていることは確認できますが、証明書が存在しません。

8
Max Vernon

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';

これらのキーとそれに関連する暗号化パスワードは、サイト外の安全な場所に保管する必要があります。

7
Max Vernon