Ćwiczenie — Konfigurowanie aplikacji niestandardowej na platformie .NET przy użyciu tożsamości zarządzanej
Parametry połączenia aplikacji, poświadczenia, hasła i inne informacje poufne można przechowywać w usłudze Azure Key Vault. Aby uzyskać dostęp do usługi Key Vault, także podać poświadczenia. Teraz w ramach aplikacji przejdź do maszyny wirtualnej platformy Azure, możesz zaktualizować ją tak, aby korzystała z tożsamości zarządzanych w celu uzyskania tokenu dostępu w celu uwierzytelnienia w usłudze Key Vault.
Twoja aplikacja do śledzenia zapasów łączy się z bazą danych Azure SQL Database. Wcześniej aplikacja lokalna przechowywała parametry połączenia w plikach konfiguracji. W ramach migracji na platformę Azure można teraz bezpiecznie przechowywać wszystkie poświadczenia i parametry połączenia w usłudze Azure Key Vault.
Aplikacja do śledzenia zapasów działa na maszynie wirtualnej, dzięki czemu można użyć utworzonej przez system tożsamości zarządzanej. Do magazynu kluczy dodajesz zasady, które przyznają odpowiednie uprawnienia dla maszyny wirtualnej.
W tym ćwiczeniu edytujesz swoją aplikację, aby używała nowego magazynu kluczy. Następnie przyznasz tożsamość zarządzaną dla dostępu do maszyny wirtualnej, aby aplikacja mogła pobrać połączenie z bazą danych. Na koniec skompilujesz i uruchomisz aplikację na maszynie wirtualnej, aby uzyskać dostęp do usługi Key Vault i pobrać informacje.
Tworzenie aplikacji w celu pobrania informacji o kluczu tajnym z usługi Key Vault
Zaloguj się do utworzonej wcześniej maszyny wirtualnej.
ssh $publicIP
Uwaga
Jeśli zmienna środowiskowa
publicIP
nie jest ustawiona, zresetuj ją, uruchamiając następujące polecenie:export publicIP=$(az vm show \ --name prodserver \ --resource-group <rgn>[Sandbox resource group]</rgn> \ --show-details \ --query [publicIps] \ --output tsv)
Następnie uruchom
ssh $publicIP
ponownie polecenie .Przejdź do folderu identity/secretapp .
cd ~/identity/secretapp
Otwórz plik Program.cs przy użyciu edytora nano.
nano Program.cs
Ten plik zawiera kod źródłowy przykładowej aplikacji w języku C#.
Zbadaj metodę
Main
.static async Task Main(string[] args) { await GetSecretFromKeyVault().ConfigureAwait(false); }
Ta metoda jest punktem wejścia aplikacji, która po prostu wywołuje metodę
GetSecretFromKeyVault
.Przejdź w dół do metody
GetSecretFromKeyVault
. Zbadaj pierwszy blok kodu metody.private static async Task GetSecretFromKeyVault() { var keyVaultName = "<key vault name>"; Uri keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net"); SecretClient secretClient = new SecretClient(keyVaultUri, new DefaultAzureCredential()); ... }
Zastąp element
"<key vault name>"
nazwą magazynu kluczy. Ten kod używa klasyDefaultAzureCredential
do uwierzytelnienia klienta, który wykona żądanie. W tle ten kod uzyskuje tożsamość zarządzaną przez system dla maszyny wirtualnej, na której działa kod. Następnie generuje wystąpienie obiektuSecretClient
, które będzie korzystać z tego schematu uwierzytelniania. Tego wystąpieniaSecretClient
można używać do uzyskiwania dostępu do wpisów tajnych w magazynie kluczy.Przyjrzyj się następnej części kodu.
var keyVaultSecretName = "<secret name>"; try { var secret = await secretClient.GetSecretAsync(keyVaultSecretName).ConfigureAwait(false); Console.WriteLine($"Secret: {secret.Value}"); } catch (Exception exp) { Console.WriteLine($"Something went wrong: {exp.Message}"); }
Zastąp ciąg
<secret name>
ciągiem"DBCredentials"
, czyli nazwą wpisu tajnego utworzonego w magazynie kluczy.Ten blok kodu wywołuje metodę
GetSecretAsync
obiektuSecretClient
, aby pobrać określony wpis tajny i wyświetlić jego wartość. Jeśli klient nie ma uprawnień dostępu do klucza, ten kod zgłasza wyjątek i wyświetla komunikat o błędzie.Uwaga
W kodzie nie jest przechowywane hasło, certyfikat ani wpis tajny klienta.
Aby zapisać zmiany, naciśnij klawisze Ctrl+O, a następnie naciśnij klawisz Enter.
Aby zamknąć edytor nano, naciśnij klawisze Ctrl+X.
Testowanie aplikacji
Uruchom następujące polecenie, aby skompilować aplikację.
dotnet restore dotnet build
Jeśli program został poprawnie zmodyfikowany, aplikacja powinna zostać skompilowana bez błędów.
Uruchom aplikację.
dotnet run
Jednostka usługi maszyny wirtualnej nie została jeszcze autoryzowana w celu uzyskania dostępu do magazynu kluczy. W związku z tym aplikacja powinna odpowiedzieć komunikatem o błędzie:
Something went wrong: Operation returned an invalid status code 'Forbidden'
Udzielanie uprawnień w celu umożliwienia jednostce usługi pobierania wpisów tajnych z usługi Key Vault
Zamknij połączenie z maszyną wirtualną.
exit
W poprzednim ćwiczeniu zanotowano identyfikator podmiotu zabezpieczeń dla maszyny wirtualnej. Jeśli go nie pamiętasz, uruchom następujące polecenie, aby znaleźć identyfikator przypisany przez system dla maszyny wirtualnej. (Zmienna została ustawiona
$VMNAME
w poprzednim ćwiczeniu na wartośćprodserver
.)az vm identity show \ --name $VMNAME \ --resource-group <rgn>[Sandbox resource group]</rgn>
Poniższy kod jest przykładem zwracanej wartości. Twoje identyfikatory będą się różnić.
{ "principalId": "aba6da53-9180-47fc-8fc4-4b35f154e845", "tenantId": "a95baa51-dcb1-4b9a-8312-8774a8afddbe", "type": "SystemAssigned", "userAssignedIdentities": null }
Użyj tej wartości, aby zwrócić tylko identyfikator podmiotu zabezpieczeń w następnym poleceniu.
Użyj identyfikatora podmiotu zabezpieczeń, aby autoryzować maszynę wirtualną do pobierania i wyświetlania listy wpisów tajnych w magazynie kluczy.
az keyvault set-policy \ --name $KVNAME \ --secret-permissions get list \ --object-id $(az vm identity show \ --name $VMNAME \ --resource-group <rgn>[Sandbox resource group]</rgn> \ --output tsv \ --query principalId)
Zwrócona wartość jest w formacie JSON. Zawiera identyfikator, lokalizację, nazwę i wszystkie skojarzone właściwości.
Ponowne testowanie aplikacji
Zaloguj się do maszyny wirtualnej.
ssh $publicIP
Przejdź do
identity/secretapp
folderu .cd ~/identity/secretapp
Uruchom aplikację.
dotnet run
Tym razem aplikacja powinna pobrać wpis tajny z usługi Key Vault i wyświetlić jego wartość.
Database connection string:: Server=tcp:prodserverSQL.database.windows.net,1433;Database=myDataBase;User ID=mylogin@myserver;Password=examplePassword;Trusted_Connection=False;Encrypt=True;