TDE означает прозрачное шифрование данных. TDE позволяет шифровать файлы данных SQL Server. Такое шифрование называется шифрованием данных в состоянии покоя.
В этом руководстве мы создадим образец базы данных, зашифруем ее с помощью TDE и восстановим базу данных на другом сервере.
Создать тестовую базу данных
Сначала создайте тестовую базу данных с именем test_db:
create database test_db;
Далее переключимся на test_db:
use test_db;
Затем создайте таблицу клиентов:
create table customers( id int identity primary key, name varchar(200) not null, email varchar(200) not null );
После этого вставьте несколько строк в таблицу клиентов:
insert into customers(name, email) values('John Doe',' [email protected] '), ('Jane Doe',' [email protected] ');
Наконец, выберите данные из таблицы клиентов:
select * from customers;
Зашифровать базу данных
Сначала переключимся на основную базу данных:
USE master;
Во-вторых, создайте мастер-ключ:
CREATE MASTER KEY ENCRYPTION BY PASSWORD='kKyDQouFJKLB7ymBGmlq';
В качестве пароля следует использовать очень надежный пароль.
В-третьих, создайте сертификат, защищенный главным ключом:
CREATE CERTIFICATE TDE_Cert WITH SUBJECT='Database_Encryption';
В-четвертых, переключитесь на test_db:
USE test_db; GO
В-пятых, создайте ключ шифрования базы данных:
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE TDE_Cert;
В-шестых, включите шифрование для базы данных test_db:
ALTER DATABASE test_db SET ENCRYPTION ON;
В-седьмых, проверьте ход и статус шифрования:
SELECT d.name, d.is_encrypted, dek.encryption_state, dek.percent_complete, dek.key_algorithm, dek.key_length FROM sys.databases as d INNER JOIN sys.dm_database_encryption_keys AS dek ON d.database_id = dek.database_id
Выход:
Значение is_ecrypted 1 означает, что база данных зашифрована.
Состояние шифрования имеет одно из трех значений:
- 0 – не зашифровано
- 1 – идет шифрование
- 3 – шифрование завершено
Восьмое, сделайте резервную копию сертификата. Важно отметить, что этот сертификат вам понадобится для восстановления базы данных на другом сервере баз данных:
BACKUP CERTIFICATE TDE_Cert TO FILE = 'c:\cert\TDE_Cert' WITH PRIVATE KEY(file='c:\cert\TDE_CertKey.pvk', ENCRYPTION BY PASSWORD='kKyDQouFJKLB7ymBGmlq');
Обратите внимание, что путь c:\tde_cert должен существовать на сервере базы данных. Это не путь на вашем локальном компьютере.
Наконец, сделайте резервную копию базы данных. Этот шаг необязателен.
BACKUP DATABASE test_db TO DISK = N'c:\backup\test_db.bak' WITH NOFORMAT, NOINIT, NAME = N'Test DB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
Восстановить базу данных на другом сервере
Сначала попробуйте восстановить базу данных без сертификата:
RESTORE DATABASE test_db FROM DISK = N'C:\backup\test_db.bak' WITH FILE = 1, NOUNLOAD, STATS = 5;
Как и ожидалось, он не удался. Вот сообщение об ошибке:
Msg 33111, Level 16, State 3, Line 1 Cannot find server certificate with thumbprint '0xA1456C76093E2E1E1AE0F1E1A57C29D9755C32C3'. Msg 3013, Level 16, State 1, Line 1 RESTORE DATABASE is terminating abnormally.
Во-вторых, создайте сертификат из файла и пароля, которые мы сгенерировали на этапе шифрования:
CREATE CERTIFICATE TDE_Certificate FROM FILE = 'C:\cert\TDE_Cert' WITH PRIVATE KEY ( FILE = 'C:\cert\TDE_CertKey.pvk', DECRYPTION BY PASSWORD = 'kKyDQouFJKLB7ymBGmlq' );
В-третьих, восстановите базу данных:
RESTORE DATABASE test_db FROM DISK = N'C:\backup\test_db.bak' WITH FILE = 1, NOUNLOAD, STATS = 5
Теперь все должно работать так, как и ожидалось.