تعيين أدوار Azure باستخدام قوالب Azure Resource Manager

التحكم في الوصول المستند إلى الدور Azure (Azure RBAC) هو نظام التخويل الذي تستخدمه لإدارة الوصول إلى موارد Azure. لمنح حق الوصول، يمكنك تعيين أدوار للمستخدمين أو المجموعات أو كيانات الخدمة أو الهويات المدارة في نطاق معين. بالإضافة إلى استخدام Azure PowerShell أو Azure CLI، يمكنك تعيين أدوار باستخدام قوالب Azure Resource Manager. يمكن أن تكون القوالب مفيدة إذا كنت بحاجة إلى نشر الموارد باستمرار وبشكل متكرر. توضح هذه المقالة كيفية تعيين الأدوار باستخدام القوالب.

إشعار

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

للتعرف على كيفية تحديد تعيينات الأدوار باستخدام Bicep، راجع إنشاء موارد Azure RBAC باستخدام Bicep. للحصول على مثال التشغيل السريع، راجع التشغيل السريع: تعيين دور Azure باستخدام Bicep.

المتطلبات الأساسية

لتعيين أدوار Azure، يجب أن يكون لديك:

يجب استخدام الإصدارات التالية:

  • 2018-09-01-preview أو لاحقا لتعيين دور Azure إلى كيان خدمة جديد
  • 2020-04-01-preview أو لاحقا لتعيين دور Azure في نطاق المورد
  • 2022-04-01 هو أول إصدار مستقر

لمزيد من المعلومات، راجع إصدارات واجهة برمجة التطبيقات من واجهات برمجة تطبيقات AZURE RBAC REST.

الحصول على معرفات الكائن

لتعيين دور، تحتاج إلى تحديد معرف المستخدم أو المجموعة أو التطبيق الذي تريد تعيين الدور إليه. يحتوي المعرف على التنسيق: 11111111-1111-1111-1111-111111111111. يمكنك الحصول على المعرف باستخدام مدخل Microsoft 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 id --output tsv)

Group (المجموعة)

للحصول على معرف مجموعة، يمكنك استخدام أوامر Get-AzADGroup أو az ad group show .

$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --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 [].id --output tsv)

التطبيق

للحصول على معرف كيان الخدمة (الهوية المستخدمة من قبل أحد التطبيقات)، يمكنك استخدام أوامر قائمة Get-AzADServicePrincipal أو az ad sp. بالنسبة إلى كيان الخدمة، استخدم معرف الكائن وليس معرف التطبيق.

$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --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": "2022-04-01",
            "name": "[guid(resourceGroup().id)]",
            "properties": {
                "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
                "principalId": "<your-principal-id>"
            }
        }
    ]
}

فيما يلي مثال أوامر إنشاء New-AzResourceGroupDeployment وaz deployment group لكيفية بدء النشر في مجموعة موارد تسمى ExampleGroup.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json

يعرض التالي مثالا لتعيين دور القارئ لمستخدم لمجموعة موارد بعد نشر القالب.

Role assignment at resource group scope

مجموعة الموارد أو نطاق الاشتراك

القالب السابق غير مرن جدا. يستخدم القالب التالي المعلمات ويمكن استخدامه في نطاقات مختلفة. يوضح القالب التالي:

  • كيفية تعيين دور لمستخدم أو مجموعة أو تطبيق في مجموعة موارد أو نطاق اشتراك
  • كيفية تحديد أدوار المالك والمساهم والقارئ كمعلمة

لاستخدام القالب، يجب تحديد المدخلات التالية:

  • معرف مستخدم أو مجموعة أو هوية مدارة أو تطبيق لتعيين الدور إليه
  • معرف فريد سيتم استخدامه لتعيين الدور، أو يمكنك استخدام المعرف الافتراضي
{
    "$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": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

إشعار

هذا القالب غير متكرر ما لم يتم توفير نفس roleNameGuid القيمة كمعلمة لكل نشر للقالب. إذا لم يتم توفير أي roleNameGuid منها، يتم إنشاء GUID جديد بشكل افتراضي على كل عملية نشر وستفشل عمليات النشر اللاحقة مع حدوث Conflict: RoleAssignmentExists خطأ.

يتم تحديد نطاق تعيين الدور من مستوى النشر. فيما يلي مثال أوامر New-AzResourceGroupDeployment وaz deployment group create لكيفية بدء النشر في نطاق مجموعة الموارد.

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

فيما يلي مثال أوامر إنشاء فرعية ل New-AzDeployment وaz deployment لكيفية بدء النشر في نطاق اشتراك وتحديد الموقع.

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": "2022-04-01",
            "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 create لكيفية بدء النشر في نطاق مورد.

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

يعرض التالي مثالا على تعيين دور المساهم لمستخدم لحساب تخزين بعد نشر القالب.

Role assignment at resource scope

كيان خدمة جديد

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

لمعالجة هذا السيناريو، يجب تعيين الخاصية principalType إلى ServicePrincipal عند إنشاء تعيين الدور. يجب عليك أيضا تعيين apiVersion تعيين الدور إلى 2018-09-01-preview أو لاحقا. 2022-04-01 هو الإصدار المستقر الأول.

يوضح القالب التالي:

  • كيفية إنشاء كيان خدمة هوية مدار جديد
  • كيفية تحديد 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": "2022-04-01",
            "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"
            }
        }
    ]
}

فيما يلي مثال أوامر New-AzResourceGroupDeployment وaz deployment group create لكيفية بدء النشر في نطاق مجموعة الموارد.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json

يعرض التالي مثالا على تعيين دور المساهم إلى كيان خدمة هوية مدار جديد بعد نشر القالب.

Role assignment for a new managed identity service principal

الخطوات التالية