Latihan - Mengakses rahasia yang disimpan di Azure Key Vault
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 tersebutDefaultAzureCredential
.
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
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 .
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.
Untuk startup aplikasi, masukkan perintah berikut untuk meluncurkan editor.
code .
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 memanggilnyaAddAzureKeyVault
.Untuk pengontrol, buat file baru di folder
Controllers
bernamaSecretTestController.cs
, dan tempelkan kode berikut.Tip
Untuk membuat file baru, gunakan perintah
touch
di Cloud Shell. Dalam hal ini, jalankan perintahtouch 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!"); } } } }
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.
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).
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) } }
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); });
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));
Anda sudah selesai menulis kode, jadi pastikan untuk menyimpan file.
Aplikasi ini siap dijalankan. Sekarang saatnya untuk memasukkannya ke Azure!