أتمتة دوران البيانات السرية للموارد التي تستخدم مجموعة من بيانات اعتماد المصادقة

تتمثل أفضل طريقة للمصادقة على خدمات Azure في استخدام هوية مدارة، ولكن تتوافر بعض السيناريوهات التي لا تُشكل خيارًا. في هذه الحالات، تُستخدم مفاتيح الوصول أو الأسرار. ينبغي تدوير مفاتيح الوصول أو الأسرار بشكل دوري.

يوضح هذا البرنامج التعليمي كيفية أتمتة التدوير الدوري للبيانات السرية لقواعد البيانات والخدمات التي تستخدم مجموعة من بيانات اعتماد المصادقة. على وجه التحديد، يقوم هذا البرنامج التعليمي بتدوير كلمات المرور SQL Server المخزنة في Azure Key Vault باستخدام دالة تم تشغيلها من خلال إعلام Azure Event Grid:

مخطط حل الدوران

  1. ينشر Key Vault، قبل ثلاثين يومًا من تاريخ انتهاء صلاحية أي بيانات سرية، حدثًا أوشك على انتهاء صلاحيته إلى شبكة الحدث.
  2. تقوم شبكة الأحداث بفحص اشتراكات الحدث وتستخدم HTTP POST لطلب نقطة نهاية تطبيق الدالة المشتركة في الحدث.
  3. يتلقى تطبيق الوظائف معلومات سرية، يولد كلمة مرور عشوائية جديدة، ويخلق نسخة جديدة للسر مع كلمة المرور الجديدة في Key Vault.
  4. يعمل SQL Server على تحديث تطبيق الوظيفة بكلمة المرور الجديدة.

إشعار

قد يوجد فارق زمني بين الخطوتين 3 و4. خلال ذلك الوقت، لن يتمكن السر في Key Vault من المصادقة على SQL Server. في حالة فشل أيّ من الخطوات، إعادة محاولة شبكة الأحداث لمدة ساعتين.

المتطلبات الأساسية

إذا لم يكن لديك Key Vault وSQL Server موجودان، يمكنك استخدام ارتباط النشر هذا:

صورة تعرض زر بعنوان «النشر في Azure».

  1. ضمن ⁧⁩Resource group⁦⁩⁧⁩، اختر ⁧⁩Create new⁧⁩. حدد اسمًا للمجموعة، ونحن نستخدم akvrotation في هذا البرنامج التعليمي.
  2. ضمن تسجيل دخول مسؤول SQL، اكتب اسم تسجيل دخول مسؤول SQL.
  3. حدد "Review + create".
  4. حدد إنشاء.

إنشاء مجموعة موارد

سيكون لديك الآن key vault ومثيل SQL Server. يمكنك التحقق من هذا الإعداد في Azure CLI عن طريق تشغيل الأمر التالي:

az resource list -o table -g akvrotation

سوف تبدو النتيجة شيء الإخراج على النحو التالي:

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 ونشرها

هام

يتطلب هذا القالب أن يكون مخزن المفاتيح وخادم SQL وAzure Function في نفس مجموعة الموارد.

بعد ذلك، قم بإنشاء تطبيق دالة بهوية مدارة من قبل النظام، بالإضافة إلى المكونات المطلوبة الأخرى، ونشر وظائف تدوير كلمة مرور خادم SQL

يتطلب تطبيق الوظيفة وجود تلك المكونات:

  • خطة خدمة تطبيق Azure
  • تطبيق دالة مع وظائف تدوير كلمة مرور SQL مع مشغل الحدث ومشغل http
  • حساب تخزين مطلوب لإدارة مشغل تطبيق الوظائف
  • نهج وصول لهوية تطبيق الوظيفة للوصول إلى الأسرار في Key Vault
  • اشتراك حدث Event Grid لحدث SecretNearExpiry
  1. حدد رابط توزيع قالب Azure:

    صورة تعرض زر بعنوان «النشر في Azure».

  2. في قائمة مجموعة الموارد، حدد akvrotation.

  3. في SQL Server Name، اكتب اسم SQL Server مع كلمة المرور للتدوير

  4. في اسم خزنة المفاتيح، اكتب اسم خزنة المفاتيح

  5. في اسم تطبيق الوظائف، اكتب اسم تطبيق الوظائف

  6. في اسم البيانات السرية، اكتب اسم البيانات السرية حيث سيتم تخزين كلمة المرور

  7. في عنوان Url Repo، اكتب رمز الدالة GitHub الموقع (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. حدد "Review + create".

  9. حدد إنشاء.

حدد مراجعة + إنشاء

بعد إكمال الخطوات السابقة، سيكون لديك حساب تخزين وكتلة خوادم وتطبيق دالة. يمكنك التحقق من هذا الإعداد في Azure CLI عن طريق تشغيل الأمر التالي:

az resource list -o table -g akvrotation

سوف تبدو النتيجة شيء الإخراج على النحو التالي:

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

لمعرفة معلومات حول كيفية إنشاء تطبيق دالة واستخدام الهوية المدارة للوصول إلى Key Vault، راجع إنشاء تطبيق دالة من مدخل Azure، وكيفية استخدام الهوية المدارة لخدمة التطبيقات ووظائف Azure، وتعيين نهج وصول إلى مفتاح Vault باستخدام مدخل Azure.

دالة الدوران

يستخدم نشر في وظيفة الخطوة السابقة حدث لتشغيل دوران سر بتحديث Key Vault وقاعدة بيانات SQL.

حدث تشغيل الدالة

تقرأ هذه الدالة بيانات الحدث وتشغل منطق الاستدارة:

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);
   }
}

منطق الدوران السري

يقرأ هذا الأسلوب دوران معلومات قاعدة البيانات من السر، ويصدر نسخة جديدة من السر، وتحديث قاعدة البيانات مع سر جديد:

    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");
        }
}

يمكنك العثور على التعليمات البرمجية الكاملة على GitHub.

إضافة السر إلى Key Vault

تعيين نهج الوصول لمنح أذونات إدارة البيانات السريةإلى المستخدمين:

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

إنشاء سر جديد مع العلامات التي تحتوي على معرف المورد SQL Server واسم تسجيل الدخول SQL Server وفترة صلاحية السر في غضون أيام. توفير اسم كلمة المرور السرية الأولية من قاعدة بيانات SQL (في مثالنا "Simple123") وتضمين تاريخ انتهاء الصلاحية الذي تم تعيينه للغد.

$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

يؤدي إنشاء سر بتاريخ انتهاء صلاحية قصير إلى نشر SecretNearExpiry حدث في غضون 15 دقيقة، مما سيؤدي بدوره إلى تشغيل الدالة لتدوير السر.

الاختبار والتحقق

للتحقق من استدار السر، انتقل إلى Key Vault>Secrets:

لقطة شاشة توضح كيفية الوصول إلى Key Vault > Secrets.

افتح سر sqlPassword مع عرض الإصدارات الأصلية والمدورة:

انتقل إلى الأسرار

أنشئ تطبيق ويب

للتحقق من بيانات اعتماد SQL، أنشئ تطبيق ويب. هذا التطبيق على شبكة الإنترنت سوف تحصل على سر من Key Vault، واستخراج SQL معلومات قاعدة البيانات وبيانات الاعتماد من السر، واختبار الاتصال SQL Server.

يتطلب تطبيق الويب وجود تلك المكونات:

  • لتطبيق الويب هوية مدارة من خلال النظام
  • نهج وصول إلى بالبيانات السرية للوصول في Key Vault عبر الهوية المدارة لتطبيق الويب
  1. حدد رابط توزيع قالب Azure:

    صورة تعرض زر بعنوان «النشر في Azure».

  2. حدد مجموعة موارد akvrotation.

  3. في SQL Server Name، اكتب اسم SQL Server مع كلمة المرور للتدوير

  4. في اسم خزنة المفاتيح، اكتب اسم خزنة المفاتيح

  5. في اسم البيانات السرية، اكتب اسم البيانات السرية حيث يتم تخزين كلمة المرور

  6. في عنوان Url Repo، اكتب رمز تطبيق ويب GitHub الموقع (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. حدد "Review + create".

  8. حدد إنشاء.

افتح تطبيق الويب

التحقق من صحة التطبيق المنشور URL:

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

عند فتح التطبيق في المستعرض، سترى القيمة السرية التي تم إنشاؤها وقيمة Generated Secret Valueمن true.

معرفة المزيد