Назначение ролей 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 необходимо наличие:
Microsoft.Authorization/roleAssignments/write
разрешения, такие как контроль доступа Администратор istrator на основе ролей или Администратор istrator пользователя
Необходимо использовать следующие версии:
2018-09-01-preview
или более поздней версии, чтобы назначить роль Azure новому субъекту-службе2020-04-01-preview
или более поздней версии, чтобы назначить роль Azure в область ресурсов2022-04-01
является первой стабильной версией
Дополнительные сведения см. в версиях API REST API Azure RBAC.
Получение идентификаторов объектов
Чтобы назначить роль, необходимо указать идентификатор пользователя, группы или приложения для назначения роли. Идентификатор имеет следующий формат: 11111111-1111-1111-1111-111111111111
. Этот идентификатор можно получить с помощью портала Azure, Azure PowerShell или Azure CLI.
User
Чтобы получить идентификатор пользователя, можно использовать команды 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, нужно присвоить роль.
Область группы ресурсов (без параметров)
Следующий шаблон демонстрирует базовый способ назначения роли. Некоторые значения указываются в шаблоне. Приведенный ниже шаблон демонстрирует:
- как назначить роль Reader пользователю, группе или приложению в области действия группы ресурсов.
Чтобы использовать шаблон, необходимо выполнить следующие действия:
- создать новый 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 create, показывающие, как запустить развертывание в группе ресурсов с именем ExampleGroup.
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json
Ниже приведен пример назначения роли Reader пользователю для группы ресурсов после развертывания шаблона.
Группа ресурсов или область подписки
Предыдущий шаблон не очень гибкий. В следующем шаблоне используются параметры, и его можно использовать в разных областях. Приведенный ниже шаблон демонстрирует:
- как назначить роль пользователю, группе или приложению в области группы ресурсов или подписки;
- как задать роли владельца, участника или читателя в качестве параметра.
Чтобы использовать шаблон, необходимо указать следующие входные данные:
- Идентификатор пользователя, группы, управляемого удостоверения или приложения для назначения роли
- уникальный идентификатор, который будет использоваться для назначения ролей (можно также использовать идентификатор по умолчанию).
{
"$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
Ниже приведен пример назначения роли Contributor пользователю для учетной записи хранения после развертывания шаблона.
Новый субъект-служба
Если вы создадите новый субъект-службу и сразу же попытаетесь назначить роль этому субъекту-службе, в некоторых случаях такое назначение роли может завершиться ошибкой. Например, если создать новое управляемое удостоверение и затем попытаться назначить роль этому субъекту-службе в том же шаблоне Azure Resource Manager, назначение роли может завершиться ошибкой. Наиболее вероятной причиной этой ошибки является задержка репликации. Субъект-служба создается в одном регионе; однако назначение ролей может происходить в другом регионе, который еще не реплицировал субъект-службу.
Для решения этой проблемы при создании назначения ролей необходимо задать для свойства principalType
значение ServicePrincipal
. Необходимо также задать для apiVersion
назначения ролей версию 2018-09-01-preview
или более позднюю. 2022-04-01
— первая стабильная версия.
Приведенный ниже шаблон демонстрирует:
- как создать новый субъект-службу управляемого удостоверения;
- как указать свойство
principalType
; - как назначить роль Contributor этому субъекту-службе в области группы ресурсов.
Чтобы использовать шаблон, необходимо указать следующие входные данные:
- базовое имя управляемого удостоверения (можно также использовать строку по умолчанию).
{
"$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
Ниже приведен пример назначения роли Contributor новому субъекту-службе управляемого удостоверения после развертывания шаблона.