Шифрование резервных копий в SQL Server

#1 2021.05.13 07:31:28

0

Создадим серверный сертификат, который будет использоваться для шифрования бэкапа.

use master
if exists (select 1 from sys.certificates where name = 'СертификатДляБэкапа') drop certificate СертификатДляБэкапа
create certificate СертификатДляБэкапа with subject = 'Это действительно сертификат для бэкапа'


Только сертификаты, подписанные мастер-ключом, годны для шифрования бэкапов. Если защитить сертификат, например, паролем (ENCRYPTION BY PASSWORD = 'Очень сложный пароль'), при попытке зашифровать им бэкап выскочит ошибка Cannot use certificate 'TestCert', because its private key is not present or it is not protected by the database master key.
Зашифрованный бэкап, как и обычный, можно создавать традиционно на диск или в Azure Storage.

if exists (select 1 from sys.credentials where name = 'КреденцияДляАзуровскогоСториджа') drop credential КреденцияДляАзуровскогоСториджа
create credential КреденцияДляАзуровскогоСториджа with identity= 'bakstorage'
, secret = '<первичный или вторичный ключ доступа к учетной записи хранения, посмотреть которые можно в ее конфигурации>'

backup database AdventureWorks to url = 'https://bakstorage.blob.core.windows.net/container1/AdventureWorks2.bak'
with credential = 'КреденцияДляАзуровскогоСториджа'
, format, compression, stats = 10
, encryption (algorithm = aes_256, server certificate = СертификатДляБэкапа)


То же можно выполнить в графическом интерфейсе SSMS:
Img


Img


Шифрование бэкапов полностью применимо при создании резервной копии БД не в Облако, а в традиционный локальный файл. Для этого первую строчку команды backup database (Скрипт 2) следует изменить на:
backup database AdventureWorks to disk = 'c:\Temp\AdventureWorks.bak' ...

Этот файл должен увидеться с того экземпляра SQL Server, на котором мы его планируем восстановить. В нашем случае это SQL Server на облачной виртуалке. Можно скопировать на нее файл с резервной копией, либо выложить его в Azure Storage, разделив backup database… to url на два шага: backup database… to disk с последующей загрузкой бэкапа в блобовский контейнер.

Необходимо иметь в виду, что команда restore database… from url (непосредственное восстановление базы из Azure Storage) может производиться только если данный бэкап тоже производился в Storage. Если бэкап делался на диск, а затем переносился как облачный блоб, то и на сервере назначения его необходимо будет сначала превратить в файл и восстанавливаться как restore database… from disk.

Независимо от способа создания резервной копии заходим на SQL Server назначения, установленный на виртуальной машине в Windows Azure. Это можно сделать через удаленный рабочий стол или подключиться к нему из локальной SSMS.

Img


5555 — публичный ТСР-порт в конечной точке облачной виртуалки, соответствующий 1433

Img


Img


Повторяем на нем создание креденции для азуровского сториджа аналогично первой части Скрипт 2:

if exists (select 1 from sys.credentials where name = N'КреденцияДляАзуровскогоСториджа') drop credential КреденцияДляАзуровскогоСториджа
create credential КреденцияДляАзуровскогоСториджа with identity= 'bakstorage' ...


восстанавливаем

restore database AdventureWorks from url = 'https://bakstorage.blob.core.windows.net/container1/AdventureWorks.bak'
with replace, stats = 10, credential = 'AzureStorageCredential'


Бэкап зашифрован
Msg 33111, Level 16, State 3, Line 5 Cannot find server certificate with thumbprint '0х...'. Msg 3013, Level 16, State 1, Line 5 RESTORE DATABASE is terminating abnormally.

Кроме бэкапа на сервер назначения требуется передать секрет, при помощи которого он шифровался. Для сертификатов в отличие от асимметричных ключей предусмотрены команды backup/restore certificate. Как и в случае TDE, сертификат бэкапа на исходном экземпляре нужно экспортировать вместе с закрытым ключом, иначе выскочит ошибка:
Msg 15507, Level 16, State 30, Line 5 A key required by this operation appears to be corrupted. Msg 3013, Level 16, State 1, Line 5 RESTORE DATABASE is terminating abnormally.

backup certificate СертификатДляБэкапа to file = 'c:\Temp\BackupCert.cer'
with private key (file = 'c:\Temp\BackupCert.pvk', encryption by password = 'Abra@Cadabra')


Скрипт 4

передаем файлы .cer и .pvk на сервер назначения и создаем на нем сертификат для восстановления из бэкапа. Предварительно требуется создать мастер-ключ БД master. Пароль, которым он защищается, не имеет ничего общего с паролями мастер-ключа на исходном сервере.

use master
create master key encryption by password = 'Passw0rd1'

if exists (select 1 from sys.certificates where name = N'СертификатДляБэкапа') drop certificate СертификатДляБэкапа
create certificate СертификатДляБэкапа from file = 'c:\Temp\BackupCert.cer'
with private key (file = 'c:\Temp\BackupCert.pvk', decryption by password = 'Abra@Cadabra')


Скрипт 5

После чего повторяем команду восстановления базы. Теперь она завершается успешно:
restore database AdventureWorks from disk = 'd:\Temp\AdventureWorks.bak'
with move 'AdventureWorks2012_Data' to 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\AdvnetureWorks_Data.mdf',
move 'AdventureWorks2012_Log' to 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\AdvnetureWorks_Log.ldf',
replace, stats = 10


Img
Отредактировано: Panda 2022.08.11 07:05:53