إنشاء موارد AZURE RBAC باستخدام Bicep

يحتوي Azure على نظام تحكم في الوصول استناداً إلى الدور (RBAC) قوي. لمزيد من المعلومات حول Azure RBAC، راجع ما هو التحكم في الوصول المستند إلى الدور من Azure (Azure RBAC)؟ باستخدام Bicep، يمكنك تعريف تعيينات دور التحكم في الوصول المستند إلى الدور وتعريفات الأدوار برمجيًا.

تعيينات الأدوار

تعيينات الدور تمكنك من منح كيان (مثل مستخدم أو مجموعة أو كيان خدمة) حق الوصول إلى مورد Azure معين.

لتعريف تعيين دور، قم بإنشاء مورد بنوع Microsoft.Authorization/roleAssignments. لتعريف الدور خصائص متعددة، بما في ذلك نطاق واسم ومعرّف تعريف دور ومعرّف أساسي ونوع أساسي.

Scope

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

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

param location string = resourceGroup().location
param storageAccountName string = 'stor${uniqueString(resourceGroup().id)}'
param storageSkuName string = 'Standard_LRS'
param roleDefinitionResourceId string
param principalId string

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
   name: storageSkuName
  }
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount
  name: guid(storageAccount.id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

إذا لم تحدد النطاق بشكل صريح، يستخدم Bicep targetScope الملف. في المثال التالي، لا يتم scopeتحديد خاصية، لذلك يتم تعيين الدور على نطاق الاشتراك:

param roleDefinitionResourceId string
param principalId string

targetScope = 'subscription'

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(subscription().id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

تلميح

استخدم أصغر نطاق تحتاج إليه لتلبية متطلباتك.

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

الاسم

يجب أن يكون اسم مورد تعيين الدور معرفًا فريدًا عالميًا (GUID).

يجب أن تكون أسماء موارد تعيين الدور فريدة داخل مستأجر Microsoft Entra، حتى إذا كان النطاق أضيق.

لكي يكون نشر Bicep قابلاً للتكرار، من المهم أن يكون الاسم محددًا - بمعنى آخر، لاستخدام نفس الاسم في كل مرة تقوم فيها بالنشر. من الممارسات الجيدة أن تنشئ GUID يستخدم النطاق والمعرّف الأساسي ومعرّف الدور معًا. من الجيد استخدم الدالة guid() لمساعدتك على إنشاء GUID محدد لأسماء تعيينات الأدوار الخاص بك، كما في هذا المثال:

name: guid(subscription().id, principalId, roleDefinitionResourceId)

معرّف تعريف الدور

يمكن أن يكون الدور الذي تعينه تعريف لدور مضمن أو تعريف لدور مخصص. لاستخدام تعريف دور مضمن، ابحث عن معرّف تعريف الدور المناسب. على سبيل المثال، دور المساهم له معرّف تعريف دورb24988ac-6180-42a0-ab88-20f7382dd24c.

عند إنشاء مورد تعيين الدور، تحتاج إلى تحديد معرّف مورد مؤهل بالكامل. معرفات تعريف الدور المضمنة هي موارد نطاق اشتراك. من الممارسات الجيدة أ تستخدم existing مورد للإشارة إلى الدور المضمن، والوصول إلى معرّف المورد المؤهل بالكامل باستخدام .id الخاصية:

param principalId string

@description('This is the built-in Contributor role. See https://docs.microsoft.com/azure/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
  scope: subscription()
  name: 'b24988ac-6180-42a0-ab88-20f7382dd24c'
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, principalId, contributorRoleDefinition.id)
  properties: {
    roleDefinitionId: contributorRoleDefinition.id
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

أساسي

principalId يجب تعيين الخاصية إلى GUID الذي يمثل معرف Microsoft Entra للمدير. في معرف Microsoft Entra، يشار إلى هذا أحيانا باسم معرف الكائن.

تحدد principalType الخاصية ما إذا كان الأساسي هو مستخدم أو مجموعة أو كيان خدمة. الهويات المُدارة هي شكل من أشكال كيان الخدمة.

تلميح

من المهم تعيين principalType الخاصية عند إنشاء تعيين دور في Bicep. وإلا، قد تحصل على أخطاء توزيع متقطعة، خاصة عند العمل مع كيانات الخدمة والهويات المُدارة.

يوضح المثال التالي كيفية إنشاء هوية مُدارة تم تعيينها بواسطة المستخدم وتعيين دور:

param location string = resourceGroup().location
param roleDefinitionResourceId string

var managedIdentityName = 'MyManagedIdentity'

resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: managedIdentityName
  location: location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, managedIdentity.id, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: managedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

سلوك حذف الموارد

عند حذف مستخدم أو مجموعة أو كيان خدمة أو هوية مدارة من معرف Microsoft Entra، من الممارسات الجيدة حذف أي تعيينات أدوار. لا يتم حذفها تلقائيًا.

أي تعيينات دور تشير إلى معرف أساسي محذوف تصبح غير صالحة. إذا حاولت إعادة استخدام اسم تعيين دور لتعيين دور آخر، سيفشل النشر. لحل هذا السلوك، يجب إما إزالة تعيين الدور القديم قبل إعادة إنشائه، أو التأكد من استخدام اسم فريد عند توزيع تعيين دور جديد. يوضح قالب التشغيل السريع هذا كيف يمكنك تعريف تعيين دور في وحدة Bicep واستخدام معرف أساسي كقيمة أولية لاسم تعيين الدور.

تعريفات دور مخصصة

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

لإنشاء تعريف دور مخصص، قم بتعريف مورد من النوع Microsoft.Authorization/roleDefinitions. راجع إنشاء تعريف دور جديد عبر تشغيل سريع لتوزيع مستوى اشتراك للحصول على مثال.

يجب أن تكون أسماء موارد تعريف الدور فريدة داخل مستأجر Microsoft Entra، حتى إذا كانت النطاقات القابلة للتعيين أضيق.

إشعار

تدير بعض الخدمات تعريفات الدور والتعيينات الخاصة بها. على سبيل المثال، يحتفظ Azure Cosmos DB بالموارد Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments وMicrosoft.DocumentDB/databaseAccounts/sqlRoleDefinitions الخاصة به. لمزيد من المعلومات، راجع وثائق الخدمة المحددة.