Wpis na temat wykorzystania usługi Azure Key Vault do przechowywania kluczy poza instancją SQL Server z wykorzystaniem Extensible Key Menagment. Następnie jak wykorzystać tą wiedzę do podniesienia bezpieczeństwa danych. Stosując takie rozwiązania jak Transparent Database Encryption do szyfrowania baz danych lub Backup Encryption do szyfrowania kopii zapasowych.
- Czym jest Extensible Key Menagment?
- Czym jest usługa Azure Key Vault?
- Dodanie usługi Azure Key Vault
- Rejestracja konta aplikacji w Azure Active Directory
- Nadanie uprawnień dla konta aplikacji w Azure Key Vault
- Tworzenie klucza w Azure Key Vault
- Instalacja provider EKM oraz rejestracja providera AzureKeyVault
- Tworzenie poświadczeń do usługi Azure Key Vault
- Tworzenie klucza asymetrycznego oraz loginu w SQL Server
- Sposoby wykorzystania klucza asymetrycznego
- Odnośniki
Instrukcja zawiera sporo zrzutów ekranu, które same w sobie sporo wyjaśniają, jednak dla wielu kroków istniej alternatywa w postaci poleceń PowerShell. W wpisie pominąłem kwestii samego dostępu do Azure.
Czym jest Extensible Key Menagment?
Extensible Key Menagment (EKM) umożliwia zarządzanie kluczami do szyfrowania poza samym SQL Server. Tradycyjnie, wszystkie klucze dla kryptografii symetrycznych i asymetrycznych wykonywanych przez SQL Server znajdują się w samej bazy danych, jednak EKM pozwala na tworzenie kluczy, ich przechowywanie, szyfrowanie i deszyfrowanie poza samą bazą danych dzięki użyciu urządzeń typu Hardware security module HSM
SQL Server nie dostarcza dostawcy EKM. Każdy dostawca EKM może mieć różne procedury instalowania, konfigurowania i autoryzowania użytkowników.
Czym jest usługa Azure Key Vault?
Azure Key Vault ma bardzo dobrą dokumentacje na stronach Microsoftu dlatego pozwoliłem sobie umieścić fragment opisu usługi z tej strony.
Usługa Azure Key Vault ułatwia ochronę kluczy kryptograficznych i kluczy tajnych używanych przez aplikacje i usługi w chmurze. Za pomocą usługi Key Vault możesz szyfrować klucze i klucze tajne (takie jak klucze uwierzytelniania, klucze konta magazynu, klucze szyfrowania danych, pliki PFX oraz hasła) przy użyciu kluczy chronionych przez sprzętowe moduły zabezpieczeń (HSM, hardware security module). W celu zapewnienia dodatkowego bezpieczeństwa możesz zaimportować lub wygenerować klucze w modułach HSM.
Usługa Key Vault usprawnia proces zarządzania kluczami i pozwala zachować kontrolę nad kluczami, które mają dostęp do danych i szyfrują je. Deweloperzy mogą w klika minut utworzyć klucze do programowania i testowania, a następnie bezproblemowo przeprowadzić ich migrację do kluczy produkcji. W razie potrzeby administratorzy zabezpieczeń mogą przydzielić (i cofnąć) uprawnienia do używania kluczy.
Dodanie usługi Azure Key Vault
Do tematu można podejść w dwojaki sposób, wyklikując lub korzystając z PowerShell.
Azure Portal
Tworzenie magazyny kluczy za pomocą webowego portalu Azure, zaczynam od wyszukania usług Key Vault.
W trakcie tworzenia takiego magazyny zostaniemy poproszeni o nazwę, grupę zasobów i lokalizację.
PowerShell
Utworzenie magazyny za pomocą PowerShell wymaga modułu AzureRM. W tym celu, w konsoli PowerShell z podwyższonymi uprawnieniami, wykonać należy polecenie:
1 2 |
# Instalacja modułu AzureRM z PowerShell Gallery Install-Module AzureRM -AllowClobber |
Gdy moduł jest dostępny, można zalogować się do portalu Azure za pomocą funkcji Login-AzureRMAccount
która wywoła okno logowania.
1 2 |
#Logownaie do konta platformy Azure Login-AzureRmAccount |
Dobrą praktyką jest „umieszczanie” wszystkich powiązanych zasobów wewnątrz jednej grupy. Pierwsze polecenie tworzy grupę zasobów o nazwie powerSQLGroup a kolejne magazyn kluczy o nazwie powerSQLKeyVault.
1 2 3 4 |
#Tworzenie nowej grupy zasobów New-AzureRmResourceGroup -Name powerSQLGroup -Location 'North Europe' #CUtworzenie nowego Key Vault New-AzureRmKeyVault -VaultName 'powerSQLKeyVault' -ResourceGroupName 'powerSQLGroup' -Location 'North Europe' |
Rejestracja konta aplikacji w Azure Active Directory
Wymogiem korzystania z Key Vault jest zarejestrowanie użytkownika bądź aplikacja w usłudze Active Directory w Azure.
W tym scenariuszu SQL Server jest aplikacją, która będzie miała dostęp do magazynu klucz. Na zakładce Azure Active Directory wybieramy App registrations a następnie New application registration.
W formularzu należy Wprowadzić nazwę oraz adres URL logowania aplikacji. W tym scenariuszu adres może być dowolonym, prawidłowym adresem URL. Typ aplikacji należy zostawić Web app/API, następnie klikamy Create.
Po tym kroku wracamy do App registrations i wybieramy wcześniej utworzone konto.
W tym momencie warto sobie zachować Application ID który będzie niezbędny do utworzenie poświadczeń, następnie klikamy Settings.
Przechodzimy do zakładki Keys i tworzymy klucz uzupełniając Description, Expires. Nastomiast wartość klucza zostanie wyświetlone w dopiero w momencie zapisania ustawień
Należy zachować wartość klucza, jest niezwykle ważny do utworzenia poświadczeń w ramach SQL Server. Po opuszczeniu tej strony nie ma możliwości odzyskania tego klucza.
Nadanie uprawnień dla konta aplikacji w Azure Key Vault
Z tak utworzonym kontem aplikacji wracamy do Key Value w celu dodania do polityki dostępu.
Po kliknięciu New, wybieramy Select principal i dodajemy wcześniej przygotowane konto.
Następnie dodajmy niezbędne uprawnienia takie jak: Get, List, Unwrap Key i Wrap Key.
Tworzenie klucza w Azure Key Vault
Azure Portal
Ostatnim krokiem w obszarze Azure jest przygotowanie klucza, który posłuży w SQL Server do szyfrowania kluczy prywatnych. Wybieramy nasz Key Vault, następnie zakładkę Keys.
W formularzu towrzenia klucza jedynym wymaganym polem jest nazwa. Ustawienie dat ważności klucza jest opcjonalne.
PowerShell
Dodanie klucza w magazynie kluczy możliwe jest również za pomocą PowerShell i wcześniej wspomnianego modułu AzureRM.
1 2 |
#Tworzenie klucza Add-AzureKeyVaultKey -VaultName 'powerSQLKeyVault' -Name 'KeyForSQLServer' -Destination 'Software' |
Instalacja provider EKM oraz rejestracja providera AzureKeyVault
Gdy wykonana została cała konfiguracja od strony chmurowej, należy przygotować SQL Server oraz dostawcę Extensible Key Menagment (EKM). W tym celu należy pobrać i zainstalować SQL Server Connector for Microsoft Azure Key Vault na serwerze gdzie znajduję się instancja SQL Server.
Po przeklikaniu instalatora należy zarejestrować dostawce Azure Key Vault w SQL Server poleceniem CREATE CRYPTOGRAPHIC PROVIDER
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
USE master; GO sp_configure 'show advanced options', 1; GO RECONFIGURE; GO -- Włączenie EKM provider sp_configure 'EKM provider enabled', 1; GO RECONFIGURE; --Rejestracja provider EKM USE Master; GO CREATE CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov FROM FILE = 'C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault\Microsoft.AzureKeyVaultService.EKM.dll'; GO |
W poleceniu najważniejsza jest scieżka do biblioteki Microsoft.AzureKeyVaultService.EKM.dll
, domyślnie będzie to C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault
. Na końcu można odpytać systemowy widok sys.cryptographic_providers
w celu sprawdzenia dostępnych dostawców.
1 2 3 |
SELECT * FROM sys.cryptographic_providers; GO |
Poświadczenia do usługi Azure Key Vault
W kolejnym kroku należy utworzyć poświadczenie umożliwiające dostęp do magazyn kluczy w Azure. W tym kroku niezbędne będą:
- nazwa Azure Key Vault:
powerSQLApp
- Application ID:
cfba4b24-faaf-4bff-bc11-ee8882f4e445
- wartość klucza:
ItOjoANkNwEi6U6Pun0H7ZADTq+C05QFzcVdaKqlZ1c=
W poleceniu dla IDENTITY
przypisujemy nazwę Azure Key Vault, natomiast SECRET
składa się z dwóch elementów, Application ID bez myślników oraz wartości klucza. Tworzymy podwójnie poświadczenie, różniące się tylko nazwa, ponieważ poświadczenie może być dodane tylko do jednego loginu.
Msg 33042, Level 16, State 1, Line 42
Cannot add credential because it is already mapped to a login.
Jedno zostanie dodane do loginu, który ma uprawnienia do utworzenia klucza asymetrycznego, drugie natomiast do loginu, który będzie używane przez Database Engine do szyfrowania/deszyfrowania baz danych lub kopii zapasowych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--poświadczenia dla konta sysadmin USE master; GO CREATE CREDENTIAL mnadobnik_Login_ekm_cred WITH IDENTITY = 'powerSQLApp', SECRET = 'cfba4b24faaf4bffbc11ee8882f4e445ltOjoANkNwEi6U6Pun0H7ZADTq+C05QFzcVdaKqlZ1c=' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov; --poświadczenia dla loginu SQL Server które będzie powiązane z kluczem asymetrycznym USE master; GO CREATE CREDENTIAL AzureKey_Login_ekm_cred WITH IDENTITY = 'powersqlkeyvault', SECRET = 'cfba4b24faaf4bffbc11ee8882f4e445ltOjoANkNwEi6U6Pun0H7ZADTq+C05QFzcVdaKqlZ1c=' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov; |
Tworzenie klucza asymetrycznego oraz loginu w SQL Server
Mając poświadczenia można utworzyć klucz asymetryczny, którego klucz prywatny podpisany zostanie wcześniej przygotowanym kluczem symetrycznym w Azure Key Vault. Tak jak wcześniej pisałem należy dodać poświadczenie mnadobnik_Login_ekm_cred
do loginu z uprawnieniami do tworzenia kluczy. W moim przykładzie jest to mój login z uprawnieniami sysadmin.
1 2 3 4 5 6 7 8 9 10 11 |
--Dodanie poświaddczeń USE master; GO ALTER LOGIN [IT-MN-M\mnadobnik] ADD CREDENTIAL Sysadmin_Login; --Name created key KeyForSQLServer USE master; GO CREATE ASYMMETRIC KEY asymetricSQLServerKey FROM PROVIDER AzureKeyVault_EKM_Prov WITH PROVIDER_KEY_NAME = 'KeyForSQLServer', CREATION_DISPOSITION = OPEN_EXISTING |
Aby móc zastosować tak utworzony klucz np. do Backup Encryption należy utworzyć login SQL Server pozwiązany z wcześniejszym kluczem asymetrycznym. W przeciwnym wypadku przy próbie np. szyfrowania kopii zapasowej otrzymamy błąd:
Msg 33121, Level 16, State 1, Line 3
The asymmetric key 'asymetricSQLServerKey' does not have a login associated with it.
Create a login and credential for this key to automatically access the extensible key management provider 'AzureKeyVault_EKM_Prov'.
Msg 33122, Level 16, State 1, Line 6
This command requires a database encryption scan on database 'TDE'.
However, the database has changes from previous encryption scans that are pending log backup. Take a log backup and retry the command.
AzureKey_Login_ekm_cred.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- Create a SQL Server login associated with the asymmetric key -- for the Database engine to use when it loads a database -- encrypted by TDE. USE master; GO CREATE LOGIN KeyVault_Login FROM ASYMMETRIC asymetricSQLServerKey GO -- Alter the TDE Login to add the credential for use by the -- Database Engine to access the key vault USE master; GO ALTER LOGIN KeyVault_Login ADD CREDENTIAL AzureKey_Login_ekm_cred GO |
Sposoby wykorzystania klucza asymetrycznego
Po tak przygotowanej konfiguracji usługi Azure Key Vault oraz SQL Server można wykorzystać klucz asymetryczny do szyfrowania baz danych lub kopii zapasowych.
Transparent Database Encryption
Na temat TDE zapraszam do Wszystko co warto wiedzieć o Transparent Data Encryption jednak kluczową informacją z tamtego wpisu jest:
Zastosowanie klucza asymetrycznego do zaszyfrowania bazy danych za pomocą Transparent Data Encryption wymaga stosowania Extensible Key Management. Uściślając tylko klucz asymetryczny chroniony przez moduł EKM może zostać użyty do zaszyfrowania bazy danych.
Aby zaszyfrować bazę danych wykonujemy polecenie, gdzie dla ENCRYPTION BY SERVER ASYMMETRIC KEY
podajemy wcześniej przygotowany klucz asymetryczny, który podpisany został poprzez klucz znajdujący się w magazynie Azure Key Vault
1 2 3 4 5 6 7 |
--Szyfrowanie TDE USE TDE GO ALTER DATABASE ENCRYPTION KEY ENCRYPTION BY SERVER ASYMMETRIC KEY [asymetricSQLServerKey] GO ALTER DATABASE TDE SET ENCRYPTION ON GO |
Backup Encryption
Również temat Backup Encryption poruszyłem w innym wpisie a dokładniej Czemu wykonywanie kopii zapasowych to już za mało? Poniżej tylko polecenie T-SQL, które umożliwia wykonanie zaszyfrowanej kopii zapasowej bazy danych wcześniej przygotowanym kluczem.
1 2 3 4 5 6 7 8 |
BACKUP DATABASE TDE TO DISK = N'C:\SQLData\MSSQL12.MSSQLSERVER14\MSSQL\Backup\TDE.bak' WITH CHECKSUM, MEDIANAME = N'BackupEncryption', NAME = N'TDE - Full Database Backup', COMPRESSION, ENCRYPTION(ALGORITHM = AES_256, SERVER ASYMMETRIC KEY = asymetricSQLServerKey), STATS = 5 GO |
Odnośniki
Przydatne linki:
- https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/setup-steps-for-extensible-key-management-using-the-azure-key-vault
- https://blogs.technet.microsoft.com/kv/2015/06/02/azure-key-vault-step-by-step/
- https://www.microsoft.com/en-us/download/details.aspx?id=45344
- https://docs.microsoft.com/pl-pl/azure/key-vault/key-vault-whatis

Mateusz Nadobnik
Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.
read more