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

Azure hizmetlerinde kimlik doğrulaması yapmanın en iyi yolu yönetilen bir kimlikkullanmaktır, ancak bir seçenek olmadığı durumlarda bazı senaryolar vardır. Bu durumlarda, erişim anahtarları veya gizli dizileri kullanılır. Erişim anahtarlarını veya gizli dizileri düzenli olarak döndürmelisiniz.

Bu öğreticide, tek bir kimlik doğrulama kimlik bilgileri kümesi kullanan veritabanları ve hizmetler için düzenli aralıklarla yapılan gizli dizi döndürmenin nasıl otomatikleştirdiği gösterilmektedir. Özellikle, bu öğretici Azure Event Grid bildirimi tarafından tetiklenen bir işlev kullanılarak Azure Key Vault depolanan SQL Server parolalarını döndürür:

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

  1. Bir parolanın süre sonu tarihinden otuz gün önce, Key Vault Event Grid "sona erme" olayını yayınlar.
  2. Event Grid olay aboneliklerini denetler ve olaya abone olan işlev uygulama uç noktasını çağırmak için HTTP POST kullanır.
  3. İşlev uygulaması gizli bilgileri 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ı güncelleştirmeleri yeni parolayla SQL Server.

Not

3 ve 4. adımlar arasında bir gecikme olabilir. Bu süre boyunca Key Vault gizli dizi SQL Server kimlik doğrulaması yapamaz. Adımların hiçbirinde hata olması durumunda iki saat boyunca yeniden denemeler Event Grid.

Önkoşullar

Mevcut Key Vault ve SQL Server yoksa dağıtım bağlantısı aşağıdaki şekilde kullanılabilir:

"Azure 'a dağıt" etiketli bir düğmeyi gösteren resim.

  1. Kaynak grubu altında Yeni oluştur' u seçin. Gruba bir ad verin, bu öğreticide akvrotation kullanıyoruz.
  2. SQL Yöneticisi oturum açma bölümünde SQL yönetici 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 Key Vault ve SQL Server bir örnek vardır. Aşağıdaki komutu çalıştırarak bu kurulumu Azure CLı 'da doğrulayabilirsiniz:

az resource list -o table -g akvrotation

Sonuç aşağıdaki çıktıyı görü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

Aşağıdaki şablon Key Vault, SQL Server ve Azure Işlevinin aynı kaynak grubunda olmasını gerektirir

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

İşlev uygulaması bu bileşenleri gerektirir:

  • Azure App Service planı
  • Olay tetikleyicisi ve http tetikleyicisi ile SQL parola döndürme işlevleri ile İşlev Uygulaması
  • İşlev uygulaması tetikleyici yönetimi için gerekli bir depolama hesabı
  • Key Vault gizli dizileri erişmek için İşlev Uygulaması kimlik erişimi ilkesi
  • Secretyaklaştığında süre sonu olayı Için eventgrid olay aboneliği
  1. Azure şablonu dağıtım bağlantısını seçin:

    "Azure 'a dağıt" etiketli bir düğmeyi gösteren resim.

  2. Kaynak grubu listesinde, akvdönüşü' ni seçin.

  3. SQL Server adı' nda, döndürmek için parola Ile SQL Server adını yazın

  4. Key Vault adına, Anahtar Kasası adını yazın

  5. İşlev uygulaması adına, işlev uygulama adını yazın

  6. Gizli dizi adında parolanın depolanacağı gizli adı yazın

  7. Depo URL 'si içinde, Işlev kodu GitHub Location () yazın https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git

  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

Yukarıdaki adımları tamamladıktan sonra bir depolama hesabınız, sunucu grubunuz ve bir işlev uygulamanız olacaktır. Aşağıdaki komutu çalıştırarak bu kurulumu Azure CLı 'da doğrulayabilirsiniz:

az resource list -o table -g akvrotation

Sonuç aşağıdaki çıktıya benzer bir şekilde görünecektir:

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

Bir işlev uygulaması oluşturma ve Key Vault erişmek için yönetilen kimlik kullanma hakkında bilgi için, bkz. Azure Portal bir işlev uygulaması oluşturma, App Service ve Azure işlevleri için yönetilen kimlik kullanmave Azure Portal kullanarak bir Key Vault erişim ilkesi atama.

Döndürme işlevi

Önceki adımda dağıtılan işlevi, Key Vault ve SQL veritabanını güncelleştirerek bir gizli dizi dönüşü tetiklemek için bir olay kullanı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 anahtar döndürme mantığı

Bu döndürme yöntemi, gizli dizi veritabanı bilgilerini okur, gizliliğin yeni bir sürümünü oluşturur ve veritabanını yeni gizli anahtar ile 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");
        }
}

Tüm kodu GitHub' da bulabilirsiniz.

Gizli dizi Key Vault ekleyin

Kullanıcılara gizli dizi 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

Gizli dizi için SQL Server kaynak KIMLIĞI, SQL Server oturum açma adı ve geçerlilik süresi içeren etiketlerle yeni bir gizli dizi oluşturun. SQL veritabanından gizli, başlangıç parolasının adını sağlayın (örneğimizde "Simple123") ve yarın için ayarlanmış bir sona erme 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 süre sonu tarihi ile bir gizli dizi oluşturmak SecretNearExpiry , 15 dakika içinde bir olay yayımlar, bu da işlevi parolayı döndürmek için tetikler.

Test ve doğrulama

Gizli dizinin döndürülmeyeceğini doğrulamak için Key Vault > gizli dizi sayfasına gidin:

Key Vault > gizliliklerin nasıl erişebileceğini gösteren ekran görüntüsü.

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

Gizli anahtarlara git

Web uygulaması oluşturma

SQL kimlik bilgilerini doğrulamak için bir Web uygulaması oluşturun. Bu Web uygulaması Key Vault parolayı alacak, SQL veritabanı bilgilerini ve kimlik bilgilerini gizli listeden ayıklayarak SQL Server bağlantısını test edecektir.

Web uygulaması şu bileşenleri gerektirir:

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

    "Azure 'a dağıt" etiketli bir düğmeyi gösteren resim.

  2. Akvrotation kaynak grubunu seçin.

  3. SQL Server adı' nda, döndürmek için parola Ile SQL Server adını yazın

  4. Key Vault adına, Anahtar Kasası adını yazın

  5. Gizli dizi adında parolanın depolandığı gizli adı yazın

  6. Depo URL'sinde, Web uygulaması kodu GitHub konumu ( https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git ) yazın

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

  8. Oluştur’u seçin.

Web uygulamasını açın

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

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

Uygulama tarayıcıda açıldığında, oluşturulan gizli değeri ve bir veritabanı bağlı değeri true olarak görürsünüz.

Daha fazla bilgi edinin