Ćwiczenie — Konfigurowanie aplikacji niestandardowej na platformie .NET przy użyciu tożsamości zarządzanej

Ukończone

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

  1. 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 .

  2. Przejdź do folderu identity/secretapp .

    cd ~/identity/secretapp
    
  3. 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#.

  4. 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.

  5. 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 klasy DefaultAzureCredential 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 obiektu SecretClient, które będzie korzystać z tego schematu uwierzytelniania. Tego wystąpienia SecretClient można używać do uzyskiwania dostępu do wpisów tajnych w magazynie kluczy.

  6. 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 obiektu SecretClient, 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.

  7. Aby zapisać zmiany, naciśnij klawisze Ctrl+O, a następnie naciśnij klawisz Enter.

  8. Aby zamknąć edytor nano, naciśnij klawisze Ctrl+X.

Testowanie aplikacji

  1. 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.

  2. 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

  1. Zamknij połączenie z maszyną wirtualną.

    exit
    
  2. 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.

  3. 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

  1. Zaloguj się do maszyny wirtualnej.

    ssh $publicIP
    
  2. Przejdź do identity/secretapp folderu .

    cd ~/identity/secretapp
    
  3. 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;