Alıştırma - Azure Key Vault’ta depolanan gizli dizilere erişme
Azure kaynakları için yönetilen kimlikleri etkinleştirmenin, uygulamanızın kimlik doğrulaması için kullanması için nasıl bir kimlik oluşturduğunu biliyorsunuz. Şimdi kasadaki gizli dizilere erişmek için bu kimliği kullanan bir uygulama oluşturun.
ASP.NET Core uygulamasında gizli dizileri okuma
Azure Key Vault API,anahtarların ve kasaların tüm yönetimini ve kullanımını işleyen bir REST API'dir. Kasadaki her gizli dizi benzersiz bir URL'ye sahiptir. Gizli dizi değerleri HTTP GET istekleriyle alınır.
.NET Core için resmi Key Vault istemcisi, NuGet paketindeki Azure.Security.KeyVault.Secrets
sınıftırSecretClient
. Ancak, doğrudan kullanmanız gerekmez. ASP.NET Core'un AddAzureKeyVault
yöntemiyle bir kasadaki tüm gizli dizileri başlangıçta Yapılandırma API'sine yükleyebilirsiniz. Bu teknik, yapılandırmanızın geri kalanında kullandığınız arabirimi kullanarak IConfiguration
tüm gizli dizilerinize ada göre erişmenizi sağlar. kullanan AddAzureKeyVault
uygulamalar kasa için hem hem de Get
List
izin gerektirir.
Bahşiş
Uygulamanızı oluştururken kullandığınız çerçeveden veya dilden bağımsız olarak, gizli dizi değerlerini yerel olarak önbelleğe almak veya başlangıçta belleğe yüklemek için tasarlamanız gerekir; aksi için belirli bir nedeniniz yoksa. Her gerektiğinde bunları doğrudan kasadan okumak gereksiz düzeyde yavaş ve pahalı olur.
AddAzureKeyVault
yalnızca yerel uygulama yapılandırmanızdan edindiğiniz giriş olarak kasa adını gerektirir. Ayrıca yönetilen kimlik kimlik doğrulamayı otomatik olarak işler. Azure kaynakları için yönetilen kimliklerin etkinleştirildiği Azure Uygulaması Hizmeti'ne dağıtılan bir uygulamada kullanıldığında, yönetilen kimlik belirteci hizmetini algılar ve kimlik doğrulaması için kullanır. Çoğu senaryo için uygundur ve tüm en iyi yöntemleri uygular. Bu ünitenin alıştırmasında kullanacaksınız.
Node.js uygulamasında gizli dizileri okuma
Azure Key Vault API,anahtarların ve kasaların tüm yönetimini ve kullanımını işleyen bir REST API'dir. Kasadaki her gizli dizi benzersiz bir URL'ye sahiptir. Gizli dizi değerleri HTTP GET istekleriyle alınır.
Node.js uygulamaları için resmi Key Vault istemcisi, @azure/keyvault-secrets
npm paketindeki SecretClient
sınıfıdır. Yapılandırmalarına veya kodlarına gizli dizi adları içeren uygulamalar genellikle adını verilen gizli dizi değerini yükleyen yöntemini kullanır getSecret
. getSecret
, uygulamanızın kimliğinin Get
kasa üzerinde izinlere sahip olmasını gerektirir. Bir kasadan tüm gizli dizileri yüklemek için tasarlanan listPropertiesOfSecrets
uygulamalar, gizli dizi listesini yükleyen ve izin gerektiren List
yöntemini de kullanır.
Uygulamanızın bir SecretClient
örneği oluşturabilmesi için kasada kimlik doğrulaması yapmak üzere bir kimlik bilgisi nesnesi almalıdır. Kimliği doğrulamak için @azure/identity
npm paketi tarafından sağlanan DefaultAzureCredential
öğesini kullanın. DefaultAzureCredential
, dağıtıldığında kimlik doğrulaması için yaygın olarak kullanılan kimlik bilgilerini geliştirme ortamında kimlik doğrulaması için kullanılan kimlik bilgileriyle birleştirdiğinden, uygulamanın nihai olarak Azure Bulut'ta DefaultAzureCredential
çalıştırılmasının amaçlandığı çoğu senaryo için uygundur. Aşağıdaki DefaultAzureCredential
mekanizmaları sırayla kullanarak kimlik doğrulaması denemeleri:
- Ortam. Ortam
DefaultAzureCredential
değişkenlerini kullanarak belirtilen hesap bilgilerini okur ve kimlik doğrulaması için kullanır. - Yönetilen Kimlik. Uygulama Yönetilen Kimlik etkin bir Azure konağına
DefaultAzureCredential
dağıtılırsa, bu hesapla kimlik doğrulaması yapılır. - Visual Studio Code. Geliştiricinin kimliği Visual Studio Code Azure Hesabı eklentisini kullanarak doğrulandıysa,
DefaultAzureCredential
bu hesapla kimlik doğrulaması yapılır. - Azure CLI. Geliştirici Azure CLI
az login
komutunu kullanarak bir hesabın kimliğini doğruladıysa,DefaultAzureCredential
bu hesapla kimlik doğrulaması yapar.
Daha fazla bilgi için belgelere bakın.
Bahşiş
Uygulamanızı oluştururken kullandığınız çerçeveden veya dilden bağımsız olarak, gizli dizi değerlerini yerel olarak önbelleğe almak veya başlangıçta belleğe yüklemek için tasarlamanız gerekir; aksi için belirli bir nedeniniz yoksa. Her gerektiğinde bunları doğrudan kasadan okumak gereksiz düzeyde yavaş ve pahalı olur.
Uygulamada gizli dizileri işleme
Uygulamanıza bir gizli dizi yüklendikten sonra, bunu güvenle işleyip işlemeyeceği uygulamanıza kalmıştır. Bu modülde oluşturduğunuz uygulamada gizli dizi değerinizi istemci yanıtına yazar ve başarıyla yüklendiğini göstermek için web tarayıcısında görüntülersiniz. Gizli dizi değerini istemciye döndürmek normalde yaptığınız bir şey değildir! Genellikle, veritabanları veya uzak API'ler için istemci kitaplıklarını başlatma gibi işlemler yapmak için gizli diziler kullanırsınız.
Önemli
Uygulamanızın günlükler, depolama alanı ve yanıtlar dahil olmak üzere hiçbir tür çıkışa gizli dizi yazmadığından emin olmak için kodunuzu her zaman dikkatle gözden geçirin.
Alıştırma
Gizli diziyi kasamızdan yüklemek için yeni bir ASP.NET Core web API'sini oluşturup kullanın AddAzureKeyVault
.
Uygulamayı oluşturma
Yeni ASP.NET Core web API'sini oluşturmak ve düzenleyicide açmak için Azure Cloud Shell'de aşağıdaki komutları çalıştırın.
dotnet new webapi -o KeyVaultDemoApp cd KeyVaultDemoApp code .
Düzenleyici yüklendikten sonra, uygulamanın tüm bağımlılıklarını içeren
AddAzureKeyVault
NuGet paketini ekleyin ve geri yükleyin. Azure Cloud Shell'de aşağıdaki komutları çalıştırın.dotnet add package Azure.Identity dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets dotnet restore
Gizli dizileri yüklemek ve kullanmak için kod ekleme
Key Vault'un iyi kullanımını göstermek için uygulamanızı başlangıçta kasadan gizli dizileri yüklenecek şekilde değiştirin. Ayrıca kasadan gizli dizinizi alan uç noktaya sahip yeni bir denetleyici de eklersiniz SecretPassword
.
Uygulamanın başlatılması için aşağıdaki komutu girerek düzenleyiciyi başlatın.
code .
öğesini açın
Program.cs
, içeriğini silin ve aşağıdaki kodla değiştirin.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()); }); } }
Önemli
Dosyaları düzenlemeyi bitirdikten sonra kaydetmeyi unutmayın. Dosyaları "..." aracılığıyla kaydedebilirsiniz menüsüne veya hızlandırıcı tuşuna (Windows ve Linux'ta Ctrl+S, macOS'ta Cmd+S).
Başlangıç koduna göre tek değişiklik
ConfigureAppConfiguration
öğesinin eklenmesidir. Bu öğe, yapılandırmadan kasa adını yüklediğimiz ve onunla çağırdığımızAddAzureKeyVault
öğedir.Denetleyici için klasöründe adlı
SecretTestController.cs
yeni bir dosyaControllers
oluşturun ve aşağıdaki kodu yapıştırın.Bahşiş
Yeni bir dosya oluşturmak için Cloud Shell'de komutunu kullanın
touch
. Bu durumda komutunu çalıştırıntouch Controllers/SecretTestController.cs
. Düzenleyicinin Dosyalar bölmesinin sağ üst köşesinde bulmak için Yenile simgesini seçin.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!"); } } } }
Her şeyin derlendiğinden
dotnet build
emin olmak için Azure Cloud Shell'de komutunu çalıştırın. Uygulama çalışmaya hazırdır. Şimdi Azure'a alma zamanı!
Express.js ile yeni bir web API'si @azure/keyvault-secrets
oluşturun ve kasamızdan gizli diziyi yüklemek için ve @azure/identity
paketlerini kullanın.
Uygulamayı oluşturma
Yeni bir Node.js uygulaması başlatmak, gerekli paketleri yüklemek ve düzenleyicide yeni bir dosya açmak için Azure Cloud Shell'de aşağıdaki kodu çalıştırın.
mkdir KeyVaultDemoApp
cd KeyVaultDemoApp
npm init -y
npm install @azure/identity @azure/keyvault-secrets express
touch app.js
code app.js
Gizli dizileri yüklemek ve kullanmak için kod ekleme
Key Vault'un iyi kullanımını göstermek için uygulamanız başlangıçta kasadan gizli dizileri yükler. Gizli dizilerinizin yüklendiğini göstermek için gizli dizi değerini SecretPassword
görüntüleyen bir uç nokta oluşturun.
Uygulamayı ayarlamak için aşağıdaki kodu düzenleyiciye yapıştırın. Bu kod gerekli paketleri içeri aktarır, bağlantı noktası ve kasa URI yapılandırmasını ayarlar ve gizli dizi adlarını ve değerlerini tutmak için yeni bir nesne oluşturur.
// 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 = {};
Önemli
Dosyaların üzerinde çalışırken, özellikle de çalışmayı tamamladığınızda dosyaları kaydettiğinizden emin olun. Dosyaları "..." aracılığıyla kaydedebilirsiniz menüsüne veya hızlandırıcı tuşuna (Windows ve Linux'ta Ctrl+S, macOS'ta Cmd+S).
Ardından kasada kimlik doğrulaması yapmak ve gizli dizileri yüklemek için kodu ekleyin. Bu kodu iki ayrı işlev olarak eklersiniz. Daha önce eklediğiniz kodun sonuna birkaç boş satır girin ve sonra aşağıdaki koda yapıştırın.
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) } }
Şimdi de gizli dizimizin yüklenip yüklenmediğini test etmek için Express uç noktasını oluşturun. Bu kodu yapıştırın.
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); });
Kasamızdan gizli dizileri yüklemek için işlevlerinizi çağırın ve ardından uygulamayı başlatın. Uygulamayı tamamlamak için bu son kod parçacığına yapıştırın.
(async () => { await getKeyVaultSecrets(); app.listen(port, () => { console.log(`Server running at http://localhost:${port}`); }); })().catch(err => console.log(err));
Kod yazmayı tamamladınız, artık dosyayı kaydetmeyi unutmayın.
Uygulama çalışmaya hazırdır. Şimdi Azure'a alma zamanı!