Asignación de roles de Azure mediante plantillas de Azure Resource Manager

El control de acceso basado en rol (RBAC) de Azure es el sistema de autorización que puede utilizar para administrar el acceso a los recursos de Azure. Para conceder acceso, debe asignar roles a usuarios, grupos, entidades de servicio o identidades administradas en un ámbito determinado. Además de usar Azure PowerShell o la CLI de Azure, puede asignar roles mediante plantillas de Azure Resource Manager. Las plantillas se pueden usar si necesita implementar recursos de manera repetida y uniforme. En este artículo se describe cómo asignar roles mediante plantillas.

Nota:

Bicep es un nuevo lenguaje para definir los recursos de Azure. Ofrece una experiencia de creación más sencilla que JSON, junto con otras características que ayudan a mejorar la calidad de la infraestructura como código. Se recomienda que cualquier usuario nuevo en la infraestructura como código en Azure utilice Bicep en lugar de JSON.

Para más información sobre cómo definir asignaciones de roles mediante Bicep, consulte Creación de recursos de RBAC de Azure mediante Bicep. Para ver un ejemplo de inicio rápido, consulte Inicio rápido: Asignación de un rol de Azure mediante Bicep.

Requisitos previos

Para asignar roles de Azure, es necesario tener:

Debe usar las versiones siguientes:

  • 2018-09-01-preview o posterior para asignar un rol de Azure a una nueva entidad de servicio
  • 2020-04-01-preview o posterior para asignar un rol de Azure en el ámbito del recurso
  • 2022-04-01 es la primera versión estable

Para obtener más información, consulte Versiones de la API REST de RBAC de Azure.

Obtener los identificadores de objeto

Para asignar un rol, debe especificar el identificador del usuario, del grupo o de la aplicación a los que quiere asignar el rol. El identificador tiene el formato: 11111111-1111-1111-1111-111111111111. Puede obtenerlo mediante Azure Portal, Azure PowerShell o la CLI de Azure.

Usuario

Para obtener el identificador de un usuario, puede usar los comandos Get-AzADUser o az ad user show.

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

Group (Grupo)

Para obtener el identificador de un grupo, puede usar los comandos Get-AzADGroup o az ad group show.

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

Identidades administradas

Para obtener el identificador de una identidad administrada, puede usar los comandos Get-AzAdServiceprincipal o 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)

Aplicación

Para obtener el identificador de una entidad de servicio (identidad usada por una aplicación), puede usar los comandos Get-AzADServicePrincipal o az ad sp list. Para una entidad de servicio, use el id. de objeto y no el de aplicación.

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

Asignación de un rol de Azure

En RBAC, para conceder acceso es preciso asignar un rol.

Ámbito del grupo de recursos (sin parámetros)

La plantilla siguiente muestra una manera básica de asignar un rol. Algunos valores se especifican en la plantilla. La plantilla siguiente muestra:

  • Cómo asignar el rol de lector a un usuario, un grupo o una aplicación, en el ámbito de un grupo de recursos

Para usar la plantilla, debe hacer lo siguiente:

  • Cree un archivo JSON y copie la plantilla.
  • Reemplace <your-principal-id> por el identificador de un usuario, de un grupo o de una aplicación a los que se va a asignar el rol.
{
    "$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>"
            }
        }
    ]
}

Los comandos New-AzResourceGroupDeployment y az deployment group create son ejemplos de cómo iniciar la implementación de un grupo de recursos llamado ExampleGroup.

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

A continuación se muestra un ejemplo de la asignación del rol de lector a un usuario de un grupo de recursos después de implementar la plantilla.

Role assignment at resource group scope

Ámbito del grupo de recursos o suscripción

La plantilla anterior no es muy flexible. La siguiente plantilla usa parámetros y se puede emplear en distintos ámbitos. La plantilla siguiente muestra:

  • Cómo asignar un rol a un usuario, un grupo o una aplicación en el ámbito de un grupo de recursos o de una suscripción
  • Cómo especificar los roles de propietario, colaborador y lector como parámetro

Para usar la plantilla, debe especificar las siguientes entradas:

  • El identificador de un usuario, de un grupo o de una aplicación al que se asignará el rol.
  • Un identificador único que se usará para la asignación de roles (también puede usar el identificador predeterminado).
{
    "$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:

Esta plantilla no es idempotente, a menos que se proporcione el mismo valor roleNameGuid como parámetro para cada implementación de la plantilla. Si no se proporciona roleNameGuid, de manera predeterminada se generará un nuevo GUID en cada implementación y se producirá un error Conflict: RoleAssignmentExists en las implementaciones posteriores.

El ámbito de la asignación de roles se determina a partir del nivel de la implementación. Los comandos New-AzResourceGroupDeployment y az deployment group create son ejemplos de cómo iniciar la implementación en el ámbito de un 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

Los comandos New-AzDeployment y az deployment sub create son ejemplos de cómo iniciar la implementación en el ámbito de una suscripción y especificar la ubicación.

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 de recursos

Si necesita asignar un rol en el nivel de un recurso, establezca la propiedad scope en la asignación de roles en el nombre del recurso.

La plantilla siguiente muestra:

  • Procedimientos para crear una cuenta de almacenamiento
  • Cómo asignar un rol a un usuario, un grupo o una aplicación, en el ámbito de una cuenta de almacenamiento
  • Cómo especificar los roles de propietario, colaborador y lector como parámetro

Para usar la plantilla, debe especificar las siguientes entradas:

  • El identificador de un usuario, de un grupo o de una aplicación al que se asignará el rol.
{
    "$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 implementar la plantilla anterior, usará los comandos de grupo de recursos. Los comandos New-AzResourceGroupDeployment y az deployment group create son ejemplos de cómo iniciar la implementación en el ámbito de un 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 continuación se muestra un ejemplo de una asignación de rol de colaborador a un usuario de una cuenta de almacenamiento después de implementar la plantilla.

Role assignment at resource scope

Nueva entidad de servicio

Si crea una entidad de servicio e inmediatamente intenta asignarle un rol, esa asignación de roles puede producir un error en algunos casos. Por ejemplo, si crea una identidad administrada y luego intenta asignarle un rol en la misma plantilla de Azure Resource Manager, la asignación de roles podría producir un error. Es probable que el motivo de este error sea un retraso en la replicación. La entidad de servicio se crea en una región; sin embargo, la asignación de roles puede tener lugar en una región distinta que todavía no haya replicado la entidad de servicio.

Para abordar este escenario, debe establecer la propiedad principalType en ServicePrincipal al crear la asignación de roles. También debe establecer la propiedad apiVersion de la asignación de roles en 2018-09-01-preview o posterior. 2022-04-01 es la primera versión estable.

La plantilla siguiente muestra:

  • Cómo crear una entidad de servicio de identidad administrada
  • Cómo especificar principalType
  • Cómo asignar el rol de colaborador a esa entidad de servicio en el ámbito de un grupo de recursos

Para usar la plantilla, debe especificar las siguientes entradas:

  • El nombre base de la identidad administrada, o puede usar la cadena predeterminada.
{
    "$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"
            }
        }
    ]
}

Los comandos New-AzResourceGroupDeployment y az deployment group create son ejemplos de cómo iniciar la implementación en el ámbito de un grupo de recursos.

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

A continuación se muestra un ejemplo de la asignación del rol de colaborador a una nueva entidad de servicio de identidad administrada después de implementar la plantilla.

Role assignment for a new managed identity service principal

Pasos siguientes