Создание или изменение пользовательских ролей Azure с помощью шаблона ARM

Если встроенные роли Azure не соответствуют потребностям вашей организации, вы можете создать собственные пользовательские роли. В этой статье описываются создание и обновление пользовательской роли с помощью шаблона Azure Resource Manager (ARM).

Шаблон Azure Resource Manager — это файл нотации объектов JavaScript (JSON), который определяет инфраструктуру и конфигурацию проекта. В шаблоне используется декларативный синтаксис. Вы описываете предполагаемое развертывание без написания последовательности команд программирования для создания развертывания.

Чтобы создать пользовательскую роль, необходимо указать имя роли, разрешения и место, где ее можно использовать. В этой статье вы создадите роль с именем Custom Role - RG Reader и разрешениями ресурсов, которые могут быть назначены в области подписки или на более низких уровнях.

Если среда соответствует предварительным требованиям и вы знакомы с использованием шаблонов ARM, нажмите кнопку Развертывание в Azure. Шаблон откроется на портале Azure.

Button to deploy the Resource Manager template to Azure.

Необходимые компоненты

Для создания пользовательской роли необходимо следующее:

Необходимо использовать следующую версию:

  • 2018-07-01 или более поздней версии.

Дополнительные сведения см. в версиях API REST API Azure RBAC.

Изучение шаблона

Шаблон, используемый в этой статье, взят из шаблонов быстрого запуска Azure. Шаблон содержит четыре параметра и раздел ресурсов. Вот эти четыре параметра:

  • Массив действий со значением по умолчанию ["Microsoft.Resources/subscriptions/resourceGroups/read"].
  • Массив notActions с пустым значением по умолчанию.
  • Имя роли со значением по умолчанию Custom Role - RG Reader.
  • Описание роли со значением по умолчанию Subscription Level Deployment of a Role Definition.

Область, в которой можно назначить эту пользовательскую роль, назначается текущей подписке.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.25.53.49325",
      "templateHash": "16704138909949665309"
    }
  },
  "parameters": {
    "actions": {
      "type": "array",
      "defaultValue": [
        "Microsoft.Resources/subscriptions/resourceGroups/read"
      ],
      "metadata": {
        "description": "Array of actions for the roleDefinition"
      }
    },
    "notActions": {
      "type": "array",
      "defaultValue": [],
      "metadata": {
        "description": "Array of notActions for the roleDefinition"
      }
    },
    "roleName": {
      "type": "string",
      "defaultValue": "Custom Role - RG Reader",
      "metadata": {
        "description": "Friendly name of the role definition"
      }
    },
    "roleDescription": {
      "type": "string",
      "defaultValue": "Subscription Level Deployment of a Role Definition",
      "metadata": {
        "description": "Detailed description of the role definition"
      }
    }
  },
  "variables": {
    "roleDefName": "[guid(parameters('roleName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/roleDefinitions",
      "apiVersion": "2022-04-01",
      "name": "[variables('roleDefName')]",
      "properties": {
        "roleName": "[parameters('roleName')]",
        "description": "[parameters('roleDescription')]",
        "type": "customRole",
        "permissions": [
          {
            "actions": "[parameters('actions')]",
            "notActions": "[parameters('notActions')]"
          }
        ],
        "assignableScopes": [
          "[subscription().id]"
        ]
      }
    }
  ]
}

В шаблоне определен следующий ресурс:

Развертывание шаблона

Чтобы развернуть предыдущий шаблон, выполните указанные ниже действия.

  1. Войдите на портал Azure.

  2. Откройте Azure Cloud Shell для PowerShell.

  3. Скопируйте и вставьте следующий скрипт в Cloud Shell.

    $location = Read-Host -Prompt "Enter a location (i.e. centralus)"
    [string[]]$actions = Read-Host -Prompt "Enter actions as a comma-separated list (i.e. action1,action2)"
    $actions = $actions.Split(',')
    $templateUri = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/create-role-def/azuredeploy.json"
    New-AzDeployment -Location $location -TemplateUri $templateUri -actions $actions
    
  4. Введите расположение для развертывания, например centralus.

  5. Введите список действий для пользовательской роли в виде списка с разделителями-запятыми, например Microsoft.Resources/resources/read,Microsoft.Resources/subscriptions/resourceGroups/read.

  6. При необходимости нажмите клавишу ВВОД, чтобы выполнить команду New-AzDeployment.

    Команда New-AzDeployment развертывает шаблон для создания пользовательской роли.

    Вы должны увидеть результат, аналогичный приведенному ниже:

    PS> New-AzDeployment -Location $location -TemplateUri $templateUri -actions $actions
    
    Id                      : /subscriptions/{subscriptionId}/providers/Microsoft.Resources/deployments/azuredeploy
    DeploymentName          : azuredeploy
    Location                : centralus
    ProvisioningState       : Succeeded
    Timestamp               : 6/25/2020 8:08:32 PM
    Mode                    : Incremental
    TemplateLink            :
                              Uri            : https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/create-role-def/azuredeploy.json
                              ContentVersion : 1.0.0.0
    
    Parameters              :
                              Name               Type                       Value
                              =================  =========================  ==========
                              actions            Array                      [
                                "Microsoft.Resources/resources/read",
                                "Microsoft.Resources/subscriptions/resourceGroups/read"
                              ]
                              notActions         Array                      []
                              roleName           String                     Custom Role - RG Reader
                              roleDescription    String                     Subscription Level Deployment of a Role Definition
    
    Outputs                 :
    DeploymentDebugLogLevel :
    

Просмотр развернутых ресурсов

Выполните следующие действия, чтобы убедиться, что пользовательская роль создана.

  1. Отобразите пользовательскую роль с помощью команды Get-AzRoleDefinition.

    Get-AzRoleDefinition "Custom Role - RG Reader" | ConvertTo-Json
    

    Вы должны увидеть результат, аналогичный приведенному ниже:

    {
      "Name": "Custom Role - RG Reader",
      "Id": "11111111-1111-1111-1111-111111111111",
      "IsCustom": true,
      "Description": "Subscription Level Deployment of a Role Definition",
      "Actions": [
        "Microsoft.Resources/resources/read",
        "Microsoft.Resources/subscriptions/resourceGroups/read"
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": [],
      "AssignableScopes": [
        "/subscriptions/{subscriptionId}"
      ]
    }
    
  2. Откройте свою подписку на портале Azure.

  3. В меню слева выберите Управление доступом (IAM).

  4. Выберите вкладку Роли.

  5. В списке Типы выберите значение CustomRole.

  6. Убедитесь, что в списке есть роль Custom Role - RG Reader.

    New custom role in Azure portal

Обновление пользовательской роли

Существующую пользовательскую роль можно обновить, используя шаблон, как при создании пользовательской роли. Чтобы обновить пользовательскую роль, необходимо указать роль, которую требуется обновить.

Ниже указаны изменения, которые нужно внести в предыдущий шаблон быстрого запуска для обновления пользовательской роли.

  • Включите идентификатор роли в качестве параметра.

        ...
        "roleDefName": {
          "type": "string",
          "metadata": {
            "description": "ID of the role definition"
          }
        ...
    
  • Включите параметр идентификатора роли в определение роли.

      ...
      "resources": [
        {
          "type": "Microsoft.Authorization/roleDefinitions",
          "apiVersion": "2022-04-01",
          "name": "[parameters('roleDefName')]",
          "properties": {
            ...
    

Ниже показан пример развертывания шаблона.

$location = Read-Host -Prompt "Enter a location (i.e. centralus)"
[string[]]$actions = Read-Host -Prompt "Enter actions as a comma-separated list (i.e. action1,action2)"
$actions = $actions.Split(',')
$roleDefName = Read-Host -Prompt "Enter the role ID to update"
$templateFile = "rg-reader-update.json"
New-AzDeployment -Location $location -TemplateFile $templateFile -actions $actions -roleDefName $roleDefName

Очистка ресурсов

Чтобы удалить пользовательскую роль, выполните указанные действия.

  1. Выполните следующую команду, чтобы создать новую пользовательскую роль.

    Get-AzRoleDefinition -Name "Custom Role - RG Reader" | Remove-AzRoleDefinition
    
  2. Введите Y, чтобы подтвердить удаление пользовательской роли.

Следующие шаги