Tworzenie Azure Key Vault
Key Vault jest to moduł Azure, który pozwala na bezpieczne przechowywanie haseł, kluczy i innych sekretów. Z jego pomocą developerzy nie muszą zapisywać poświadczeń lub adresów połączeń w kodzie. Mogą natomiast odpytać Key Vault i pozyskać je kiedy są potrzebne. Aplikacja będzie w stanie potwierdzić swoją tożsamość i uzyskać dostęp do hasła, nawet w sytuacji gdy developer takiego dostępu nie ma. Stwórzmy Key Vault!
Tworzenie Key Vault
Aby stworzyć Key Vault (jak zapewne się domyślasz) zwyczajnie wyszukaj go w usługach Azure. Podczas tworzenia modułu, możesz zmienić różne polityki dostępu. Polecam zostawić wartości domyślne – możesz to zmienić, gdy już będziesz wiedział jaki poziom zabezpieczeń jest dla Ciebie odpowiedni.
Rejestrowanie aplikacji w Azure Active Directory
Aby aplikacja miała dostęp do sekretów, musisz zarejestrować ją w Azure Active Directory. Tylko tak będzie mogła uwierzytelnić się w Key Vault.
Otwórz Function App i przejdź do panelu Platform features:
Kliknij na Managed service indentity i zarejestuj ją w AAD:
Inną metodą jest zastosowanie Powershella:
1 |
Set-AzureRmWebApp -AssignIdentity $true -Name $appname –ResourceGroupName $resourcegroupname |
Teraz, gdy aplikacja jest już w AAD, możesz dodać ją do Access Policies w Key Vault. Aby to zrobić przejdź do access policies:
Dodaj nową, wybierz odpowiedni poziom dostępu i wyszukaj aplikację jej pełną nazwą:
Teraz, twoja aplikacja ma dostęp do sekretów. Nawet jeśli ty ich nie widzisz, możesz z nich korzystać przez aplikację.
Tworzenie sekretu
Przejdź do sekretów w głównym menu. Tutaj możesz wpisywać hasła, które będą dostępne tylko przez wybrane zasoby/osoby.
Kliknij na Generate/Import i dodaj hasło:
Po stworzeniu sekretu, skopiuj jego URL. Znajdziesz go w menu sekretu. Ten URL możesz dodać w aplikacji jako zmienną środowiskową lub wkleić jako kod, tak jak poniżej.
Dostęp do sekretów przez Function App
Teraz jesteś gotowy, żeby stworzyć funkcję, która dostanie się do sekretu.
Przejdź do Visual Studio i stwórz Azure Function z wyzwalaczem HTTP:
Musisz dodać dwa moduły:
1 2 |
using Microsoft.Azure.Services.AppAuthentication; using Microsoft.Azure.KeyVault; |
Następnie dodaj te 3 linijki kodu:
1 2 3 |
var azureServiceTokenProvider = new AzureServiceTokenProvider(); var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); string secret = kv.GetSecretAsync(“<Secret URL you have copied>”).Result.Value; |
Możesz zmienić wartość, którą zwraca funkcja:
1 |
return (ActionResult)new OkObjectResult($"Your secret is: " + secret); |
Cały kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Microsoft.Azure.Services.AppAuthentication; using Microsoft.Azure.KeyVault; namespace MySecretApp { public static class Function1 { [FunctionName("Function1")] public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); var azureServiceTokenProvider = new AzureServiceTokenProvider(); var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); string secret = kv.GetSecretAsync(“<Secret URL you have copied>”).Result.Value; return (ActionResult)new OkObjectResult($"Your secret is: " + secret); } } } |
Po publikacji, gdy wywołasz funkcję, otrzymasz swój sekret:
Mam nadzieję, że pomogłem 🙂
Michał