Alıştırma - Yönetilen kimlik kullanarak .NET’te özel bir uygulamayı yapılandırma

Tamamlandı

Azure Key Vault’ta uygulama bağlantı dizelerini, kimlik bilgilerini, parolaları ve diğer hassas bilgileri depolayabilirsiniz. Key Vault’a erişmek için kimlik bilgilerini sağlamanız gerekir. Artık bir Azure VM'sine taşınan uygulamanın bir parçası olarak, Key Vault'ta kimlik doğrulaması yapmak üzere bir erişim belirteci almak üzere yönetilen kimlikleri kullanacak şekilde güncelleştirebilirsiniz.

Stok takibi uygulamanız, Azure SQL Veritabanı’na bağlanıyor. Daha önce şirket içi uygulamanız, bağlantı dizesini yapılandırma dosyalarında depoluyordu. Azure'a geçişin bir parçası olarak artık tüm kimlik bilgilerini ve bağlantı dizesi bir Azure Key Vault'ta güvenli bir şekilde depolaacaksınız.

Stok izleme uygulamanız bir sanal makinede (VM) çalışır, böylece oluşturduğunuz sistem tarafından atanan yönetilen kimliği kullanabilirsiniz. Anahtar kasanıza, sanal makineye uygun izinleri veren bir ilke ekliyorsunuz.

Bu alıştırmada uygulamanızı yeni anahtar kasasını kullanacak şekilde düzenleyeceksiniz. Ardından, uygulamanın veritabanı bağlantısını alabilmesi için VM erişimi için yönetilen kimliğe izin verirsiniz. Son olarak, Key Vault'a erişmek ve bilgileri almak için VM'de bir uygulama derleyip çalıştıracaksınız.

Key Vault’tan gizli bilgileri getirmek için uygulama oluşturma

  1. Daha önce oluşturduğunuz VM'de oturum açın.

    ssh $publicIP
    

    Dekont

    Ortam değişkeni publicIP ayarlanmadıysa, aşağıdaki komutu çalıştırarak değişkeni sıfırlayın:

    export publicIP=$(az vm show \
        --name prodserver \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --show-details \
        --query [publicIps] \
        --output tsv)
    

    Ardından komutunu yeniden çalıştırın ssh $publicIP .

  2. identity/secretapp klasörüne gidin.

    cd ~/identity/secretapp
    
  3. Nano düzenleyiciyi kullanarak Program.cs dosyasını açın.

    nano Program.cs
    

    Bu dosya örnek uygulamanın C# kaynak kodunu içerir.

  4. Main yöntemini inceleyin.

    static async Task Main(string[] args)
    {
        await GetSecretFromKeyVault().ConfigureAwait(false);
    }
    

    Bu yöntem, yalnızca GetSecretFromKeyVault yöntemini çağıran uygulamanın giriş noktasıdır.

  5. GetSecretFromKeyVault yöntemine gidin. Yöntemin ilk kod bloğunu inceleyin.

    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());
        ...
    }
    

    "<key vault name>" yerine anahtar kasanızın adını yazın. Bu kod, istekte bulunacak istemcinin kimliğini doğrulamak için DefaultAzureCredential öğesini kullanır. Bu kod, arka planda, kodu çalıştıran sanal makine için sistem tarafından yönetilen kimliği alır. Daha sonra bu kimlik doğrulaması düzenini kullanacak bir SecretClient örneği oluşturur. Bu SecretClient örneğini kullanarak anahtar kasasındaki gizli dizilere erişebilirsiniz.

  6. Kodun sonraki bölümüne bakın.

    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}");
    }
    

    <secret name> değerini, anahtar kasasında oluşturduğunuz gizli dizinin adı olan "DBCredentials" ile değiştirin.

    Bu kod bloğu, belirli bir gizli diziyi almak ve değerini görüntülemek için SecretClient öğesinin GetSecretAsync yöntemini çağırır. İstemcinin anahtara erişim izni yoksa, bu kod bir özel durum oluşturur ve bir hata iletisi görüntüler.

    Dekont

    Kodda herhangi bir parola, sertifika veya gizli anahtar depolanmaz.

  7. Değişikliklerinizi kaydetmek için Ctrl+O tuşlarına basın ve ardından Enter tuşuna basın.

  8. Nano düzenleyiciyi kapatmak için Ctrl+X tuşlarına basın.

Uygulamayı test etme

  1. Uygulamayı derlemek için aşağıdaki komutu çalıştırın.

    dotnet restore
    dotnet build
    

    Programı doğru şekilde düzenlediyseniz uygulama hatasız derlenmelidir.

  2. Uygulamayı çalıştırın.

    dotnet run
    

    Sanal makinenin hizmet sorumlusunu anahtar kasanıza erişim için henüz yetkilendirmediniz. Bu nedenle, uygulama bir hata iletisiyle yanıt vermelidir:

    Something went wrong: Operation returned an invalid status code 'Forbidden'

Hizmet sorumlusunun Key Vault’tan gizli dizileri alabilmesini sağlayacak izinleri verme

  1. VM'ye bağlantınızı kapatın.

    exit
    
  2. Önceki alıştırmada, sanal makinenizin asıl kimliğini not etmiştiniz. Asıl kimliği hatırlamıyorsanız, aşağıdaki komutu çalıştırarak sanal makineniz için sistem tarafından atanan kimliği bulun. (Değişken, $VMNAME önceki alıştırmada değerine ayarlanmıştı prodserver.)

    az vm identity show \
      --name $VMNAME \
      --resource-group "<rgn>[sandbox resource group name]</rgn>"
    

    Aşağıdaki kod, döndürülen değere bir örnektir. Kimlikleriniz farklılık gösterir.

    {
        "principalId": "aba6da53-9180-47fc-8fc4-4b35f154e845",
        "tenantId": "a95baa51-dcb1-4b9a-8312-8774a8afddbe",
        "type": "SystemAssigned",
        "userAssignedIdentities": null
    }
    

    Sonraki komutta yalnızca sorumlu kimliğini döndürmek için bu değeri kullanın.

  3. Vm'yi anahtar kasanızdaki gizli dizileri alması ve listelemesi için yetkilendirmek için sorumlu kimliğini kullanın.

    az keyvault set-policy \
        --name $KVNAME \
        --secret-permissions get list \
        --object-id $(az vm identity show \
                        --name $VMNAME \
                        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
                        --output tsv \
                        --query principalId)
    

    Döndürülen değer JSON biçimindedir. Kimliği, konumu, adı ve ilişkili özelliklerin tümünü içerir.

Uygulamayı yeniden test etme

  1. VM'nizde oturum açın.

    ssh $publicIP
    
  2. klasörüne identity/secretapp geçin.

    cd ~/identity/secretapp
    
  3. Uygulamayı çalıştırın.

    dotnet run
    

    Bu kez uygulamanın Key Vault'tan gizli diziyi alması ve değerini görüntülemesi gerekir.

    Database connection string:: Server=tcp:prodserverSQL.database.windows.net,1433;Database=myDataBase;User ID=mylogin@myserver;Password=examplePassword;Trusted_Connection=False;Encrypt=True;