BACKUP MASTER KEY không thành công khi không thể tìm thấy khóa chính đối xứng vì nó không tồn tại


8

Tôi đang cố gắng sao lưu khóa chính cho cơ sở dữ liệu TDE, nhưng SQL Server cho biết không có khóa nào. Hơi lạ một chút, nhưng tôi chắc chắn mình đang làm sai điều gì đó. Tôi là sysadmin trên máy chủ, vì vậy tôi có thể thấy mọi thứ.

Đây là tuyên bố thất bại:

USE [my_db];
BACKUP MASTER KEY
TO FILE = 'C:\master_key'
ENCRYPTION BY PASSWORD = 'some_killer_password';

Và thông báo lỗi trả về:

Msg 15151, Cấp 16, Trạng thái 1, Dòng 11
Không thể tìm thấy khóa đối xứng 'khóa chính', vì nó không tồn tại hoặc bạn không có quyền.

Tôi đã sử dụng cách sau để xem chi tiết về khóa mã hóa cơ sở dữ liệu và chứng chỉ được liên kết, tuy nhiên chi tiết chứng chỉ từ sys.certificatesbảng trống.

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 ryptor_type ║ open_date ║ name cert_serial_number pvt_key_encoding_type_desc ║ chủ đề
╠══════════════╬════════════════╬═════════════════ ════════╬══════╬════════════════════╬═════════════ ═════════════════╬═════════╣
║ my_db GIẤY CHỨNG NHẬN ║ 2017-09-20 11: 24: 13,590 NULL NULL NULL NULL
╚══════════════╩════════════════╩═════════════════ ════════╩══════╩════════════════════╩═════════════ ═════════════════╩═════════╝

Vì vậy, tôi có thể thấy khóa mã hóa cơ sở dữ liệu [my_db]và tôi có thể thấy nó được mã hóa bởi một chứng chỉ, nhưng chứng chỉ không tồn tại?

Câu trả lời:


7

Chứng chỉ được sử dụng bởi TDE để mã hóa khóa mã hóa cơ sở dữ liệu thực sự được lưu trữ trong mastercơ sở dữ liệu, lần lượt được mã hóa bởi database master keylưu trữ trong mastercơ sở dữ liệu.

Truy vấn để xem chứng chỉ nào được sử dụng để giải my_dbmã cơ sở dữ liệu được mã hóa TDE phải là:

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 */

Lưu ý, thay đổi duy nhất là tham chiếu sys.certificatestrong mastercơ sở dữ liệu.

Kết quả của truy vấn đó cho thấy:

╔══════════════╦════════════════╦═════════════════ ════════╦════════════════════╦════════════════════ ╦══════════════════════════════╦══════════════════ ═════════╗
DatabaseName ║ryptor_type ║ open_date ║ certName ║ cert_serial_number pvt_key_encoding_type_desc Certsubject
╠══════════════╬════════════════╬═════════════════ ════════╬════════════════════╬════════════════════ ╬══════════════════════════════╬══════════════════ ═════════╣
║ my_db CHỨNG NHẬN ║ 2017-09-20 11: 24: 13,590 ║ db_encrypt_cert ║ <đã xử lý lại> ║ ENCRYPTED_BY_MASTER_KEY Chứng chỉ mã hóa DB
╚══════════════╩════════════════╩═════════════════ ════════╩════════════════════╩════════════════════ ╩══════════════════════════════╩══════════════════ ═════════╝

Lưu ý truy vấn hiển thị chứng chỉ là ENCRYPTED_BY_MASTER_KEY- khóa chính được tham chiếu ở đây là khóa chính cho mastercơ sở dữ liệu.

Để khôi phục my_dbvào máy chủ khác, bạn sẽ cần sao lưu chứng chỉ (có khóa riêng) được sử dụng để mã hóa cơ sở dữ liệu, sau đó khôi phục nó vào Máy chủ SQL đích.

Điều này sẽ xảy ra trên SQL Server nguồn:

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

Lưu trữ tệp chứng chỉ kết quả và khóa riêng và mật khẩu của nó trên hệ thống tệp an toàn bên ngoài.

Điều này sẽ xảy ra trên máy chủ SQL đích:

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

Khi bạn đã tạo chứng chỉ trên máy chủ đích, bạn sẽ có thể khôi phục cơ sở dữ liệu mà không gặp sự cố.

Nếu bạn đang chuẩn bị khắc phục thảm họa và có ý định khôi phục cơ sở dữ liệu chủ của SQL Server nguồn, v.v., bạn cũng nên sao lưu khóa chính dịch vụ và khóa chính của cơ sở dữ liệu chính:

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

Các khóa này và mật khẩu mã hóa liên quan của chúng, nên được lưu trữ ở một vị trí an toàn ngoài trang web.


Xin chào Max. Cảm ơn lời giải thích tuyệt vời. Bạn có biết cơ sở dữ liệu được mã hóa bằng AES 256 không, khóa đối xứng có được lưu trữ như một phần của cơ sở dữ liệu không và khóa đối xứng được mã hóa này có được lưu trữ trong các bản sao lưu không?
Dave Goldsmith

Khóa mã hóa TDE được lưu trữ trong cơ sở dữ liệu chủ. Điều đó bao gồm bất kỳ bản sao lưu của cơ sở dữ liệu chủ. Có nói rằng, chìa khóa trong cơ sở dữ liệu tổng thể là bản thân mã hóa kết thúc bằng phím chủ dịch vụ mà không sao lưu trong bất kỳ sao lưu SQL Server.
Max Vernon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.