Bir kimlik doğrulama kimlik bilgileri kümesi kullanan kaynaklar için gizli dizi döndürmeyi otomatikleştirme

Azure hizmetlerinde kimlik doğrulamanın en iyi yolu yönetilen kimlik kullanmaktır, ancak bunun bir seçenek olmadığı bazı senaryolar vardır. Böyle durumlarda erişim anahtarları veya gizli diziler kullanılır. Erişim anahtarlarını veya gizli dizileri düzenli aralıklarla döndürmeniz gerekir.

Bu öğreticide, tek bir kimlik doğrulama kimlik bilgileri kümesi kullanan veritabanları ve hizmetler için gizli dizilerin düzenli olarak nasıl döndürüldüğünün nasıl otomatikleştirildiğini gösterir. Özellikle, bu öğretici azure Key Vault depolanan SQL Server parolaları Azure Event Grid bildirimiyle tetiklenen bir işlev kullanarak döndürür:

Döndürme çözümü diyagramı

  1. Bir gizli dizinin sona erme tarihinden otuz gün önce Key Vault "süresi dolmak üzere" olayını Event Grid'de yayımlar.
  2. Event Grid olay aboneliklerini denetler ve olaya abone olan işlev uygulaması uç noktasını çağırmak için HTTP POST kullanır.
  3. İşlev uygulaması gizli dizi bilgilerini alır, yeni bir rastgele parola oluşturur ve Key Vault yeni parolayla gizli dizi için yeni bir sürüm oluşturur.
  4. İşlev uygulaması yeni parolayla SQL Server güncelleştirir.

Not

3. ve 4. adımlar arasında bir gecikme olabilir. Bu süre boyunca, Key Vault içindeki gizli dizi SQL Server için kimlik doğrulaması yapamaz. Adımlardan herhangi birinin başarısız olması durumunda Event Grid iki saat boyunca yeniden denenir.

Önkoşullar

Mevcut Key Vault ve SQL Server yoksa şu dağıtım bağlantısını kullanabilirsiniz:

  1. Kaynak grubu'nun altında Yeni oluştur'u seçin. Gruba bir ad verin, bu öğreticide akvrotation kullanıyoruz.
  2. SQL Yönetici Oturum Açma'nın altına SQL yöneticisi oturum açma adı yazın.
  3. Gözden geçir ve oluştur’u seçin.
  4. Oluştur’u seçin

Kaynak grubu oluşturma

Artık bir Key Vault ve bir SQL Server örneğiniz olacak. Aşağıdaki komutu çalıştırarak Bu kurulumu Azure CLI'da doğrulayabilirsiniz:

az resource list -o table -g akvrotation

Sonuç aşağıdaki çıkışta görünür:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation      eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation      eastus      Microsoft.Sql/servers/databases
akvrotation-sql2         akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql2/master  akvrotation      eastus      Microsoft.Sql/servers/databases

SQL server parola döndürme işlevi oluşturma ve dağıtma

Önemli

Bu şablon anahtar kasası, SQL sunucusu ve Azure İşlevinin aynı kaynak grubunda olmasını gerektirir.

Ardından, sistem tarafından yönetilen kimlikle diğer gerekli bileşenlere ek olarak bir işlev uygulaması oluşturun ve SQL Server parola döndürme işlevlerini dağıtın

İşlev uygulaması şu bileşenleri gerektirir:

  • Azure App Service planı
  • OLAY tetikleyicisi ve http tetikleyicisi ile SQL parola döndürme işlevlerine sahip bir İşlev Uygulaması
  • İşlev uygulaması tetikleyici yönetimi için gereken bir depolama hesabı
  • Key Vault'da gizli dizilere erişmek için İşlev Uygulaması kimliğine yönelik bir erişim ilkesi
  • SecretNearExpiry olayı için Event Grid olay aboneliği
  1. Azure şablonu dağıtım bağlantısını seçin:

  2. Kaynak grubu listesinde akvrotation öğesini seçin.

  3. SQL Server Adı'nda, döndürülecek parolayla SQL Server adını yazın

  4. Key Vault Adı alanına anahtar kasasının adını yazın

  5. İşlev Uygulaması Adı alanına işlev uygulamasının adını yazın

  6. Gizli Dizi Adı alanına parolanın depolandığı gizli dizi adını yazın

  7. Depo Url'sine gitHub konumu (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git) işlev kodu yazın

  8. Gözden geçir ve oluştur’u seçin.

  9. Oluştur’u seçin.

Gözden Geçir+oluştur'u seçin

Önceki adımları tamamladıktan sonra bir depolama hesabınız, bir sunucu grubunuz ve bir işlev uygulamanız olur. Aşağıdaki komutu çalıştırarak Bu kurulumu Azure CLI'da doğrulayabilirsiniz:

az resource list -o table -g akvrotation

Sonuç aşağıdaki çıkışa benzer olacaktır:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation       eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation       eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation       eastus      Microsoft.Sql/servers/databases
cfogyydrufs5wazfunctions akvrotation       eastus      Microsoft.Storage/storageAccounts
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/serverFarms
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/sites
akvrotation-fnapp        akvrotation       eastus      Microsoft.insights/components

İşlev uygulaması oluşturma ve Key Vault erişmek için yönetilen kimlik kullanma hakkında bilgi için bkz. Azure portal'den işlev uygulaması oluşturma, App Service ve Azure İşlevleri için yönetilen kimlik kullanma vekullanarak Key Vault erişim ilkesi atama Azure portal.

Döndürme işlevi

Önceki adım işlevinde dağıtılan bir olay, Key Vault ve SQL veritabanını güncelleştirerek gizli dizi döndürmeyi tetikler.

İşlev tetikleyici olayı

Bu işlev olay verilerini okur ve döndürme mantığını çalıştırır:

public static class SimpleRotationEventHandler
{
   [FunctionName("AKVSQLRotation")]
   public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
   {
      log.LogInformation("C# Event trigger function processed a request.");
      var secretName = eventGridEvent.Subject;
      var secretVersion = Regex.Match(eventGridEvent.Data.ToString(), "Version\":\"([a-z0-9]*)").Groups[1].ToString();
      var keyVaultName = Regex.Match(eventGridEvent.Topic, ".vaults.(.*)").Groups[1].ToString();
      log.LogInformation($"Key Vault Name: {keyVaultName}");
      log.LogInformation($"Secret Name: {secretName}");
      log.LogInformation($"Secret Version: {secretVersion}");

      SecretRotator.RotateSecret(log, secretName, keyVaultName);
   }
}

Gizli dizi döndürme mantığı

Bu döndürme yöntemi gizli dizideki veritabanı bilgilerini okur, gizli dizinin yeni bir sürümünü oluşturur ve veritabanını yeni gizli diziyle güncelleştirir:

    public class SecretRotator
    {
		private const string CredentialIdTag = "CredentialId";
		private const string ProviderAddressTag = "ProviderAddress";
		private const string ValidityPeriodDaysTag = "ValidityPeriodDays";

		public static void RotateSecret(ILogger log, string secretName, string keyVaultName)
        {
            //Retrieve Current Secret
            var kvUri = "https://" + keyVaultName + ".vault.azure.net";
            var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
            KeyVaultSecret secret = client.GetSecret(secretName);
            log.LogInformation("Secret Info Retrieved");

            //Retrieve Secret Info
            var credentialId = secret.Properties.Tags.ContainsKey(CredentialIdTag) ? secret.Properties.Tags[CredentialIdTag] : "";
            var providerAddress = secret.Properties.Tags.ContainsKey(ProviderAddressTag) ? secret.Properties.Tags[ProviderAddressTag] : "";
            var validityPeriodDays = secret.Properties.Tags.ContainsKey(ValidityPeriodDaysTag) ? secret.Properties.Tags[ValidityPeriodDaysTag] : "";
            log.LogInformation($"Provider Address: {providerAddress}");
            log.LogInformation($"Credential Id: {credentialId}");

            //Check Service Provider connection
            CheckServiceConnection(secret);
            log.LogInformation("Service  Connection Validated");
            
            //Create new password
            var randomPassword = CreateRandomPassword();
            log.LogInformation("New Password Generated");

            //Add secret version with new password to Key Vault
            CreateNewSecretVersion(client, secret, randomPassword);
            log.LogInformation("New Secret Version Generated");

            //Update Service Provider with new password
            UpdateServicePassword(secret, randomPassword);
            log.LogInformation("Password Changed");
            log.LogInformation($"Secret Rotated Successfully");
        }
}

Kodun tamamını GitHub'da bulabilirsiniz.

Gizli diziyi Key Vault ekleme

Kullanıcılara gizli dizileri yönetme izinleri vermek için erişim ilkenizi ayarlayın:

az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list

SQL Server kaynak kimliğini, SQL Server oturum açma adını ve gün cinsinden gizli dizi için geçerlilik süresini içeren etiketlerle yeni bir gizli dizi oluşturun. GIZLI anahtarın adını ve SQL veritabanından gelen ilk parolayı ("Basit123" örneğimizde) belirtin ve yarın için ayarlanmış bir son kullanma tarihi ekleyin.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyy-MM-ddThh:mm:ssZ")
az keyvault secret set --name sqlPassword --vault-name akvrotation-kv --value "Simple123" --tags "CredentialId=sqlAdmin" "ProviderAddress=<sql-database-resource-id>" "ValidityPeriodDays=90" --expires $tomorrowDate

Kısa bir süre sonu tarihiyle gizli dizi oluşturmak, 15 dakika içinde bir SecretNearExpiry olay yayımlar ve bu da işlevin gizli diziyi döndürmesini tetikler.

Test etme ve doğrulama

Gizli dizinin döndürüldüğünü doğrulamak için Key Vault>Secrets bölümüne gidin:

Key Vault Gizli Dizilere > nasıl erişildiğini gösteren ekran görüntüsü.

sqlPassword gizli dizisini açın ve özgün ve döndürülmüş sürümleri görüntüleyin:

Gizli Diziler'e gidin

Web uygulaması oluşturma

SQL kimlik bilgilerini doğrulamak için bir web uygulaması oluşturun. Bu web uygulaması gizli diziyi Key Vault alır, gizli diziden SQL veritabanı bilgilerini ve kimlik bilgilerini ayıklar ve SQL Server bağlantısını test eder.

Web uygulaması şu bileşenleri gerektirir:

  • Sistem tarafından yönetilen kimliğe sahip bir web uygulaması
  • Web uygulaması tarafından yönetilen kimlik aracılığıyla Key Vault gizli dizilere erişmek için erişim ilkesi
  1. Azure şablonu dağıtım bağlantısını seçin:

  2. akvrotation kaynak grubunu seçin.

  3. SQL Server Adı'nda, döndürülecek parolayla SQL Server adını yazın

  4. Key Vault Adı alanına anahtar kasasının adını yazın

  5. Gizli Dizi Adı alanına parolanın depolandığı gizli dizi adını yazın

  6. Depo Url'sine GitHub konumu (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git) web uygulaması kodu yazın

  7. Gözden geçir ve oluştur’u seçin.

  8. Oluştur’u seçin.

Web uygulamasını açma

Dağıtılan uygulama URL'sine gidin:

'https://akvrotation-app.azurewebsites.net/'

Uygulama tarayıcıda açıldığında Oluşturulan Gizli Dizi Değeri'ni ve Veritabanı Bağlı değerini true olarak görürsünüz.

Daha fazla bilgi edinin