استكشاف أخطاء حدود Azure RBAC وإصلاحها
توضح هذه المقالة بعض الحلول الشائعة عند تجاوز الحدود في التحكم في الوصول المستند إلى الدور في Azure (Azure RBAC).
المتطلبات الأساسية
- دور القارئ لتشغيل استعلامات Azure Resource Graph.
- دور مسؤول التحكم في الوصول المستند إلى الدور لإضافة تعيينات الدور أو إزالتها.
- دور مسؤول وصول المستخدم لإضافة تعيينات الأدوار أو إزالة تعيينات الأدوار أو حذف الأدوار المخصصة.
- دور مسؤول المجموعات أو مسؤول المستخدم لإنشاء مجموعات.
إشعار
ترجع الاستعلامات المستخدمة في هذه المقالة تعيينات الأدوار أو الأدوار المخصصة التي لديك أذونات للقراءة فقط. على سبيل المثال، إذا كان لديك فقط أذونات لقراءة تعيينات الأدوار في نطاق مجموعة الموارد، فلن يتم إرجاع تعيينات الأدوار في نطاق الاشتراك.
العرض - لا يمكن إنشاء المزيد من تعيينات الأدوار
عند محاولة تعيين دور، تحصل على رسالة الخطأ التالية:
No more role assignments can be created (code: RoleAssignmentLimitExceeded)
السبب
يدعم Azure ما يصل إلى 4000 تعيين دور لكل اشتراك. يتضمن هذا الحد تعيينات الأدوار في الاشتراك ومجموعة الموارد ونطاقات الموارد، ولكن ليس في نطاق مجموعة الإدارة. لا يتم احتساب تعيينات الأدوار المؤهلة وتعيينات الأدوار المجدولة في المستقبل ضمن هذا الحد. يجب أن تحاول تقليل عدد تعيينات الأدوار في الاشتراك.
إشعار
تم إصلاح حد تعيينات الأدوار 4000 لكل اشتراك ولا يمكن زيادته.
للحصول على عدد تعيينات الأدوار، يمكنك عرض المخطط على صفحة التحكم في الوصول (IAM) في مدخل Microsoft Azure. يمكنك أيضا استخدام أوامر Azure PowerShell التالية:
$scope = "/subscriptions/<subscriptionId>"
$ras = Get-AzRoleAssignment -Scope $scope | Where-Object {$_.scope.StartsWith($scope)}
$ras.Count
الحل 1 - استبدال تعيينات الأدوار المستندة إلى الأساسيات بتعيينات الأدوار المستندة إلى المجموعة
لتقليل عدد تعيينات الأدوار في الاشتراك، أضف الأساسيات (المستخدمين وكيانات الخدمة والهويات المدارة) إلى المجموعات وقم بتعيين الأدوار للمجموعات بدلا من ذلك. اتبع هذه الخطوات لتحديد مكان استبدال تعيينات الأدوار المتعددة للمديرين بتعيين دور واحد لمجموعة.
سجل الدخول إلى مدخل Microsoft Azure وافتح Azure Resource Graph Explorer.
حدد النطاق وقم بتعيين نطاق الاستعلام.
عادة ما تقوم بتعيين النطاق إلى الدليل للاستعلام عن المستأجر بأكمله، ولكن يمكنك تضييق النطاق لاشتراكات معينة.
حدد تعيين نطاق التخويل وقم بتعيين نطاق التخويل إلى At وأعلى وأسفلا للاستعلام عن جميع الموارد في النطاق المحدد.
قم بتشغيل الاستعلام التالي للحصول على تعيينات الدور بنفس الدور وفي نفس النطاق، ولكن لكيانات مختلفة.
يتحقق هذا الاستعلام من تعيينات الأدوار النشطة ولا يأخذ في الاعتبار تعيينات الأدوار المؤهلة في Microsoft Entra إدارة الهويات المتميزة. لسرد تعيينات الأدوار المؤهلة، يمكنك استخدام مركز إدارة Microsoft Entra أو PowerShell أو REST API. لمزيد من المعلومات، راجع Get-AzRoleEligibilityScheduleInstance أو مثيلات جدول الأهلية للدور - قائمة للنطاق.
إذا كنت تستخدم شروط تعيين الدور أو تفويض إدارة تعيين الدور بشروط، فيجب عليك استخدام استعلام الشروط. وإلا، استخدم الاستعلام الافتراضي.
authorizationresources | where type =~ "microsoft.authorization/roleassignments" | where id startswith "/subscriptions" | extend RoleId = tolower(tostring(properties.roleDefinitionId)) | join kind = leftouter ( authorizationresources | where type =~ "microsoft.authorization/roledefinitions" | extend RoleDefinitionName = tostring(properties.roleName) | extend RoleId = tolower(id) | project RoleDefinitionName, RoleId ) on $left.RoleId == $right.RoleId | extend principalId = tostring(properties.principalId) | extend principal_to_ra = pack(principalId, id) | summarize count_ = count(), AllPrincipals = make_set(principal_to_ra) by RoleDefinitionId = RoleId, Scope = tolower(properties.scope), RoleDefinitionName | where count_ > 1 | order by count_ desc
يعرض التالي مثالا على النتائج. العمود count_ هو عدد الأساسيات المعينة لنفس الدور وفي نفس النطاق. يتم فرز العدد بترتيب تنازلي.
حدد صفا تريد استبدال تعيينات الأدوار المتعددة فيه بتعيين دور واحد لمجموعة.
في الصف، حدد عرض التفاصيل لفتح جزء التفاصيل .
العمود الوصف معرف تعريف الدور معرف الدور المعين حاليا. النطاق نطاق تعيين الدور، والذي سيكون اشتراكا أو مجموعة موارد أو موردا. RoleDefinitionName اسم الدور المعين حاليا. عد_ عدد الأساسيات المعينة لنفس الدور وفي نفس النطاق. AllPrincipals قائمة المعرفات الأساسية المعينة لنفس الدور وفي نفس النطاق. استخدم RoleDefinitionId و RoleDefinitionName و Scope للحصول على الدور والنطاق.
استخدم AllPrincipals للحصول على قائمة المعرفات الرئيسية بنفس تعيين الدور.
إنشاء مجموعة Microsoft Entra. لمزيد من المعلومات، راجع إدارة مجموعات Microsoft Entra وعضوية المجموعة.
أضف الأساسيات من AllPrincipals إلى المجموعة.
للحصول على معلومات حول كيفية إضافة أساسيات بشكل مجمع، راجع إضافة أعضاء المجموعة المجمعة في معرف Microsoft Entra.
قم بتعيين الدور للمجموعة التي قمت بإنشائها في نفس النطاق. لمزيد من المعلومات، راجع تعيين أدوار Azure باستخدام مدخل Azure.
يمكنك الآن العثور على تعيينات الأدوار المستندة إلى الأساسي وإزالتها.
احصل على الأسماء الأساسية من المعرف الأساسي.
- لاستخدام مدخل Microsoft Azure، راجع إضافة معلومات ملف تعريف المستخدم وإعداداته أو تحديثها.
- لاستخدام PowerShell، راجع Get-MgUser.
- لاستخدام Azure، CLI، راجع az ad user show.
افتح صفحة Access control (IAM) في نفس نطاق تعيينات الدور.
انقر فوق علامة التبويب Role assignments.
لتصفية تعيينات الدور، حدد عامل تصفية الدور ثم حدد اسم الدور.
ابحث عن تعيينات الدور المستندة إلى الأساسي.
يجب أن تشاهد أيضا تعيين الدور المستند إلى المجموعة.
حدد تعيينات الدور المستندة إلى الأساسي وأزلها. لمزيد من المعلومات، راجع إزالة تعيينات دور Azure.
الحل 2 - إزالة تعيينات الأدوار المكررة
لتقليل عدد تعيينات الأدوار في الاشتراك، قم بإزالة تعيينات الأدوار المكررة. اتبع هذه الخطوات لتحديد المكان الذي يمكن فيه إزالة تعيينات الأدوار المكررة في نطاق أقل نظرا لأن تعيين الدور في نطاق أعلى يمنح الوصول بالفعل.
سجل الدخول إلى مدخل Microsoft Azure وافتح Azure Resource Graph Explorer.
حدد النطاق وقم بتعيين نطاق الاستعلام.
عادة ما تقوم بتعيين النطاق إلى الدليل للاستعلام عن المستأجر بأكمله، ولكن يمكنك تضييق النطاق لاشتراكات معينة.
حدد تعيين نطاق التخويل وقم بتعيين نطاق التخويل إلى At وأعلى وأسفلا للاستعلام عن جميع الموارد في النطاق المحدد.
قم بتشغيل الاستعلام التالي للحصول على تعيينات الدور بنفس الدور ونفس المبدأ، ولكن في نطاقات مختلفة.
يتحقق هذا الاستعلام من تعيينات الأدوار النشطة ولا يأخذ في الاعتبار تعيينات الأدوار المؤهلة في Microsoft Entra إدارة الهويات المتميزة. لسرد تعيينات الأدوار المؤهلة، يمكنك استخدام مركز إدارة Microsoft Entra أو PowerShell أو REST API. لمزيد من المعلومات، راجع Get-AzRoleEligibilityScheduleInstance أو مثيلات جدول الأهلية للدور - قائمة للنطاق.
إذا كنت تستخدم شروط تعيين الدور أو تفويض إدارة تعيين الدور بشروط، فيجب عليك استخدام استعلام الشروط. وإلا، استخدم الاستعلام الافتراضي.
authorizationresources | where type =~ "microsoft.authorization/roleassignments" | where id startswith "/subscriptions" | extend RoleDefinitionId = tolower(tostring(properties.roleDefinitionId)) | extend PrincipalId = tolower(properties.principalId) | extend RoleDefinitionId_PrincipalId = strcat(RoleDefinitionId, "_", PrincipalId) | join kind = leftouter ( authorizationresources | where type =~ "microsoft.authorization/roledefinitions" | extend RoleDefinitionName = tostring(properties.roleName) | extend rdId = tolower(id) | project RoleDefinitionName, rdId ) on $left.RoleDefinitionId == $right.rdId | summarize count_ = count(), Scopes = make_set(tolower(properties.scope)) by RoleDefinitionId_PrincipalId,RoleDefinitionName | project RoleDefinitionId = split(RoleDefinitionId_PrincipalId, "_", 0)[0], RoleDefinitionName, PrincipalId = split(RoleDefinitionId_PrincipalId, "_", 1)[0], count_, Scopes | where count_ > 1 | order by count_ desc
يعرض التالي مثالا على النتائج. العمود count_ هو عدد النطاقات المختلفة لتعيينات الأدوار بنفس الدور ونفس المبدأ. يتم فرز العدد بترتيب تنازلي.
العمود الوصف معرف تعريف الدور معرف الدور المعين حاليا. RoleDefinitionName اسم الدور المعين حاليا. المعرف الأساسي معرف الأساسي المعين للدور. عد_ عدد النطاقات المختلفة لتعيينات الأدوار بنفس الدور ونفس المبدأ. النطاقات نطاقات تعيينات الأدوار بنفس الدور ونفس المبدأ. حدد صفا تريد إزالة تعيينات الأدوار المكررة فيه.
في صف، حدد عرض التفاصيل لفتح جزء التفاصيل .
استخدم RoleDefinitionId و RoleDefinitionName و PrincipalId للحصول على الدور والمعرف الأساسي.
استخدم النطاقات للحصول على قائمة النطاقات لنفس الدور ونفس المبدأ.
تحديد النطاق المطلوب لتعيين الدور. يمكن إزالة تعيينات الدور الأخرى.
يجب اتباع أفضل الممارسات الأقل امتيازا عند تحديد تعيينات الدور التي يمكن إزالتها. قد يمنح تعيين الدور في النطاق الأعلى وصولا إلى الأساسي أكثر مما هو مطلوب. في هذه الحالة، يجب إزالة تعيين الدور بالنطاق الأعلى. على سبيل المثال، قد لا يحتاج المستخدم إلى تعيين دور مساهم الجهاز الظاهري في نطاق الاشتراك عندما يمنح تعيين دور مساهم الجهاز الظاهري في نطاق مجموعة موارد أقل الوصول المطلوب.
احصل على الاسم الأساسي من المعرف الأساسي.
- لاستخدام مدخل Microsoft Azure، راجع إضافة معلومات ملف تعريف المستخدم وإعداداته أو تحديثها.
- لاستخدام PowerShell، راجع Get-MgUser.
- لاستخدام Azure، CLI، راجع az ad user show.
افتح صفحة التحكم في الوصول (IAM) في نطاق تعيين دور تريد إزالته.
انقر فوق علامة التبويب Role assignments.
لتصفية تعيينات الدور، حدد عامل تصفية الدور ثم حدد اسم الدور.
ابحث عن الأساسي.
حدد تعيين الدور وأزله. لمزيد من المعلومات، راجع إزالة تعيينات دور Azure.
الحل 3 - استبدال تعيينات دور مضمنة متعددة بتعيين دور مخصص
لتقليل عدد تعيينات الأدوار في الاشتراك، استبدل تعيينات الأدوار المضمنة المتعددة بتعيين دور مخصص واحد. اتبع هذه الخطوات لتحديد المكان الذي يمكن فيه استبدال العديد من تعيينات الأدوار المضمنة.
سجل الدخول إلى مدخل Microsoft Azure وافتح Azure Resource Graph Explorer.
حدد النطاق وقم بتعيين نطاق الاستعلام.
عادة ما تقوم بتعيين النطاق إلى الدليل للاستعلام عن المستأجر بأكمله، ولكن يمكنك تضييق النطاق لاشتراكات معينة.
قم بتشغيل الاستعلام التالي للحصول على تعيينات الأدوار بنفس النطاق الأساسي ونفس النطاق، ولكن مع أدوار مضمنة مختلفة.
يتحقق هذا الاستعلام من تعيينات الأدوار النشطة ولا يأخذ في الاعتبار تعيينات الأدوار المؤهلة في Microsoft Entra إدارة الهويات المتميزة. لسرد تعيينات الأدوار المؤهلة، يمكنك استخدام مركز إدارة Microsoft Entra أو PowerShell أو REST API. لمزيد من المعلومات، راجع Get-AzRoleEligibilityScheduleInstance أو مثيلات جدول الأهلية للدور - قائمة للنطاق.
إذا كنت تستخدم شروط تعيين الدور أو تفويض إدارة تعيين الدور بشروط، فيجب عليك استخدام استعلام الشروط. وإلا، استخدم الاستعلام الافتراضي.
AuthorizationResources | where type =~ "microsoft.authorization/roleassignments" | where id startswith "/subscriptions" | extend PrincipalId = tostring(properties.principalId) | extend Scope = tolower(properties.scope) | extend RoleDefinitionId = tolower(tostring(properties.roleDefinitionId)) | join kind = leftouter ( AuthorizationResources | where type =~ "microsoft.authorization/roledefinitions" | extend RoleName = tostring(properties.roleName) | extend RoleId = tolower(id) | extend RoleType = tostring(properties.type) | where RoleType == "BuiltInRole" | extend RoleId_RoleName = pack(RoleId, RoleName) ) on $left.RoleDefinitionId == $right.RoleId | summarize count_ = count(), AllRD = make_set(RoleId_RoleName) by PrincipalId, Scope | where count_ > 1 | order by count_ desc
يعرض التالي مثالا على النتائج. العمود count_ هو عدد تعيينات الأدوار المضمنة المختلفة بنفس النطاق الأساسي والنطاق نفسه. يتم فرز العدد بترتيب تنازلي.
العمود الوصف المعرف الأساسي معرف الأساسي المعين للأدوار المضمنة. النطاق نطاق تعيينات الأدوار المضمنة. عد_ عدد تعيينات الأدوار المضمنة بنفس النطاق الأساسي والنطاق نفسه. AllRD معرف واسم الأدوار المضمنة. في صف، حدد عرض التفاصيل لفتح جزء التفاصيل .
استخدم AllRD لمشاهدة الأدوار المضمنة التي يمكن دمجها في دور مخصص.
سرد الإجراءات وإجراءات البيانات للأدوار المضمنة. لمزيد من المعلومات، راجع سرد تعريفات دور Azure أو الأدوار المضمنة في Azure
إنشاء دور مخصص يتضمن جميع الإجراءات وإجراءات البيانات كأدوار مضمنة. لتسهيل إنشاء الدور المخصص، يمكنك البدء بنسخ أحد الأدوار المضمنة. لمزيد من المعلومات، راجع إنشاء أو تحديث أدوار Azure المخصصة باستخدام مدخل Microsoft Azure.
احصل على الاسم الأساسي من المعرف الأساسي.
- لاستخدام مدخل Microsoft Azure، راجع إضافة معلومات ملف تعريف المستخدم وإعداداته أو تحديثها.
- لاستخدام PowerShell، راجع Get-MgUser.
- لاستخدام Azure، CLI، راجع az ad user show.
افتح صفحة Access control (IAM) في نفس نطاق تعيينات الدور.
تعيين الدور المخصص الجديد إلى الأساسي. لمزيد من المعلومات، راجع تعيين أدوار Azure باستخدام مدخل Azure.
يمكنك الآن إزالة تعيينات الأدوار المضمنة.
في صفحة Access control (IAM) في نفس النطاق، حدد علامة التبويب Role assignments .
ابحث عن تعيينات الأدوار الأساسية والمضمنة.
إزالة تعيينات الدور المضمنة من الأساسي. لمزيد من المعلومات، راجع إزالة تعيينات دور Azure.
الحل 4 - جعل تعيينات الأدوار مؤهلة
لتقليل عدد تعيينات الأدوار في الاشتراك ولديك معرف Microsoft Entra P2، اجعل تعيينات الأدوار مؤهلة في Microsoft Entra إدارة الهويات المتميزة بدلا من تعيينها بشكل دائم.
الحل 5 - إضافة اشتراك إضافي
إضافة اشتراك إضافي.
العرض - لا يمكن إنشاء المزيد من تعيينات الأدوار في نطاق مجموعة الإدارة
لا يمكنك تعيين دور في نطاق مجموعة الإدارة.
السبب
يدعم Azure ما يصل إلى 500 تعيين دور لكل مجموعة إدارة. يختلف هذا الحد عن حد تعيينات الدور لكل اشتراك.
إشعار
تم إصلاح حد تعيينات الأدوار البالغ 500 لكل مجموعة إدارة ولا يمكن زيادته.
حل
حاول تقليل عدد تعيينات الأدوار في مجموعة الإدارة. للحصول على الخيارات الممكنة، راجع العرض - لا يمكن إنشاء المزيد من تعيينات الأدوار. لكي تسترد الاستعلامات الموارد على مستوى مجموعة الإدارة، ستحتاج إلى إجراء التغيير التالي على الاستعلامات:
الاستبدال
| where id startswith "/subscriptions"
With
| where id startswith "/providers/Microsoft.Management/managementGroups"
العرض - لا يمكن إنشاء المزيد من تعريفات الأدوار
عند محاولة إنشاء دور مخصص جديد، تحصل على الرسالة التالية:
Role definition limit exceeded. No more role definitions can be created (code: RoleDefinitionLimitExceeded)
السبب
يدعم Azure ما يصل إلى 5000 دور مخصص في دليل. (بالنسبة إلى Microsoft Azure المشغل بواسطة 21Vianet، الحد الأقصى هو 2000 دور مخصص.)
حل
اتبع هذه الخطوات للبحث عن أدوار Azure المخصصة غير المستخدمة وحذفها.
سجل الدخول إلى مدخل Microsoft Azure وافتح Azure Resource Graph Explorer.
حدد Scope وقم بتعيين النطاق إلى Directory للاستعلام.
قم بتشغيل الاستعلام التالي للحصول على جميع الأدوار المخصصة التي لا تحتوي على أي تعيينات أدوار:
يتحقق هذا الاستعلام من تعيينات الأدوار النشطة ولا يأخذ في الاعتبار تعيينات الأدوار المخصصة المؤهلة في Microsoft Entra إدارة الهويات المتميزة. لسرد تعيينات الأدوار المخصصة المؤهلة، يمكنك استخدام مركز إدارة Microsoft Entra أو PowerShell أو REST API. لمزيد من المعلومات، راجع Get-AzRoleEligibilityScheduleInstance أو مثيلات جدول الأهلية للدور - قائمة للنطاق.
AuthorizationResources | where type =~ "microsoft.authorization/roledefinitions" | where tolower(properties.type) == "customrole" | extend rdId = tolower(id) | extend Scope = tolower(properties.assignableScopes) | join kind = leftouter ( AuthorizationResources | where type =~ "microsoft.authorization/roleassignments" | extend RoleId = tolower(tostring(properties.roleDefinitionId)) | summarize RoleAssignmentCount = count() by RoleId ) on $left.rdId == $right.RoleId | where isempty(RoleAssignmentCount) | project RoleDefinitionId = rdId, RoleDefinitionName = tostring(properties.roleName), Scope
يوضح ما يلي مثالا على النتائج:
العمود الوصف معرف تعريف الدور معرف الدور المخصص غير المستخدم. RoleDefinitionName اسم الدور المخصص غير المستخدم. النطاق نطاقات قابلة للتعيين للدور المخصص غير المستخدم. افتح النطاق (الاشتراك عادة) ثم افتح صفحة التحكم في الوصول (IAM).
حدد علامة التبويب Roles لمشاهدة قائمة بجميع الأدوار المضمنة والمخصصة.
في عامل تصفية النوع ، حدد CustomRole لمشاهدة أدوارك المخصصة فقط.
حدد علامة الحذف (...) للدور المخصص الذي تريد حذفه ثم حدد حذف.