Atribuir funções do Azure usando modelos do Azure Resource Manager

O controle de acesso baseado em função do Azure (Azure RBAC) é o sistema de autorização que você usa para gerenciar o acesso aos recursos do Azure. Para conceder acesso, atribua funções a utilizadores, grupos, principais de serviço ou identidades geridas num determinado âmbito. Além de usar o Azure PowerShell ou a CLI do Azure, você pode atribuir funções usando modelos do Azure Resource Manager. Os modelos podem ser úteis se você precisar implantar recursos de forma consistente e repetida. Este artigo descreve como atribuir funções usando modelos.

Nota

O Bicep é uma nova linguagem para definir seus recursos do Azure. Ele tem uma experiência de criação mais simples do que o JSON, juntamente com outros recursos que ajudam a melhorar a qualidade da sua infraestrutura como código. Recomendamos que qualquer pessoa nova na infraestrutura como código no Azure use Bicep em vez de JSON.

Para saber mais sobre como definir atribuições de função usando o Bicep, consulte Criar recursos do RBAC do Azure usando o Bicep. Para obter um exemplo de início rápido, consulte Guia de início rápido: atribuir uma função do Azure usando o Bicep.

Pré-requisitos

Para atribuir funções do Azure, tem de ter:

Você deve usar as seguintes versões:

  • 2018-09-01-preview ou posterior para atribuir uma função do Azure a uma nova entidade de serviço
  • 2020-04-01-preview ou posterior para atribuir uma função do Azure no escopo do recurso
  • 2022-04-01 é a primeira versão estável

Para obter mais informações, consulte Versões de API das APIs REST do RBAC do Azure.

Obter IDs de objeto

Para atribuir uma função, você precisa especificar a ID do usuário, grupo ou aplicativo ao qual deseja atribuir a função. O ID tem o formato: 11111111-1111-1111-1111-111111111111. Você pode obter a ID usando o portal do Azure, o Azure PowerShell ou a CLI do Azure.

Utilizador

Para obter a ID de um usuário, você pode usar os comandos Get-AzADUser ou az ad user show .

$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query id --output tsv)

Agrupar

Para obter a ID de um grupo, você pode usar os comandos Get-AzADGroup ou az ad group show .

$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --output tsv)

Identidades geridas

Para obter a ID de uma identidade gerenciada, você pode usar os comandos Get-AzAdServiceprincipal ou 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)

Aplicação

Para obter a ID de uma entidade de serviço (identidade usada por um aplicativo), você pode usar os comandos Get-AzADServicePrincipal ou az ad sp list . Para uma entidade de serviço, use a ID do objeto e não a ID do aplicativo.

$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --output tsv)

Atribuir uma função do Azure

No RBAC do Azure, para conceder acesso, você atribui uma função.

Escopo do grupo de recursos (sem parâmetros)

O modelo a seguir mostra uma maneira básica de atribuir uma função. Alguns valores são especificados no modelo. O modelo a seguir demonstra:

  • Como atribuir a função Leitor a um usuário, grupo ou aplicativo no escopo de um grupo de recursos

Para usar o modelo, você deve fazer o seguinte:

  • Criar um novo arquivo JSON e copiar o modelo
  • Substitua <your-principal-id> pela ID de um usuário, grupo, identidade gerenciada ou aplicativo ao qual atribuir a função
{
    "$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>"
            }
        }
    ]
}

Aqui estão os exemplos New-AzResourceGroupDeployment e az deployment group create comandos para como iniciar a implantação em um grupo de recursos chamado ExampleGroup.

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

A seguir mostra um exemplo da atribuição da função Leitor a um usuário para um grupo de recursos após a implantação do modelo.

Role assignment at resource group scope

Grupo de recursos ou âmbito da subscrição

O modelo anterior não é muito flexível. O modelo a seguir usa parâmetros e pode ser usado em escopos diferentes. O modelo a seguir demonstra:

  • Como atribuir uma função a um usuário, grupo ou aplicativo em um grupo de recursos ou escopo de assinatura
  • Como especificar as funções Proprietário, Colaborador e Leitor como parâmetro

Para usar o modelo, você deve especificar as seguintes entradas:

  • A ID de um usuário, grupo, identidade gerenciada ou aplicativo ao qual atribuir a função
  • Uma ID exclusiva que será usada para a atribuição de função ou você pode usar a ID padrão
{
    "$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')]"
            }
        }
    ]
}

Nota

Este modelo não é idempotente, a menos que o mesmo roleNameGuid valor seja fornecido como parâmetro para cada implantação do modelo. Se não roleNameGuid for fornecido, por padrão, um novo GUID será gerado em cada implantação e as implantações subsequentes falharão com um Conflict: RoleAssignmentExists erro.

O escopo da atribuição de função é determinado a partir do nível da implantação. Aqui estão os exemplos New-AzResourceGroupDeployment e az deployment group create comandos para como iniciar a implantação em um escopo de grupo de recursos.

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

Aqui estão exemplos de comandos New-AzDeployment e az deployment sub create para como iniciar a implantação em um escopo de assinatura e especificar o local.

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

Âmbito do recurso

Se você precisar atribuir uma função no nível de um recurso, defina a scope propriedade na atribuição de função como o nome do recurso.

O modelo a seguir demonstra:

  • Como criar uma nova conta de armazenamento
  • Como atribuir uma função a um usuário, grupo ou aplicativo no escopo da conta de armazenamento
  • Como especificar as funções Proprietário, Colaborador e Leitor como parâmetro

Para usar o modelo, você deve especificar as seguintes entradas:

  • A ID de um usuário, grupo, identidade gerenciada ou aplicativo ao qual atribuir a função
{
    "$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')]"
            }
        }
    ]
}

Para implantar o modelo anterior, use os comandos do grupo de recursos. Aqui estão os exemplos New-AzResourceGroupDeployment e az deployment group create comandos para como iniciar a implantação em um escopo de recurso.

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

A seguir mostra um exemplo da atribuição da função de Colaborador a um usuário para uma conta de armazenamento após a implantação do modelo.

Role assignment at resource scope

Nova entidade de serviço

Se você criar uma nova entidade de serviço e tentar atribuir imediatamente uma função a essa entidade de serviço, essa atribuição de função poderá falhar em alguns casos. Por exemplo, se você criar uma nova identidade gerenciada e tentar atribuir uma função a essa entidade de serviço no mesmo modelo do Azure Resource Manager, a atribuição de função poderá falhar. A razão para essa falha é provavelmente um atraso na replicação. A entidade de serviço é criada em uma região; no entanto, a atribuição de função pode ocorrer em uma região diferente que ainda não replicou a entidade de serviço.

Para resolver esse cenário, você deve definir a propriedade como ServicePrincipal ao criar a principalType atribuição de função. Também tem de definir a apiVersion da atribuição de função como 2018-09-01-preview ou posterior. 2022-04-01 é a primeira versão estável.

O modelo a seguir demonstra:

  • Como criar uma nova entidade de serviço de identidade gerenciada
  • Como especificar o principalType
  • Como atribuir a função de Colaborador a essa entidade de serviço em um escopo de grupo de recursos

Para usar o modelo, você deve especificar as seguintes entradas:

  • O nome base da identidade gerenciada ou você pode usar a cadeia de caracteres padrão
{
    "$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"
            }
        }
    ]
}

Aqui estão os exemplos New-AzResourceGroupDeployment e az deployment group create comandos para como iniciar a implantação em um escopo de grupo de recursos.

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

A seguir mostra um exemplo da atribuição da função de Colaborador a uma nova entidade de serviço de identidade gerenciada após a implantação do modelo.

Role assignment for a new managed identity service principal

Próximos passos