Kimlik doğrulama bilgileri kümesini kullanan kaynaklar için gizli anahtarın döndürülmesini otomatikleştirme

Azure hizmetlerinde kimlik doğrulamanın en iyi yolu yönetilen kimliktir, ancak bazı senaryolarda erişim anahtarı, parola veya başka bir gizli dizi gerekir. Sızdırılmış bir kimlik bilgisinin etkisini azaltmak için bu gizli anahtarları düzenli olarak yenileyin.

Bu öğretici, tek bir kimlik doğrulama bilgisi kümesi kullanan veritabanları ve hizmetler için periyodik gizli bilgi döndürmenin nasıl otomatikleştirileceğini gösterir. Farklı varlık türleri arasında otomatik döndürmeye genel bakış için bkz. Azure Key Vault'de otomatik döndürmeyi anlama.

Özellikle bu öğretici, Azure Event Grid bildirimiyle tetiklenen bir işlev kullanarak Azure Key Vault'ta depolanan bir SQL Server parolasını döndürür:

İpucu

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği için SQL oturum açma işlemleri yerine yalnızca Microsoft Entra kimlik doğrulamasını tercih edin. Bu öğreticideki parola döndürme desenini yalnızca bir iş yükü SQL kimlik doğrulaması gerektirdiğinde kullanın.

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

  1. Key Vault, bir gizli verinin son kullanma tarihinden otuz gün öncesinde Event Grid'e "süresi dolmak üzere" olayını 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.

Uyarı

3. ve 4. adımlar arasında bir gecikme olabilir. Bu süre zarfında, Key Vault’taki gizli anahtar SQL Server’da kimlik doğrulaması yapamaz. Herhangi bir adım başarısız olursa Event Grid iki saat boyunca yeniden denenir.

Önkoşullar

Henüz bir anahtar kasanız ve SQL Server örneğiniz yoksa şu dağıtım bağlantısını kullanın:

Azure'a Dağıt” etiketli bir düğmeyi gösteren görüntü.

  1. Kaynak grubu'nun altında Yeni oluştur'u seçin ve gruba bir ad verin. Bu öğreticide akvrotation kullanılır.
  2. SQL Yöneticisi Oturum Açma'nın altına SQL yöneticisi oturum açma adını girin.
  3. Seçin, gözden geçir ve oluştur.
  4. Oluştur'i seçin.

Kaynak grubu oluşturma

Artık bir anahtar kasanız ve bir SQL Server örneğiniz var. Bu kurulumu Azure CLI'da doğrulayın:

az resource list -o table -g akvrotation

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

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şlevini oluşturma ve dağıtma

Önemli

Bu şablon anahtar kasasının, SQL Server örneğinin ve işlev uygulamasının aynı kaynak grubunda olmasını gerektirir.

Ardından, sistem tarafından atanan yönetilen kimlikle birlikte gerekli diğer bileşenlerle birlikte bir işlev uygulaması oluşturun ve SQL Server parola döndürme işlevini dağıtın.

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

  • bir Azure App Service planı.
  • Event Grid tetikleyicisi ve HTTP tetikleyicisi olan SQL parola döndürme işlevine sahip bir işlev uygulaması.
  • İşlev uygulaması tetikleyici yönetimi için bir depolama hesabı.
  • İşlev uygulaması kimliğinin Anahtar Kasası’ndaki gizli anahtarlara erişmesini sağlayan Azure rol ataması.
  • SecretNearExpiry olayı için Event Grid etkinlik aboneliği.
  1. Azure şablonu dağıtım bağlantısını seçin:

    Azure'a Dağıt” etiketli bir düğmeyi gösteren görüntü.

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

  3. SQL Server Adı alanına, parolasını döndürmek istediğiniz SQL Server örneğinin adını girin.

  4. Key Vault Adı alanına key vault adını girin.

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

  6. Secret Name alanına, parolanın depolandığı gizli dizi adını girin.

  7. Depo URL'sinde işlev kodunun GitHub konumunu girin: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Seçin, gözden geçir ve oluştur.

  9. Oluştur'i seçin.

Uyarı

Bu ARM şablonu, işlevin kodunu GitHub’dan çekmek için App Service kaynak denetimi (Kudu) dağıtımını kullanır. Üretim iş yükleri için bunun yerine func azure functionapp publish veya WEBSITE_RUN_FROM_PACKAGE ile zip dağıtımı gibi paket tabanlı bir dağıtım öneririz.

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

Önceki adımları tamamladıktan sonra bir depolama hesabınız, sunucu grubunuz ve bir işlev uygulamanız olur. Azure CLI’da bu yapılandırmayı doğrulayın:

az resource list -o table -g akvrotation

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

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 daha fazla bilgi için bkz. Azure portalından işlev uygulaması oluşturma, App Service ve Azure İşlevleri için yönetilen kimlik kullanma veAzure RBAC ile Key Vault erişimi sağlama.

Uyarı

Örnek işlev, Azure İşlevleri için .NET işlem içi modelini hedefler. Yeni geliştirmeler için, bundan sonra desteklenen model olan .NET yalıtılmış çalışan modelini kullanın.

Döndürme işlevi

Önceki adımda dağıtılan işlev, gizli dizi döndürmeyi tetikleyen bir olay kullanır. Key Vault ve SQL veritabanını güncelleştirir.

İş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 üzerinde bulabilirsiniz.

Gizli bilgiyi Key Vault'a ekleyin

Kasadaki gizli dizileri yönetebilmeniz için kendinize Key Vault Gizli Diziler Sorumlusu rolünü atayın:

az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/akvrotation-kv

SQL Server kaynak kimliğini, SQL Server oturum açma adını ve gün cinsinden geçerlilik süresini içeren etiketlerle bir gizli bilgi oluşturun. Gizli adını, SQL veritabanındaki başlangıç parolasını (bu örnekte Simple123) ve rotasyonun hemen tetiklenmesi için son kullanma tarihini yarın olarak ayarlayın.

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
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 geçerlilik süresi ayarlamak, 15 dakika içinde bir SecretNearExpiry olayı yayınlar; bu da fonksiyonun gizli anahtarı yenilemesini tetikler.

Test edin ve doğrulayın

Gizli anahtarın yenilendiğini doğrulamak için Key Vault>Secrets bölümüne gidin:

>

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ştur

SQL kimlik bilgilerini doğrulamak için bir web uygulaması oluşturun. Web uygulaması gizli anahtarı Key Vault’tan alır, gizli anahtardan SQL veritabanına ilişkin bilgileri ve kimlik bilgilerini çıkarır ve SQL Server’a bağlantıyı test eder.

Web uygulaması şu bileşenleri gerektirir:

  • Sistem tarafından atanan yönetilen kimliğe sahip bir web uygulaması.
  • Web uygulamasının yönetilen kimliğinin Anahtar Kasası'ndaki gizli anahtarları okumasına izin veren rol ataması.
  1. Azure şablonu dağıtım bağlantısını seçin:

    Azure'a Dağıt” etiketli bir düğmeyi gösteren görüntü.

  2. akvrotation kaynak grubunu seçin.

  3. SQL Server Adı alanına, parolasını döndürdüğünüz SQL Server adını girin.

  4. Key Vault Adı alanına key vault adını girin.

  5. Secret Name alanına, parolayı depolayan gizli anahtarın adını girin.

  6. Depo URL'sinde web uygulaması kodunun GitHub konumunu girin: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.

  7. Seçin, gözden geçir ve oluştur.

  8. Oluştur'i 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, sayfada Oluşturulan Gizli Değer ve Veritabanı Bağlantısı değeri true gösterilir.

Veritabanınızın döndürme işlevini özelleştirmek için yapay zekayı kullanma

Bu öğreticide SQL Server için gizli bilgilerin döndürülmesi açıklanmaktadır, ancak bu döndürme işlevini diğer veritabanı türlerine uyarlayabilirsiniz. GitHub Copilot, döndürme işlevi kodunu veritabanınızla veya kimlik bilgileri türünüzle çalışacak şekilde değiştirmenize yardımcı olabilir.

I'm using the Azure Key Vault secret rotation tutorial for SQL Server. Help me modify the rotation function to work with PostgreSQL instead. The function should:
1. Generate a new secure password
2. Update the PostgreSQL database user password
3. Store the new password in Key Vault
Show me the changes needed to the C# function code, including the correct PostgreSQL connection library and password update command.

Copilot bu düzeni API anahtarları, bağlantı dizeleri veya hizmet hesabı parolaları gibi diğer kimlik bilgileri türleri için uyarlamanıza da yardımcı olabilir.

GitHub Copilot yapay zeka ile desteklendiğinden sürprizler ve hatalar mümkündür. Daha fazla bilgi için Copilot Sıkça Sorulan Sorular'a bakın.

Daha fazla bilgi edinin