تعيين أدوار Azure باستخدام قوالب Azure Resource Manager
Azure role based access control (Azure RBAC) هو نظام التخويل الذي تستخدمه لإدارة الوصول إلى موارد Azure. لمنح حق الوصول، يمكنك تعيين أدوار للمستخدمين أو المجموعات أو كيانات الخدمة أو الهويات المدارة في نطاق معين. بالإضافة إلى استخدام Azure PowerShell أو Azure CLI، يمكنك تعيين الأدوار باستخدام قوالب Azure Resource Manager. يمكن أن تكون القوالب مفيدة إذا كنت بحاجة إلى نشر الموارد باستمرار وبشكل متكرر. توضح هذه المقالة كيفية تعيين الأدوار باستخدام القوالب.
المتطلبات الأساسية
لتعيين أدوار Azure، يجب أن يكون لديك:
Microsoft.Authorization/roleAssignments/writeالأذونات، مثل مسؤول وصول المستخدم أو المالك
الحصول على معرفات الكائنات
لتعيين دور، تحتاج إلى تحديد معرف المستخدم أو المجموعة أو التطبيق الذي تريد تعيين الدور إليه. يحتوي المعرف على التنسيق: 11111111-1111-1111-1111-111111111111. يمكنك الحصول على المعرف باستخدام مدخل Azure أو Azure PowerShell أو Azure CLI.
المستخدم
للحصول على معرف مستخدم، يمكنك استخدام الأمرين Get-AzADUser أو az ad user show .
$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query objectId --output tsv)
المجموعة
للحصول على معرف مجموعة، يمكنك استخدام أوامر عرض المجموعة الإعلانيةGet-AzADGroup أو az.
$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query objectId --output tsv)
الهويات المُدارة
للحصول على معرف هوية مدارة، يمكنك استخدام أوامر Get-AzAdServiceprincipal أو az ad sp .
$objectid = (Get-AzADServicePrincipal -DisplayName <Azure resource name>).id
objectid=$(az ad sp list --display-name <Azure resource name> --query [].objectId --output tsv)
التطبيق
للحصول على معرف أصل خدمة (الهوية المستخدمة من قبل تطبيق)، يمكنك استخدام أوامر قائمة Get-AzADServicePrincipal أو az ad sp . بالنسبة لأصل خدمة، استخدم معرف الكائن وليس معرف التطبيق.
$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].objectId --output tsv)
تعيين دور Azure
في Azure RBAC، لمنح الوصول، يمكنك تعيين دور.
نطاق مجموعة الموارد (بدون معلمات)
يعرض القالب التالي طريقة أساسية لتعيين دور. يتم تحديد بعض القيم داخل القالب. يوضح القالب التالي:
- كيفية تعيين دور القارئ إلى مستخدم أو مجموعة أو تطبيق في نطاق مجموعة موارد
لاستخدام القالب، يجب القيام بما يلي:
- إنشاء ملف JSON جديد ونسخ القالب
- الاستبدال
<your-principal-id>بمعرف مستخدم أو مجموعة أو هوية مدارة أو تطبيق لتعيين الدور إلى
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2018-09-01-preview",
"name": "[guid(resourceGroup().id)]",
"properties": {
"roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
"principalId": "<your-principal-id>"
}
}
]
}
فيما يلي مثال على إنشاء أوامر جديدة ل AzResourceGroupDeployment و az Deployment لكيفية بدء النشر في مجموعة موارد تسمى ExampleGroup.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json
يوضح ما يلي مثالا على تعيين دور القارئ لمستخدم لمجموعة موارد بعد نشر القالب.

مجموعة الموارد أو نطاق الاشتراك
القالب السابق ليس مرنا للغاية. يستخدم القالب التالي معلمات ويمكن استخدامه في نطاقات مختلفة. يوضح القالب التالي:
- كيفية تعيين دور لمستخدم أو مجموعة أو تطبيق في مجموعة موارد أو نطاق اشتراك
- كيفية تحديد أدوار المالك والمساهم والقارئ كمعلمة
لاستخدام القالب، يجب تحديد المدخلات التالية:
- معرف مستخدم أو مجموعة أو هوية مدارة أو تطبيق لتعيين الدور إليه
- معرف فريد سيتم استخدامه لتعيين الدور، أو يمكنك استخدام المعرف الافتراضي
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"principalId": {
"type": "string",
"metadata": {
"description": "The principal to assign the role to"
}
},
"builtInRoleType": {
"type": "string",
"allowedValues": [
"Owner",
"Contributor",
"Reader"
],
"metadata": {
"description": "Built-in role to assign"
}
},
"roleNameGuid": {
"type": "string",
"defaultValue": "[newGuid()]",
"metadata": {
"description": "A new GUID used to identify the role assignment"
}
}
},
"variables": {
"Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
"Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
},
"resources": [
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2018-09-01-preview",
"name": "[parameters('roleNameGuid')]",
"properties": {
"roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
"principalId": "[parameters('principalId')]"
}
}
]
}
ملاحظة
لا يكون هذا القالب متماثلا ما لم يتم توفير نفس roleNameGuid القيمة كمعلمة لكل عملية نشر للقالب. إذا لم يتم توفير لا roleNameGuid ، إنشاء معرف فريد ويب جديد بشكل افتراضي في كل عملية نشر وستفشل عمليات النشر اللاحقة بسبب Conflict: RoleAssignmentExists حدوث خطأ.
يتم تحديد نطاق تعيين الدور من مستوى النشر. فيما يلي مثال على إنشاء أوامر جديدة ل AzResourceGroupDeployment و az Deployment لكيفية بدء النشر في نطاق مجموعة موارد.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader
فيما يلي مثال على إنشاء أوامر فرعية لنشرAzDeployment و az لكيفية بدء النشر في نطاق اشتراك وتحديد الموقع.
New-AzDeployment -Location centralus -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment sub create --location centralus --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader
نطاق المورد
إذا كنت بحاجة إلى تعيين دور على مستوى مورد، فقم بتعيين scope الخاصية في تعيين الدور إلى اسم المورد.
يوضح القالب التالي:
- كيفية إنشاء حساب تخزين جديد
- كيفية تعيين دور لمستخدم أو مجموعة أو تطبيق في نطاق حساب التخزين
- كيفية تحديد أدوار المالك والمساهم والقارئ كمعلمة
لاستخدام القالب، يجب تحديد المدخلات التالية:
- معرف مستخدم أو مجموعة أو هوية مدارة أو تطبيق لتعيين الدور إليه
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"principalId": {
"type": "string",
"metadata": {
"description": "The principal to assign the role to"
}
},
"builtInRoleType": {
"type": "string",
"allowedValues": [
"Owner",
"Contributor",
"Reader"
],
"metadata": {
"description": "Built-in role to assign"
}
},
"roleNameGuid": {
"type": "string",
"defaultValue": "[newGuid()]",
"metadata": {
"description": "A new GUID used to identify the role assignment"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"variables": {
"Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
"Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
"Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
"storageName": "[concat('storage', uniqueString(resourceGroup().id))]"
},
"resources": [
{
"apiVersion": "2019-04-01",
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2020-04-01-preview",
"name": "[parameters('roleNameGuid')]",
"scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageName'))]",
"dependsOn": [
"[variables('storageName')]"
],
"properties": {
"roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
"principalId": "[parameters('principalId')]"
}
}
]
}
لنشر القالب السابق، يمكنك استخدام أوامر مجموعة الموارد. فيما يلي مثال على إنشاء أوامر New-AzResourceGroupDeployment و az deployment Group لكيفية بدء النشر في نطاق مورد.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Contributor
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Contributor
يوضح ما يلي مثالا على تعيين دور المساهم لمستخدم لحساب تخزين بعد نشر القالب.

مدير الخدمة الجديد
إذا قمت بإنشاء مدير خدمة جديد وحاولت على الفور تعيين دور لمدير الخدمة هذا، فقد يفشل تعيين الدور هذا في بعض الحالات. على سبيل المثال، إذا قمت بإنشاء هوية مدارة جديدة ثم حاولت تعيين دور لمدير الخدمة هذا في نفس قالب Azure Resource Manager، فقد يفشل تعيين الدور. من المحتمل أن يكون سبب هذا الفشل هو تأخير النسخ المتماثل. يتم إنشاء مبدأ الخدمة في منطقة واحدة. ومع ذلك، قد يحدث تعيين الدور في منطقة مختلفة لم تقم بنسخ أصل الخدمة بعد.
لمعالجة هذا السيناريو، يجب تعيين الخاصية إلى ServicePrincipal عند إنشاء تعيين principalType الدور. يجب عليك أيضا تعيين تعيين apiVersion الدور إلى 2018-09-01-preview أو أحدث.
يوضح القالب التالي:
- كيفية إنشاء مبدأ خدمة هوية مدار جديد
- كيفية تحديد
principalType - كيفية تعيين دور المساهم إلى مدير الخدمة هذا في نطاق مجموعة موارد
لاستخدام القالب، يجب تحديد المدخلات التالية:
- الاسم الأساسي للهوية المدارة، أو يمكنك استخدام السلسلة الافتراضية
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"baseName": {
"type": "string",
"defaultValue": "msi-test"
}
},
"variables": {
"identityName": "[concat(parameters('baseName'), '-bootstrap')]",
"bootstrapRoleAssignmentId": "[guid(concat(resourceGroup().id, 'contributor'))]",
"contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
},
"resources": [
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"name": "[variables('identityName')]",
"apiVersion": "2018-11-30",
"location": "[resourceGroup().location]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2018-09-01-preview",
"name": "[variables('bootstrapRoleAssignmentId')]",
"dependsOn": [
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
],
"properties": {
"roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), '2018-11-30').principalId]",
"principalType": "ServicePrincipal"
}
}
]
}
فيما يلي مثال على إنشاء أوامر جديدة ل AzResourceGroupDeployment و az Deployment لكيفية بدء النشر في نطاق مجموعة موارد.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json
يوضح ما يلي مثالا على تعيين دور المساهم إلى أصل خدمة هوية مدارة جديد بعد نشر القالب.
