مشاركة عبر


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

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

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

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

رسم تخطيطي لحل التدوير

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

ملاحظة

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

المتطلبات

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

صورة تعرض زرا باسم

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

    صورة تعرض زرا باسم

  2. في قائمة Resource group ، حدد akvrotation.

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

  4. في Key Vault Name، اكتب اسم key vault

  5. في Function App Name، اكتب اسم تطبيق الدالة

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

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

  8. حدد "Review + create".

  9. حدد إنشاء.

حدد Review+create

بعد إكمال الخطوات السابقة، سيكون لديك حساب تخزين ومزرعة خوادم والتطبيق الوظيفي. يمكنك التحقق من هذا الإعداد في 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، راجع إنشاء تطبيق دالة من مدخل Microsoft Azure، وكيفية استخدام الهوية المدارة لخدمة التطبيقات ووظائف Azure، وتعيين نهج الوصول إلى Key Vault باستخدام مدخل Microsoft 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:

    صورة تعرض زرا باسم

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

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

  4. في Key Vault Name، اكتب اسم key vault

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

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

  7. حدد "Review + create".

  8. حدد إنشاء.

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

انتقل إلى عنوان URL للتطبيق المنشور:

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

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

معرفة المزيد