Aracılığıyla paylaş


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 managed identity kullanmaktır, ancak bunun bir seçenek olmadığı bazı senaryolar vardır. Böyle durumlarda erişim anahtarları veya gizli anahtarlar kullanılır. Erişim anahtarlarını veya gizli dizileri düzenli aralıklarla döndürmeniz gerekir.

Bu öğretici, veritabanları ve hizmetler için tek bir kimlik doğrulama kimlik bilgisi kümesi kullanarak sırların periyodik olarak döndürülmesi süreçlerini otomatikleştirmeyi göstermektedir. Farklı varlık türleri genelinde otomatik döndürme kavramlarına ve avantajlarına kapsamlı bir genel bakış için bkz. Azure Key Vault'da otomatik döndürmeyi anlama.

Özellikle, bu öğretici Azure Event Grid bildirimi tarafından tetiklenen bir işlev kullanarak Azure Key Vault'da depolanan SQL Server parolaları döndürür:

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 boyunca, Key Vault'taki gizli anahtar SQL Server'a 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:

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. Gruba bir ad verin, bu öğreticide akvrotation kullanıyoruz.
  2. SQL Yöneticisi Oturum Açma'nın altına SQL yöneticisi oturum açma adı yazın.
  3. Seçin, gözden geçir ve oluştur.
  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 doğrulayabilirsiniz:

az resource list -o table -g akvrotation

Sonuç, aşağıdaki gibi bir çıktı olarak görünecek:

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 server ve Azure İşlevinin aynı kaynak grubunda olmasını gerektirir.

Ardından, sistem tarafından yönetilen bir 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'taki gizli bilgilere erişmek için işlev uygulaması kimliğine Azure RBAC rol ataması yapılması
  • 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ı için döndürmek amacıyla parolayı da içeren SQL Server adını yazın.

  4. Key Vault Name alanına key vault adını yazın

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

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

  7. Repo Url bölümüne işlev kodu GitHub konum (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git) yazın

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

  9. Oluştur'i 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 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

Fonksiyon uygulaması oluşturma ve yönetilen kimliği kullanarak Key Vault'a erişim hakkında bilgi için, bkz. Azure portalından fonksiyon uygulaması oluşturma, App Service ve Azure İşlevleri için yönetilen kimliğin nasıl kullanılacağı ve Azure RBAC ile Key Vault erişimi sağlama.

Döndürme işlevi

Önceki adımda dağıtılan işlev, Key Vault ve SQL veritabanını güncelleyerek bir olaydan yararlanarak gizli dizi döndürme işlemini başlatır.

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

Kullanıcılara sırları yönetme izni vermek için erişim ilkenizi ayarlayı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 gizli dizi için geçerlilik süresini içeren etiketlerle yeni bir gizli dizi oluşturun. Gizli anahtarın adını, SQL veritabanındaki ilk parolayı ("Simple123" örneğimizde) belirtin ve yarın için ayarlanmış bir son kullanma tarihi ekleyin.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-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 son kullanma 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 edin ve doğrulayın

Gizliliğin döndüğünü doğrulamak için Key Vault>Secrets bölümüne gidin.

Key Vault Sırlarına nasıl erişileceğ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ştur

SQL kimlik bilgilerini doğrulamak için bir web uygulaması oluşturun. Bu web uygulaması Key Vault'tan gizliyi alacak, gizliden SQL veritabanı bilgilerini ve kimlik bilgilerini ayıklayacak ve SQL Server bağlantısını test edecek.

Web uygulaması şu bileşenleri gerektirir:

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

  2. akvrotation kaynak grubunu seçin.

  3. SQL Server Adı'nı yazın, ardından döndürülecek parolayı girin.

  4. Key Vault Name alanına key vault adını yazın

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

  6. Repo Url bölümüne web uygulaması kodu GitHub konum (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git) yazın

  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 Oluşturulan Gizli Dizi Değeri'ni ve Veritabanı Bağlı değerini true olarak görürsünüz.

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. VS Code'daki GitHub Copilot, döndürme işlevi kodunu belirli veritabanınızla veya kimlik bilgisi 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