Azure KeyVault z perspektywy Dev i Ops, czyli kilka słów o KeePass’ie dla aplikacji
Jak wiadomo, sztuką nie jest zrobienie projektu, ale właściwe go zabezpieczenie. Nie jeden raz pewnie natknęliście się z przypadkowo dodanym do repozytorium hasłem do bazy danych, bądź jakiegoś konta serwisowego. Internet w tej sytuacji nam nie pomaga, a wręcz przeciwnie – szkodzi. Wystarczy wejść na GitHub i w ogólnodostępnej wyszukiwarce wpisać słowo „password”, a naszym oczom ukaże się niejedno przypadkowo opublikowane hasło. Aby zredukować szansę, że to właśnie nas spotka ten problem możemy skorzystać z usługi Azure Key Vault.
Mateusz Dudek. Programista w Predica. Pasjonat rozwiązań chmurowych, aplikacji WWW i integracji systemów. Zawsze chętny do dzielenia się wiedzą z innymi — niedawno opublikował w magazynie artykuł pt. Jak w jeden dzień zbudować proces klasy enterprise z Azure Logic Apps i Azure Functions, o tym czym są Azure Logic Apps i Azure Functions oraz gdzie i za ile możemy je wykorzystać.
Spis treści
Intro
Azure Key Vault jest usługą umożliwiającą między innymi ochronę i operacje na kluczach kryptograficznych i certyfikatach oraz zabezpieczenie „tajnych wartości” (ang. secrets). W dzisiejszym artykule poruszę głównie tematykę secretów, ponieważ idealnie nadają się one do przechowywania wspomnianych wcześniej haseł.
Widok dashboardu usługi Azure Key Vault
Tworzenie nowych wpisów
Dodanie nowego „hasła” w Azure Key Vault jest niemal tak proste, jak budowa przysłowiowego cepa. Z lewego paska nawigacyjnego wybieramy zakładkę „Secrets” i wybieramy „Generate”. Usługa przechowuje pary klucz-wartość, dlatego każdemu wpisowi musimy nadać unikalną nazwę oraz wprowadzić jego wartość. Jako element opcjonalny możemy ustawić czas obowiązywania hasła oraz opisać go metadanymi.
Tworzenie nowego wpisu z poziomu portalu Azure
W portalu Azure mamy również możliwość przejrzenia listy dodanych przez nas wpisów oraz ich wartości. Poniżej dodany przeze mnie wcześniej wpis.
Widok szczegółów secretu
Czym jednak byłaby usługa, którą można obsługiwać tylko z poziomu przeglądarki, dlatego akcje te są także wykonalne z poziomu REST API, SDK, Azure CLI czy PowerShell.
Kontrola dostępu
Delegując uprawnienia do Azure Key Vault możemy wybrać do jakich operacji zdelegowany będzie miał dostęp. Jest to szczególnie istotne, by nie nadawać zbyt szerokich uprawnień.
Widok ustawień polityki dostępu
Wykorzystanie w aplikacji
Jako przykład wykorzystam aplikację ASP.NET uruchomioną w Azure. Chcąc wykorzystać Azure Key Vault mamy dwie opcje uwierzytelnienia się usłudze:
- Używając token OAuth2.0 wygenerowany za pomocą pary ClientId/ClientSecret. Wadą tego rozwiązania jest mimo wszystko konieczność dostarczenia aplikacji tych wartości, które również możemy przypadkowo ujawnić.
- Używając Azure Managed Service Identity (MSI), który dla aplikacji generuje token. Jest to znacznie bezpieczniejsze podejście, ponieważ token dostajemy z endpointu dostępnego tylko i wyłącznie dla serwera aplikacji. Niweluje to również potrzebę dostarczania ClientId/ClientSecret w konfiguracji aplikacji. Wystarczy zapisać je w Azure Key Vault.
Jak widzimy, fragment kodu do odczytu secretu z Azure Key Vault z wykorzystaniem MSI jest niewiele bardziej skomplikowany od odczytu z lokalnej konfiguracji.
var azureServiceTokenProvider = new AzureServiceTokenProvider(); var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); var secret = await keyVaultClient.GetSecretAsync("https:// kyvazewdccautom001.vault.azure.net/secrets/MySecretName").ConfigureAwait(false); var secretValue = secret.Value;
Wykorzystując parę ClientId/ClientSecret w przypadku braku MSI bądź uruchomienia w środowisku OnPremises jedyna różnica polega na tym, że musimy w konstruktorze KeyVaultClient przekazać wygenerowany token.
Wykorzystanie w skryptach
Użycie w PowerShell jest jeszcze prostsze niż w aplikacji.
(Get-AzureKeyVaultSecret -vaultName "kyvazewdccautom001" -name "MySecretName").SecretValueText
Zgadza się. Jedna linijka, która chroni Twoje hasło. Jedyne o czym musisz pamiętać, to mieć sesję PowerShell zalogowaną do Azure i zainstalowany commandlet AzureRM.KeyVault
.
Podobnie sytuacja wygląda z Azure CLI, które wywołasz tym poleceniem:
az keyvault secret show --name 'MySecretName' --vault-name 'kyvazewdccautom001'
Wykorzystanie w Azure
Jeśli używasz Azure Resource Manager (ARM) i chcesz przejść ze standardowych haseł i connection stringów trzymanych jako pliki konfiguracyjne to nawet nie zdajesz sobie sprawy, ile czasu udało Ci się teraz zaoszczędzić. Nie musisz zmieniać żadnej linijki kodu w swojej aplikacji. Tak! Zero kodu!
Zmiany, które należy wykonać dotyczą tylko ARM template. Dla parametru, który chcesz pobrać z Azure Key Vault wystarczy zmienić wartość podaną jawnie
"appConfigParameterName": { "value": "PlainTextValue" },
na referencję do Azure Key Vault:
"appConfigParameterName": { "reference": { "keyVault": { "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg123/providers/Microsoft.KeyVault/vaults/ kyvazewdccautom001" }, "secretName": "MySecretName" } }
Po zmianie szablonu upewnij się, że masz aktualną konfigurację w Azure Key Vault i wdróż szablon. Magia polega na tym, że Azure podczas wdrożenia automatycznie pobierze i podstawi wartości z Key Vault w miejsce parametru.
Pamiętaj jednak, aby przed uruchomieniem wdrożenia upewnić się, że Azure Resource Manager ma uprawnienia do odczytu z Azure Key Vault. Aby to sprawdzić wejdź do sekcji Access Policies i zaznacz opcję ze screenshota poniżej:
Gdzie to wykorzystuję?
Azure Key Vault wykorzystuję we wszystkich wspomnianych wcześniej rozwiązaniach:
- Aplikacji ASP.NET i Azure Functions, z wykorzystaniem Managed Service Identity (MSI).
Aplikacja łączy się z Azure Key Vault i pobiera hasła, które wykorzystuje do połączenia z innymi usługami, np. baza danych, SharePoint, itd. - Skryptach PowerShell
Skrypty wdrożeniowe bazy danych w ramach CI/CD pobierają connection string do bazy danych, a następnie uruchamiają migrację. - Szablonach Azure Resource Manager (ARM)
Azure Resource Manager podczas wdrażania Azure Logic Apps podstawia
* ClientId/ClientSecret, które są używane do uwierzytelniania zapytań HTTP do innych serwisów
* Connection string do systemu kolejkowego (Azure Service Bus)
Ile to mnie będzie kosztować?
Chcąc policzyć koszt usługi polecam skorzystać z jej cennika. Na dzień artykułu (3.10.2018) jest to wydatek rzędu 0.03USD za każde 1000 operacji. Płacąc 1USD miesięcznie dostajesz możliwość wykonania średnio 46 zapytań w ciągu każdej minuty (zakładając, że miesiąc ma 720 godzin). Jest to wydatek naprawdę niewielki, który pomoże Ci zaoszczędzić sporo strachu.
Podsumowanie
Azure Key Vault jest stosunkowo niewielką usługą, która ma jedno, proste zadanie – trzymać bezpiecznie twoje hasła, klucze i certyfikaty. Jeśli jesteś w stanie zaakceptować możliwe opóźnienia związane z wywoływaniem usługi w stosunku do odczytu lokalnej konfiguracji to gorąco Cię zachęcam do wypróbowania tej usługi.
Najważniejsze rzeczy do zapamiętania
1. Dodanie Azure Key Vault do istniejącego rozwiązania nie jest takie trudne
2. Azure Key Vault może być zarówno tanie jak i drogie, dlatego przeanalizuj architekturę swojego rozwiązania pod cache’owania pobieranych wartości.
3. Korzystając z Azure Key Vault i uwierzytelniania parą ClientId/ClientSecret nie zapomnij o nich. Wyjawiając je wyjawiasz wszystko!