SQL-сервер TDE

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

Теперь все должно работать так, как и ожидалось.

Мирослав С.

Автор статей, ИБ-специалист