إعداد مبدئ الخدمة في Azure: دليل الوصول غير المراقب

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

I know what you’re thinking – “that is a horrible idea”. Of course, it is! And for sure, your IT Sec will give you a lot of grief if you did all that.

ولكن ما هو البديل؟ كيف يمكنك استخدام اعتماد مميز ذو نطاق محدود ولا يحتاج إلى استثنائه من المصادقة المتعددة العوامل؟ لديك الحظ لأن هذا هو ما ستتعلمه من هذه المقالة.

في هذه المقالة، ستتعرف على مفهوم مبدأ الخدمة في Azure. ستتعلم كيفية إنشاء مبادئ الخدمة بأنواع مختلفة من بيانات الاعتماد، مثل كلمات المرور والمفاتيح السرية والشهادات.

هناك العديد من الأدوات لإنشاء مبادئ الخدمة في Azure. تشمل هذه استخدام بوابة Azure، مركز إدارة Azure Active Directory، Azure AD PowerShell، Azure CLI، و Azure PowerShell. الأداة التي ستكون محور هذه المقالة هي Azure PowerShell.

ما زلت مهتمًا؟ استمر في القراءة ولنبدأ!

المتطلبات

نظرًا لأن هذه المقالة هي مقالة تعلم عن طريق القيام ، فإليك بعض المتطلبات الأساسية حتى تتمكن من متابعة العملية.

حساب الخدمة الأمثل في Azure مقابل حساب الخدمة

. غالبًا ما تحتاج أدوات التشغيل الآلي والنصوص إلى وصول مسؤولي أو ممتلكات. مثل توفير حسابات التخزين أو بدء تشغيل وإيقاف تشغيل الأجهزة الظاهرية وفقًا لجدول زمني. وربما يستخدم معظم المسؤولين حساب مستخدم ممتلك بالكامل (يسمى حساب خدمة) لتهيئة متطلبات الاعتماد للنصوص.

A service account is essentially a privileged user account used to authenticate using a username and password. And, if used with automation, a service account is most likely excluded from any conditional access policies or multi-factor authentication.

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

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

الاعتبارات الأساسية لإنشاء مبدأ خدمة Azure

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

اسم العرض. يبدأ الأمر بالاسم، ويجب أن يكون لمبدأ خدمة Azure اسم. لا يوجد قاعدة هنا، ولكن قد تكون لمؤسستك تعليمات تسمية محددة.

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

بالنسبة لمبادئ الخدمة، يشار إلى اسم التطبيق والمفتاح السري باسم معرف التطبيق والمفتاح السري.

  • فترة صلاحية الاعتمادات. سواء قمت بتعيين اعتماد كلمة مرور أو شهادة، يجب عليك تحديد تاريخ بدء وانتهاء صلاحيتها. مدى صلاحية الاعتماد عادةً يعتمد على تكرار تجديد الشهادات وكلمات المرور.
  • نطاق الوصول. هل تقوم بإنشاء مبدأ خدمة Azure سيكون لديه وصول إلى اشتراك أو مجموعة موارد أو موارد محددة؟
  • الدور. هناك عدة أدوار متاحة مثل المساهم ، القارئ ، و المالك ، لذا يجب عليك تحديد الدور الذي يكفي لمبدأ الخدمة.

إنشاء مبدأ خدمة Azure مع مفتاح سري مُخصص

قلب إنشاء مبدأ خدمة جديد في Azure هو cmdlet New-AzAdServicePrincipal. في هذا المثال، سيتم إنشاء مبدأ خدمة جديد بالقيم التالية:

DisplayName: AzVM_Reader

Scope: AzVM1 (الجهاز الظاهري)

Role: قارئ

Password: <تم تعيينه تلقائيًا>

صلاحية الاعتماد: سنة واحدة

الحصول على معرّف نطاق الهدف (الجهاز الظاهري)

كما يمكن ملاحظة، فإن نطاق هذا المبدأ الجديد محدود فقط للجهاز الظاهري المسمى AzVM1. ومع ذلك، فإن معلمة -Scope لا تقبل فقط الاسم، ولكن معرف المورد بأكمله. لذلك، في هذا المثال، أول شيء يجب الحصول عليه هو معرف الجهاز الظاهري AzVM1. للقيام بذلك، استخدم الكود أدناه.

Get-AzVM | Format-Table Name, ID

عند تشغيل الكود أعلاه في PowerShell، يجب أن ترى قائمة بأسماء أجهزة الجهاز الظاهري ومعرّفاتها، مشابهة للصورة أدناه.

Get the list of VM names and IDs

إنشاء مبدأ خدمة Azure مع مفتاح سري

الآن بعد الحصول على معرّف نطاق الهدف، وهو معرّف الجهاز الظاهري AzVM1، يمكنك استخدام الأمر أدناه لإنشاء المبدأ الجديد للخدمة الأساسية الذي يحمل دور “القارئ”. ستتم تخزين خصائص المبدأ الخدمي الجديد في المتغير $sp.

$sp = New-AzAdServicePrincipal `
	-DisplayName AzVM_Reader `
	-Scope '/subscriptions/5e252811-b376-4136-b8ae-d3b8abe2c9c3/resourceGroups/ATA/providers/Microsoft.Compute/virtualMachines/AzVM1'
	-Role 'Reader'

نتيجة للأمر أعلاه، تم إنشاء المبدأ الخدمي بالقيم التالية أدناه.

The properties of the new service principal

فك تشفير المفتاح السري

الآن لديك معرف التطبيق و السرّ، والتي تعتبر اسم المستخدم وكلمة المرور للمستخدم الممثل للخدمة. ومع ذلك، يتم عرض قيمة السرّ على أنها System.Security.SecureString. ستحتاج إلى معرفة ماهية هذا السرّ. لذا، استخدم الأمر التالي لتحويل السرّ إلى نص عادي.

# قم بتحويل كلمة المرور المشفرة إلى نص عادي
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
    [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(
        $sp.Secret
    )
)

الأمر السابق يقوم بتحويل السلسلة المؤمنة المشفرة من $sp.Secret إلى نص عادي. راجع الصورة أدناه كمرجع.

Secure string password value converted to plain text

التحقق من تعيين دور مبدأ الخدمة في Azure

كيف تعرف أن هذا عمل؟ يمكنك التحقق من قائمة التحكم في وصول الموارد باستخدام بوابة Azure. على سبيل المثال، في الصورة أدناه، يمكنك رؤية أن مبدأ الخدمة AzVM_Reader يمتلك الآن وصولًا بصلاحيات القارئ إلى الجهاز الظاهري AzVM1.

Azure resource access control

أيضًا، يمكنك استخدام الأمر Get-AzRoleAssignment -ObjectID $sp.id للحصول على تعيينات الأدوار لمبدأ الخدمة في Azure. راجع لقطة الشاشة أدناه كمثال.

Get the role assignment(s) of the service principal

إنشاء مبدأ خدمة Azure مع كلمة مرور

إذا كنت ترغب في مزيد من التحكم في كلمة المرور أو المفتاح السري المخصص لمبدأ الخدمة في Azure الخاص بك، استخدم معلمة -PasswordCredential أثناء إنشاء مبدأ الخدمة. هذا مفيد بشكل خاص إذا كانت كلمة المرور يجب أن تلبي متطلبات التعقيد.

في هذا المثال، سيتم إنشاء مبدأ الخدمة الجديد في Azure بهذه القيم:

DisplayName: ATA_RG_Contributor

النطاق: ATA (مجموعة الموارد)

الدور: المساهم

كلمة المرور: تحتوي على 20 حرفًا مع 6 حروف غير أبجدية أو أرقام

صلاحية الاعتماد: 5 سنوات

الحصول على معرف نطاق الهدف (مجموعة الموارد)

نطاق هذا الحساب الرئيسي الجديد يغطي مجموعة الموارد بأكملها بالاسم ATA. أول خطوة للحصول على معرف مجموعة الموارد ATA هي استخدام الكود أدناه ولكن تأكد من تغيير قيمة المعلمة -Name إلى اسم مجموعة الموارد الخاصة بك.

# الحصول على قيمة ResourceId لمجموعة الموارد
$Scope = (Get-AzResourceGroup -Name ATA).ResourceId
$Scope

بعد ذلك ، يجب أن ترى ResourceID لمجموعة الموارد التي تم تخزينها الآن في المتغير $Scope.

Getting the Resource Group ID

إنشاء كلمة المرور

الخطوة التالية هي إنشاء كلمة المرور التي تتبع تعقيد تحتوي على 20 حرفًا مع 6 حروف غير أبجدية أو أرقام. يمكنك استخدام طريقة .NET الثابتة GeneratePassword() لذلك.

# إنشاء كلمة مرور عشوائية باستخدام طريقة GeneratePassword() الثابتة
Add-Type -AssemblyName 'System.Web'
$password = [System.Web.Security.Membership]::GeneratePassword(20, 6)
$password

في الكود أعلاه GeneratePassword(20, 6)، القيمة الأولى تعني طول كلمة المرور ، والقيمة الثانية تعني عدد الحروف غير الأبجدية أو الأرقام التي يجب تضمينها. يتم عرض النتيجة في الصورة أدناه.

Randomly generated password using the .NET GeneratePassword() static method

إنشاء كائن اعتماد كلمة المرور

الآن بمجرد أن لديك سلسلة كلمة المرور، الخطوة التالية هي إنشاء كائن Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential. سيحتوي هذا الكائن على سلسلة كلمة المرور المخزنة في المتغير $password وفترة الصلاحية لمدة 5 سنوات. انسخ الكود أدناه وقم بتشغيله في جلسة Azure PowerShell الخاصة بك.

# إنشاء كائن اعتماد كلمة المرور
[Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential]`
    $PasswordCredential = @{
    StartDate = Get-Date;
    EndDate   = (Get-Date).AddYears(5);
    Password  = $password
}
$PasswordCredential

تشغيل الكود أعلاه في PowerShell سيقوم بتخزين كائن الاعتماد في المتغير $PasswordCredential. يجب أن يكون النتيجة المتوقعة مشابهة للنتيجة المعروضة أدناه.

Creating the new password credential object in Azure PowerShell

إنشاء الممثل الخدمي مع كلمة المرور

لديك الآن قيم المعلمة المطلوبة جاهزة لإنشاء الممثل الخدمي في Azure. الكود أدناه سيقوم بإنشاء الممثل الخدمي بعرض الاسم ATA_RG_Contributor واستخدام كلمة المرور المخزنة في المتغير $PasswordCredential.

# إنشاء الممثل الخدمي باستخدام اعتماد كلمة المرور
$sp = New-AzAdServicePrincipal `
    -DisplayName 'ATA_RG_Contributor' `
    -PasswordCredential $PasswordCredential
$sp

بعد تشغيل الكود، يجب أن يتم إنشاء الممثل الخدمي الجديد وتخزين الخصائص في المتغير $sp. انظر إلى النتيجة المثالية أدناه.

The new Azure service principal is created

تعيين الدور ونطاق العمل

تم إنشاء الممثل الخدمي في الجزء السابق، ولكن بدون دور ونطاق العمل. هذا يعود إلى عدم إمكانية استخدام المعلمة -Role و-Scope مع المعلمة -PasswordCredential. هذا يعني أن خطوة إضافية مطلوبة لتعيين الدور ونطاق العمل للممثل الخدمي.

الكود أدناه يستخدم الأمر “New-AzRoleAssignment” لتعيين نطاق ودور للممثل الخدمي في Azure.

# تعيين الدور للمورد المستهدف
New-AzRoleAssignment -$azSubscription = Get-AzSubscription -SubscriptionName VSE3
$Scope = "/subscriptions/$($azSubscription.ID)"
$TenantID = $azSubscription.TenantID$sp.ApplicationId `
    -Scope $Scope `
    -RoleDefinitionName 'Contributor'

الصورة أدناه تُظهر النتيجة المتوقعة بعد تعيين الدور والنطاق للممثل الخدمي في Azure.

Assigning role and scope using Azure Powershell

تأكد دائمًا من حفظ كلمة مرور الممثل الخدمي لأنه لا يمكن استعادتها إذا لم تتمكن من حفظها أو نسيتها.

الاتصال بـ Azure باستخدام كلمة مرور الممثل الخدمي

الآن حان الوقت لاستخدام الممثل الخدمي. بدلاً من تسجيل الدخول إلى Azure PowerShell باستخدام حساب مستخدم، يستخدم الكود أدناه بدلًا من ذلك بيانات اعتماد الممثل الخدمي.

# الحصول على الممثل الخدمي بالاسم المعروض ATA_RG_Contributor
$sp = Get-AzADServicePrincipal -DisplayName ATA_RG_Contributor

# الحصول على معرف المستأجر
$TenantID = (Get-AzContext).Tenant.ID

# الحصول على اسم أول ممثل خدمي
$user = $sp.ServicePrincipalNames[0]

# تحويل كلمة المرور إلى سلسلة آمنة
$secPassword = $password | ConvertTo-SecureString -AsPlainText -Force

# إنشاء كائن PSCredential
$credential = [PSCredential]::New($user,$secPassword)

# الاتصال بـ Azure
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $TenantID
# الحصول على الممثل الخدمي بالاسم المعروض ATA_RG_Contributor
$sp = Get-AzADServicePrincipal -DisplayName ATA_RG_Contributor

# الحصول على معرف المستأجر
$TenantID = (Get-AzContext).Tenant.ID

# الحصول على اسم أول ممثل خدمي
$user = $sp.ServicePrincipalNames[0]

# تحويل كلمة المرور إلى سلسلة آمنة
$secPassword = $password | ConvertTo-SecureString -AsPlainText -Force

# إنشاء كائن PSCredential
$credential = [PSCredential]::New($user,$secPassword)

# الاتصال بـ Azure
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $TenantID# الحصول على الممثل الخدمي بالاسم المعروض ATA_RG_Contributor
$sp = Get-AzADServicePrincipal -DisplayName ATA_RG_Contributor

# الحصول على معرف المستأجر
$TenantID = (Get-AzContext).Tenant.ID

# الحصول على اسم أول ممثل خدمي
$user = $sp.ServicePrincipalNames[0]

# تحويل كلمة المرور إلى سلسلة آمنة
$secPassword = $password | ConvertTo-SecureString -AsPlainText -Force

# إنشاء كائن PSCredential
$credential = [PSCredential]::New($user,$secPassword)

# الاتصال بـ Azure
Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $TenantID

بعد تشغيل الشفرة أعلاه ، يجب أن تكون قد قمت بتسجيل الدخول إلى Azure PowerShell باستخدام معرف الخدمة ATA_RG_Contributor واعتماد كلمة المرور.

Connect to Azure using a Service Principal with Password Credential

إنشاء معرف Azure Service Principal بشهادة

بالإضافة إلى اعتمادات كلمة المرور ، يمكن لـ Azure Service Principal أن يحتوي أيضًا على اعتمادات قائمة على الشهادة. يمكن أن تكون الشهادة المرتبطة إما من شهادة السلطة المصدرة أو توقيع الذاتي.

في هذا المثال ، سيتم إنشاء معرف Azure Service Principal الجديد بهذه القيم:

DisplayName: VSE3_SUB_OWNER

Scope: VSE3 (الاشتراك)

Role: Owner

صلاحية الشهادة: 2 سنوات

الحصول على معرف النطاق المستهدف (الاشتراك)

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

# الحصول على معرف نطاق الاشتراك ومعرف المستأجر
$azSubscription = Get-AzSubscription -SubscriptionName VSE3
$Scope = "/subscriptions/$($azSubscription.ID)"
$TenantID = $azSubscription.TenantID

بعد ذلك ، حدد اسم معرف Azure Service Principal الجديد والشهادة الموقعة ذاتيًا التي ستتم إنشاؤها.

# اسم معرف Azure Service Principal الجديد وشهادة التوقيع الذاتي
$DisplayName = 'VSE3_SUB_OWNER'

إنشاء الشهادة الموقعة ذاتيًا

الكود أدناه ينشئ كلمة مرور ذاتية التوقيع في متجر الشهادات الشخصية بالاسم CN=VSE3_SUB_OWNER. صلاحية الشهادة محددة لمدة عامين. يتم حفظ خصائص الشهادة في المتغير $cert.

# إنشاء شهادة ذاتية التوقيع
$cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" `
    -Subject "CN=$($DisplayName)" `
    -KeySpec KeyExchange `
    -NotBefore ((Get-Date).AddDays(-1)) `
    -NotAfter ((Get-Date).AddYears(2))
$cert

الشاشة أدناه توضح أن الشهادة تم إنشاؤها.

The self-signed certificate is created in the personal certificate store

إذا كنت ترغب في رؤية الشهادة الجديدة بصورة أكثر تعرفًا (واجهة المستخدم الرسومية) ، فيمكنك العثور عليها في واجهة إدارة الشهادات (certmgr.mmc). يُرجى الإشارة إلى الصورة أدناه التي تُظهر الشهادة.

Viewing the self-signed certificate

الخطوة التالية هي الحصول على القيمة المشفرة بترميز Base64 للشهادة ذاتية التوقيع وحفظها في المتغير $keyValue.

# الحصول على قيمة Base64 للشهادة ذاتية التوقيع
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())

إنشاء Service Principal مع الشهادة

الآن بعد إنشاء الشهادة ، الخطوة التالية هي إنشاء Azure service principal الجديد. الكود أدناه سينشئ Azure service principal الذي سيستخدم الشهادة ذاتية التوقيع كاعتمادات له. فترة صلاحية الاعتماد تتزامن مع فترة صلاحية الشهادة.

$sp = New-AzADServicePrincipal -DisplayName $DisplayName `
    -CertValue $keyValue `
    -EndDate $cert.NotAfter `
    -StartDate $cert.NotBefore
$sp

ستحصل على نتيجة مماثلة كما هو موضح في الصورة أدناه.

The new Azure service principal with a certificate is created

تعيين الدور والنطاق

تم إنشاء Azure service principal ، ولكن لم يتم تعيين أي دور و نطاق له حتى الآن. هذا يعني أن خطوة إضافية مطلوبة لتعيين الدور والنطاق لـ service principal.

يستخدم الكود أدناه الأمر New-AzRoleAssignment لتعيين دور المالك لاشتراك VSE3 في المبدأ الخدمي.

# تعيين الدور والنطاق
New-AzRoleAssignment -ApplicationId $sp.ApplicationId `
    -Scope $Scope `
    -RoleDefinitionName 'Owner'

عند تشغيل الكود، يُعرض التأكيد في الصورة أدناه بأن عملية تعيين الدور تمت بنجاح.

The service principal’s owner role is added to the subscription

الاتصال بخدمة Azure باستخدام شهادة المبدأ الخدمي

الآن لديك مبدأ الخدمة الذي تم إنشاؤه باستخدام بيانات اعتماد مستندة إلى شهادة. هذا يعني أنه يمكنك استخدامه للاتصال بـ Azure دون الحاجة إلى كلمة مرور. بدلاً من ذلك، ستستخدم الشهادة المتاحة على جهاز الكمبيوتر الخاص بك كوسيلة مصادقة.

في هذا المثال، اسم العرض لمبدأ الخدمة هو VSE3_SUB_OWNER، واسم الشهادة هو CN=VSE3_SUB_OWNER. يستخدم الكود أدناه بصمة الشهادة من مخزن الشهادات الشخصية كطريقة دخول.

# الحصول على الشهادة بالموضوع CN=VSE3_SUB_OWNER
$cert = Get-ChildItem Cert:\CurrentUser\My\ | Where-Object { $_.Subject -eq 'CN=VSE3_SUB_OWNER' }

# الاتصال بـ Azure
Connect-AzAccount -ServicePrincipal -CertificateThumbprint $cert.ThumbPrint -ApplicationID $sp.ApplicationID -Tenant $TenantID

تُظهر الصورة أدناه أن استخدام الكود أعلاه، تم تسجيل الدخول إلى Azure PowerShell بنجاح باستخدام ApplicationID، Tenant، وشهادة ThumbPrint فقط.

Connecting to Azure using a Service Principal and Certificate

الاستنتاج

يعد مبدأ خدمة Azure هو المبدأ الأمني الذي يجب مراعاته عند إنشاء بيانات اعتماد لمهام الأتمتة والأدوات التي تواصل مع موارد Azure. يمكن اختيار النطاق والدور المراد تطبيقه لمنح أذونات “بالقدر الكافي” للوصول.

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

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

التقنيات التي تعلمتها في هذه المقالة تغطي فقط الأساسيات للبدء في استخدام ممثلات خدمة Azure في الأتمتة الخاصة بك. هناك طرق أخرى كثيرة لتكوين ممثلات خدمة Azure مثل إضافة وإزالة وإعادة تعيين الاعتمادات. من مسؤوليتك اكتشافها بمرور الوقت.

شكرًا لقراءتك!

موارد تعلم إضافية

إليك بعض الموارد التي قد تكون مفيدة لمرافقة هذه المقالة.

Source:
https://adamtheautomator.com/azure-service-principal/