Latihan - Mengakses rahasia yang disimpan di Azure Key Vault

Selesai

Anda tahu cara mengaktifkan identitas terkelola untuk sumber daya Azure membuat identitas untuk digunakan aplikasi Anda untuk autentikasi. Sekarang buat aplikasi yang menggunakan identitas tersebut untuk mengakses rahasia di vault.

Membaca rahasia di aplikasi ASP.NET Core

API Azure Key Vault adalah REST API yang menangani semua manajemen dan penggunaan kunci dan vault. Setiap rahasia dalam vault memiliki URL unik. Nilai rahasia diambil dengan permintaan HTTP GET.

Klien Key Vault resmi untuk .NET Core adalah SecretClient kelas dalam Azure.Security.KeyVault.Secrets paket NuGet. Namun, Anda tidak perlu menggunakannya secara langsung. Dengan metode AddAzureKeyVault ASP.NET Core, Anda dapat memuat semua rahasia dari brankas ke dalam API Konfigurasi saat memulai. Teknik ini memungkinkan Anda mengakses semua rahasia Anda berdasarkan nama menggunakan antarmuka IConfiguration yang sama dengan yang Anda gunakan untuk sisa konfigurasi Anda. Aplikasi yang menggunakan AddAzureKeyVault memerlukan Get izin dan List ke vault.

Tip

Terlepas dari kerangka kerja atau bahasa yang Anda gunakan untuk membuat aplikasi, Anda harus mendesainnya untuk men-cache nilai rahasia secara lokal atau memuatnya ke dalam memori saat startup, kecuali Anda memiliki alasan khusus untuk tidak melakukannya. Membacanya langsung dari brankas setiap kali Anda membutuhkannya adalah sesuatu yang sebaiknya dihindari karena lambat dan mahal.

AddAzureKeyVault hanya memerlukan nama vault sebagai input, yang Anda dapatkan dari konfigurasi aplikasi lokal Anda. Hal ini juga secara otomatis menangani autentikasi identitas terkelola. Saat digunakan dalam aplikasi yang disebarkan ke Azure App Service dengan identitas terkelola untuk sumber daya Azure diaktifkan, aplikasi mendeteksi layanan token identitas terkelola dan menggunakannya untuk mengautentikasi. Ini cocok untuk sebagian besar skenario dan mengimplementasikan semua praktik terbaik. Anda menggunakannya dalam latihan unit ini.

Membaca rahasia di aplikasi Node.js

API Azure Key Vault adalah REST API yang menangani semua manajemen dan penggunaan kunci dan vault. Setiap rahasia dalam vault memiliki URL unik. Nilai rahasia diambil dengan permintaan HTTP GET.

Klien Key Vault resmi untuk Node.js Anda adalah kelas SecretClient dalam paket npm @azure/keyvault-secrets. Aplikasi yang menyertakan nama rahasia dalam konfigurasi atau kodenya umumnya menggunakan metodenya getSecret , yang memuat nilai rahasia yang diberikan namanya. getSecret mengharuskan identitas aplikasi Anda memiliki Get izin di vault. Aplikasi yang dirancang untuk memuat semua rahasia dari vault juga menggunakan listPropertiesOfSecrets metode , yang memuat daftar rahasia dan memerlukan List izin.

Sebelum aplikasi Anda dapat membuat instans SecretClient, aplikasi harus mendapatkan objek info masuk untuk autentikasi ke brankas. Untuk mengautentikasi, gunakan DefaultAzureCredential yang disediakan paket npm @azure/identity. DefaultAzureCredential sesuai untuk sebagian besar skenario di mana aplikasi dimaksudkan untuk pada akhirnya berjalan di Azure Cloud karena DefaultAzureCredential menggabungkan kredensial yang umum digunakan untuk mengautentikasi saat disebarkan, dengan kredensial yang digunakan untuk mengautentikasi di lingkungan pengembangan. Upaya DefaultAzureCredential untuk mengautentikasi dengan menggunakan mekanisme berikut secara berurutan:

  • Lingkungan. Membaca DefaultAzureCredential informasi akun yang ditentukan dengan menggunakan variabel lingkungan dan menggunakannya untuk mengautentikasi.
  • Identitas terkelola. Jika aplikasi disebarkan ke host Azure dengan Identitas Terkelola diaktifkan, autentikasi dengan akun tersebut DefaultAzureCredential .
  • Visual Studio Code. Jika pengembang mengautentikasi dengan menggunakan plugin Akun Azure Visual Studio Code, autentikasi dengan akun tersebut DefaultAzureCredential .
  • Azure CLI. Jika pengembang mengautentikasi akun dengan menggunakan perintah Azure CLI az login , autentikasi dengan akun tersebut DefaultAzureCredential .

Untuk informasi selengkapnya, lihat dokumentasi.

Tip

Terlepas dari kerangka kerja atau bahasa yang Anda gunakan untuk membuat aplikasi, Anda harus mendesainnya untuk men-cache nilai rahasia secara lokal atau memuatnya ke dalam memori saat startup, kecuali Anda memiliki alasan khusus untuk tidak melakukannya. Membacanya langsung dari brankas setiap kali Anda membutuhkannya adalah sesuatu yang sebaiknya dihindari karena lambat dan mahal.

Menangani rahasia di dalam aplikasi

Setelah rahasia dimuat ke dalam aplikasi Anda, penanganan rahasia secara aman semua diserahkan pada aplikasi tersebut. Dalam aplikasi yang Anda buat dalam modul ini, Anda menulis nilai rahasia Anda ke respons klien, dan untuk menunjukkan bahwa itu berhasil dimuat, Anda melihatnya di browser web. Mengembalikan nilai rahasia kepada klien bukanlah sesuatu yang biasanya Anda lakukan! Biasanya, Anda menggunakan rahasia untuk melakukan hal-hal seperti menginisialisasi pustaka klien untuk database atau API jarak jauh.

Penting

Selalu tinjau kode Anda dengan cermat untuk memastikan bahwa aplikasi Anda tidak pernah menulis rahasia ke segala jenis output, termasuk log, penyimpanan, dan respons.

Latihan

Untuk memuat rahasia dari vault kami, Anda membuat API web ASP.NET Core baru, dan menggunakan AddAzureKeyVault.

Membuat aplikasi

  1. Untuk membuat aplikasi API web ASP.NET Core baru dan membukanya di editor, jalankan perintah berikut di Azure Cloud Shell.

    dotnet new webapi -o KeyVaultDemoApp
    cd KeyVaultDemoApp
    code .
    
  2. Setelah penyunting dimuat, tambahkan paket NuGet yang berisi AddAzureKeyVault dan pulihkan semua dependensi aplikasi. Jalankan perintah berikut di Azure Cloud Shell.

    dotnet add package Azure.Identity
    dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
    dotnet restore
    

Menambahkan kode untuk memuat dan menggunakan rahasia

Untuk mendemonstrasikan penggunaan Key Vault dengan baik, ubah aplikasi Anda untuk memuat rahasia dari vault saat startup. Anda juga menambahkan pengontrol baru dengan titik akhir yang mendapatkan rahasia Anda SecretPassword dari vault.

  1. Untuk startup aplikasi, masukkan perintah berikut untuk meluncurkan editor.

    code .
    
  2. Buka Program.cs, hapus isinya, dan ganti dengan kode berikut.

    using System;
    using Azure.Identity;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    
    namespace KeyVaultDemoApp
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    })
                    .ConfigureAppConfiguration((context, config) =>
                    {
                        // Build the current set of configuration to load values from
                        // JSON files and environment variables, including VaultName.
                        var builtConfig = config.Build();
    
                        // Use VaultName from the configuration to create the full vault URI.
                        var vaultName = builtConfig["VaultName"];
                        Uri vaultUri = new Uri($"https://{vaultName}.vault.azure.net/");
    
                        // Load all secrets from the vault into configuration. This will automatically
                        // authenticate to the vault using a managed identity. If a managed identity
                        // is not available, it will check if Visual Studio and/or the Azure CLI are
                        // installed locally and see if they are configured with credentials that can
                        // access the vault.
                        config.AddAzureKeyVault(vaultUri, new DefaultAzureCredential());
                    });
        }
    }
    

    Penting

    Pastikan untuk menyimpan file saat Anda selesai mengeditnya. Anda dapat menyimpan file baik melalui "..." atau tombol akselerator (Ctrl+S di Windows dan Linux, Cmd+S di macOS).

    Satu-satunya perubahan dari kode starter adalah penambahan ConfigureAppConfiguration. Elemen ini adalah tempat kita memuat nama vault dari konfigurasi dan memanggilnya AddAzureKeyVault .

  3. Untuk pengontrol, buat file baru di folder Controllers bernama SecretTestController.cs, dan tempelkan kode berikut.

    Tip

    Untuk membuat file baru, gunakan perintah touch di Cloud Shell. Dalam hal ini, jalankan perintah touch Controllers/SecretTestController.cs. Untuk menemukannya di pojok kanan atas panel File editor, pilih ikon Refresh.

    using System;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    
    namespace KeyVaultDemoApp.Controllers
    {
        [Route("api/[controller]")]
        public class SecretTestController : ControllerBase
        {
            private readonly IConfiguration _configuration;
    
            public SecretTestController(IConfiguration configuration)
            {
                _configuration = configuration;
            }
    
            [HttpGet]
            public IActionResult Get()
            {
                // Get the secret value from configuration. This can be done anywhere
                // we have access to IConfiguration. This does not call the Key Vault
                // API, because the secrets were loaded at startup.
                var secretName = "SecretPassword";
                var secretValue = _configuration[secretName];
    
                if (secretValue == null)
                {
                    return StatusCode(
                        StatusCodes.Status500InternalServerError,
                        $"Error: No secret named {secretName} was found...");
                }
                else {
                    return Content($"Secret value: {secretValue}" +
                        Environment.NewLine + Environment.NewLine +
                        "This is for testing only! Never output a secret " +
                        "to a response or anywhere else in a real app!");
                }
            }
        }
    }
    
  4. Jalankan perintah dotnet build di Azure Cloud Shell untuk memastikan semuanya sudah sesuai. Aplikasi ini siap dijalankan. Sekarang saatnya untuk memasukkannya ke Azure!

Buat API web baru dengan Express.js dan gunakan @azure/keyvault-secrets paket dan @azure/identity untuk memuat rahasia dari vault kami.

Membuat aplikasi

Jalankan kode berikut di Azure Cloud Shell untuk menginisialisasi aplikasi Node.js baru, menginstal paket yang diperlukan, dan membuka file baru di editor.

mkdir KeyVaultDemoApp
cd KeyVaultDemoApp
npm init -y
npm install @azure/identity @azure/keyvault-secrets express
touch app.js
code app.js

Menambahkan kode untuk memuat dan menggunakan rahasia

Untuk menunjukkan penggunaan Key Vault dengan baik, aplikasi Anda memuat rahasia dari vault saat startup. Untuk menunjukkan bahwa rahasia Anda dimuat, buat titik akhir yang menampilkan nilai SecretPassword rahasia.

  1. Untuk mengatur aplikasi, tempelkan kode berikut ke dalam editor. Kode ini mengimpor paket yang diperlukan, menyiapkan konfigurasi URI port dan vault, dan membuat objek baru untuk menyimpan nama dan nilai rahasia.

    // Importing dependencies
    const { DefaultAzureCredential } = require("@azure/identity");
    const { SecretClient } = require("@azure/keyvault-secrets");
    const app = require('express')();
    
    // Initialize port
    const port = process.env.PORT || 3000;
    
    // Create Vault URI from App Settings
    const vaultUri = `https://${process.env.VaultName}.vault.azure.net/`;
    
    // Map of key vault secret names to values
    let vaultSecretsMap = {};
    

    Penting

    Pastikan untuk menyimpan file saat Anda mengerjakannya, terutama setelah Anda selesai. Anda dapat menyimpan file baik melalui "..." atau tombol akselerator (Ctrl+S di Windows dan Linux, Cmd+S di macOS).

  2. Selanjutnya, tambahkan kode untuk mengautentikasi ke vault dan memuat rahasia. Anda menambahkan kode ini sebagai dua fungsi terpisah. Sisipkan beberapa baris kosong setelah kode yang sebelumnya Anda tambahkan, lalu tempelkan kode berikut.

    const getKeyVaultSecrets = async () => {
      // Create a key vault secret client
      let secretClient = new SecretClient(vaultUri, new DefaultAzureCredential());
      try {
        // Iterate through each secret in the vault
        listPropertiesOfSecrets = secretClient.listPropertiesOfSecrets();
        while (true) {
          let { done, value } = await listPropertiesOfSecrets.next();
          if (done) {
            break;
          }
          // Only load enabled secrets - getSecret will return an error for disabled secrets
          if (value.enabled) {
            const secret = await secretClient.getSecret(value.name);
            vaultSecretsMap[value.name] = secret.value;
          }
        }
      } catch(err) {
        console.log(err.message)
      }
    }
    
  3. Untuk menguji apakah rahasia kami dimuat, buat titik akhir Express. Tempelkan kode ini.

    app.get('/api/SecretTest', (req, res) => {
      let secretName = 'SecretPassword';
      let response;
      if (secretName in vaultSecretsMap) {
        response = `Secret value: ${vaultSecretsMap[secretName]}\n\nThis is for testing only! Never output a secret to a response or anywhere else in a real app!`;
      } else {
        response = `Error: No secret named ${secretName} was found...`
      }
      res.type('text');
      res.send(response);
    });
    
  4. Panggil fungsi Anda untuk memuat rahasia dari vault kami, lalu mulai aplikasi. Untuk menyelesaikan aplikasi, tempelkan cuplikan terakhir ini.

    (async () =>  {
      await getKeyVaultSecrets();
      app.listen(port, () => {
        console.log(`Server running at http://localhost:${port}`);
      });
    })().catch(err => console.log(err));
    
  5. Anda sudah selesai menulis kode, jadi pastikan untuk menyimpan file.

Aplikasi ini siap dijalankan. Sekarang saatnya untuk memasukkannya ke Azure!