Latihan - Mengonfigurasi aplikasi kustom di .NET dengan menggunakan identitas terkelola

Selesai

Anda dapat menyimpan string koneksi, kredensial, kata sandi aplikasi, dan informasi sensitif lainnya di Azure Key Vault. Untuk mengakses Key Vault, Anda perlu memberikan kredensial. Sekarang, sebagai bagian dari pemindahan aplikasi ke Azure VM, Anda dapat memperbaruinya untuk menggunakan identitas terkelola guna mendapatkan token akses untuk mengautentikasi ke Key Vault.

Aplikasi pelacakan stok Anda terhubung ke Azure SQL Database. Sebelumnya, aplikasi lokal Anda menyimpan string koneksi dalam file konfigurasi. Sebagai bagian dari migrasi ke Azure, Anda sekarang menyimpan semua kredensial dan string koneksi dengan aman di Azure Key Vault.

Aplikasi pelacakan stok Anda berjalan di mesin virtual (VM), sehingga Anda dapat menggunakan identitas terkelola yang ditetapkan sistem yang Anda buat. Ke brankas kunci, Anda menambahkan kebijakan yang memberikan izin yang sesuai ke VM.

Dalam latihan ini, Anda akan mengedit aplikasi untuk menggunakan brankas kunci baru. Kemudian, Anda akan memberikan identitas terkelola untuk akses VM sehingga aplikasi dapat mengambil koneksi database. Terakhir, Anda akan membuat dan menjalankan aplikasi di VM untuk mengakses Key Vault, dan mengambil informasinya.

Membuat aplikasi untuk mengambil informasi rahasia dari Key Vault

  1. Masuk ke VM yang Anda buat sebelumnya.

    ssh $publicIP
    

    Catatan

    Jika variabel publicIP lingkungan tidak diatur, atur ulang dengan menjalankan perintah berikut:

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

    Kemudian, jalankan kembali perintah ssh $publicIP.

  2. Pindah ke folder identitas/secretapp.

    cd ~/identity/secretapp
    
  3. Buka file Program.cs dengan menggunakan editor nano.

    nano Program.cs
    

    File ini berisi kode sumber C# untuk aplikasi contoh.

  4. Periksa metode Main.

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

    Metode ini adalah titik masuk aplikasi yang hanya memanggil metode GetSecretFromKeyVault.

  5. Turun ke metode GetSecretFromKeyVault. Periksa blok kode pertama metode.

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

    Ganti "<key vault name>" dengan nama brankas kunci Anda. Kode ini menggunakan DefaultAzureCredential untuk mengautentikasi klien yang akan membuat permintaan. Di balik layar, kode ini mendapatkan identitas yang dikelola sistem untuk VM yang menjalankan kode. Kemudian menghasilkan instans SecretClient yang akan menggunakan skema autentikasi ini. Anda dapat menggunakan instans SecretClient ini untuk mengakses rahasia di brankas kunci.

  6. Lihatlah bagian berikutnya dari kode.

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

    Ganti <secret name> dengan "DBCredentials", yang merupakan nama rahasia yang Anda buat di brankas kunci.

    Blok kode ini memanggil metode GetSecretAsync dari SecretClient untuk mengambil rahasia tertentu dan menampilkan nilainya. Jika klien tidak memiliki izin untuk mengakses kunci, kode ini membuat pengecualian, dan menampilkan pesan kesalahan.

    Catatan

    Tidak ada kata sandi, sertifikat, atau rahasia klien yang disimpan dalam kode.

  7. Untuk menyimpan perubahan Anda, tekan Ctrl+O, lalu tekan Enter.

  8. Untuk menutup editor nano, tekan Ctrl+X.

Uji aplikasi

  1. Jalankan perintah berikut untuk membuat aplikasi.

    dotnet restore
    dotnet build
    

    Jika Anda mengedit program dengan benar, aplikasi akan dibuat tanpa kesalahan.

  2. Jalankan aplikasi lagi.

    dotnet run
    

    Anda belum memberi otorisasi perwakilan layanan VM untuk mengakses brankas kunci Anda. Oleh karena itu, aplikasi akan merespons dengan pesan kesalahan:

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

Berikan izin untuk mengaktifkan perwakilan layanan untuk mengambil rahasia dari Key Vault

  1. Tutup koneksi Anda ke VM.

    exit
    
  2. Dalam latihan sebelumnya, Anda mencatat ID utama untuk VM. Jika Anda tidak ingat ID utama, jalankan perintah berikut untuk mencari ID yang ditetapkan sistem untuk VM Anda. (Variabel $VMNAME ditetapkan dalam latihan sebelumnya ke nilai prodserver.)

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

    Kode berikut adalah contoh nilai yang ditampilkan. ID Anda akan berbeda.

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

    Gunakan nilai ini untuk menampilkan ID utama saja di perintah berikutnya.

  3. Gunakan ID utama untuk memberi otorisasi VM untuk mengambil dan mencantumkan rahasia di brankas kunci Anda.

    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)
    

    Nilai yang ditampilkan dalam format JSON. Ini berisi ID, lokasi, nama, dan semua properti terkait.

Menguji aplikasi lagi

  1. Masuk ke VM Anda.

    ssh $publicIP
    
  2. Ubah ke folder identity/secretapp.

    cd ~/identity/secretapp
    
  3. Jalankan aplikasi lagi.

    dotnet run
    

    Kali ini, aplikasi akan mengambil rahasia dari Key Vault dan menampilkan nilainya.

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