Alıştırma - Azure Key Vault’ta depolanan gizli dizilere erişme

Tamamlandı

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 GetList 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

  1. 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 .
    
  2. 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 .

  1. Uygulamanın başlatılması için aşağıdaki komutu girerek düzenleyiciyi başlatın.

    code .
    
  2. öğ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ız AddAzureKeyVault öğedir.

  3. Denetleyici için klasöründe adlı SecretTestController.csyeni bir dosya Controllers 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ın touch 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!");
                }
            }
        }
    }
    
  4. 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.

  1. 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).

  2. 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)
      }
    }
    
  3. Ş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);
    });
    
  4. 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));
    
  5. Kod yazmayı tamamladınız, artık dosyayı kaydetmeyi unutmayın.

Uygulama çalışmaya hazırdır. Şimdi Azure'a alma zamanı!