أتمتة دوران البيانات السرية للموارد التي تستخدم مجموعة من بيانات اعتماد المصادقة
تتمثل أفضل طريقة للمصادقة على خدمات Azure في استخدام هوية مدارة، ولكن تتوافر بعض السيناريوهات التي لا تُشكل خيارًا. في هذه الحالات، تُستخدم مفاتيح الوصول أو الأسرار. ينبغي تدوير مفاتيح الوصول أو الأسرار بشكل دوري.
يوضح هذا البرنامج التعليمي كيفية أتمتة التدوير الدوري للبيانات السرية لقواعد البيانات والخدمات التي تستخدم مجموعة من بيانات اعتماد المصادقة. على وجه التحديد، يقوم هذا البرنامج التعليمي بتدوير كلمات المرور SQL Server المخزنة في Azure Key Vault باستخدام دالة تم تشغيلها من خلال إعلام Azure Event Grid:
- ينشر Key Vault، قبل ثلاثين يومًا من تاريخ انتهاء صلاحية أي بيانات سرية، حدثًا أوشك على انتهاء صلاحيته إلى شبكة الحدث.
- تقوم شبكة الأحداث بفحص اشتراكات الحدث وتستخدم HTTP POST لطلب نقطة نهاية تطبيق الدالة المشتركة في الحدث.
- يتلقى تطبيق الوظائف معلومات سرية، يولد كلمة مرور عشوائية جديدة، ويخلق نسخة جديدة للسر مع كلمة المرور الجديدة في Key Vault.
- يعمل SQL Server على تحديث تطبيق الوظيفة بكلمة المرور الجديدة.
إشعار
قد يوجد فارق زمني بين الخطوتين 3 و4. خلال ذلك الوقت، لن يتمكن السر في Key Vault من المصادقة على SQL Server. في حالة فشل أيّ من الخطوات، إعادة محاولة شبكة الأحداث لمدة ساعتين.
المتطلبات الأساسية
- اشتراك Azure - إنشاء اشتراك مجاناً.
- Azure Key Vault
- SQL Server
إذا لم يكن لديك Key Vault وSQL Server موجودان، يمكنك استخدام ارتباط النشر هذا:
- ضمن Resource group، اختر Create new. حدد اسمًا للمجموعة، ونحن نستخدم akvrotation في هذا البرنامج التعليمي.
- ضمن تسجيل دخول مسؤول SQL، اكتب اسم تسجيل دخول مسؤول SQL.
- حدد "Review + create".
- حدد إنشاء.
سيكون لديك الآن 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
حدد رابط توزيع قالب Azure:
في قائمة مجموعة الموارد، حدد akvrotation.
في SQL Server Name، اكتب اسم SQL Server مع كلمة المرور للتدوير
في اسم خزنة المفاتيح، اكتب اسم خزنة المفاتيح
في اسم تطبيق الوظائف، اكتب اسم تطبيق الوظائف
في اسم البيانات السرية، اكتب اسم البيانات السرية حيث سيتم تخزين كلمة المرور
في عنوان Url Repo، اكتب رمز الدالة GitHub الموقع (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
حدد "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، راجع إنشاء تطبيق دالة من مدخل 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:
افتح سر sqlPassword مع عرض الإصدارات الأصلية والمدورة:
أنشئ تطبيق ويب
للتحقق من بيانات اعتماد SQL، أنشئ تطبيق ويب. هذا التطبيق على شبكة الإنترنت سوف تحصل على سر من Key Vault، واستخراج SQL معلومات قاعدة البيانات وبيانات الاعتماد من السر، واختبار الاتصال SQL Server.
يتطلب تطبيق الويب وجود تلك المكونات:
- لتطبيق الويب هوية مدارة من خلال النظام
- نهج وصول إلى بالبيانات السرية للوصول في Key Vault عبر الهوية المدارة لتطبيق الويب
حدد رابط توزيع قالب Azure:
حدد مجموعة موارد akvrotation.
في SQL Server Name، اكتب اسم SQL Server مع كلمة المرور للتدوير
في اسم خزنة المفاتيح، اكتب اسم خزنة المفاتيح
في اسم البيانات السرية، اكتب اسم البيانات السرية حيث يتم تخزين كلمة المرور
في عنوان Url Repo، اكتب رمز تطبيق ويب GitHub الموقع (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
حدد "Review + create".
حدد إنشاء.
افتح تطبيق الويب
التحقق من صحة التطبيق المنشور URL:
'https://akvrotation-app.azurewebsites.net/'
عند فتح التطبيق في المستعرض، سترى القيمة السرية التي تم إنشاؤها وقيمة Generated Secret Valueمن true.
معرفة المزيد
- البرنامج التعليمي: تناوب للموارد مع مجموعتين من أوراق الاعتماد
- نظرة عامة: مراقبة Key Vault من خلال Azure Event Grid
- كيفية القيام بما يلي:استلام البريد الإلكتروني عند تغيير البيانات السرية لتطبيق Key Vault
- مخطط أحداث Azure Event Grid بالنسبة Azure Key Vault