Поделиться через


Назначение ролей 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 является первой стабильной версией

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

Получение идентификаторов объектов

Чтобы назначить роль, необходимо указать идентификатор пользователя, группы или приложения, которому нужно назначить роль. Идентификатор имеет формат: 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 id --output tsv)

Группа

Чтобы получить идентификатор группы, можно использовать команды 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 list. Для субъекта-службы используйте идентификатор объекта, а не идентификатор приложения.

$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 create для запуска развертывания в группе ресурсов с именем 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": "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 sub create, чтобы начать развертывание в области подписки и указать расположение.

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

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

Снимок экрана: назначение ролей в области ресурсов.

Новый служебный принципал

Если создать нового пользователя-службы и немедленно попытаться назначить ему роль, в некоторых случаях назначение роли может оказаться неудачным. Например, если создать новую управляемую идентичность, а затем попытаться назначить роль этому сервисному принципалу в том же шаблоне 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

Ниже показан пример назначения роли Участника новому служебному объекту управляемой идентичности после развертывания шаблона.

Снимок экрана назначения ролей для новой учетной записи службы управляемого идентификатора.

Дальнейшие действия