Creación o actualización de roles personalizados de Azure mediante una plantilla de ARM

Si los roles integrados de Azure no cumplen las necesidades específicas de su organización, puede crear los suyos propios. En este artículo se describe cómo crear o actualizar un rol personalizado mediante una plantilla de Azure Resource Manager (ARM).

Una plantilla de Azure Resource Manager es un archivo de notación de objetos JavaScript (JSON) que define tanto la infraestructura como la configuración de un proyecto. La plantilla usa sintaxis declarativa. Se describe la implementación deseada sin escribir la secuencia de comandos de programación para crear la implementación.

Para crear un rol personalizado, especifique un nombre de rol, los permisos y dónde se puede usar el rol. En este artículo, se creará un rol denominado Rol personalizado: lector RG con permisos de recursos que se pueden asignar en un ámbito de suscripción o inferior.

Si su entorno cumple los requisitos previos y está familiarizado con el uso de plantillas de Resource Manager, seleccione el botón Implementar en Azure. La plantilla se abrirá en Azure Portal.

Button to deploy the Resource Manager template to Azure.

Requisitos previos

Para crear un rol personalizado, debe tener:

Debe usar la versión siguiente:

  • 2018-07-01 o posterior

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

Revisión de la plantilla

La plantilla usada en este artículo forma parte de las plantillas de inicio rápido de Azure. La plantilla tiene cuatro parámetros y una sección de recursos. Los cuatro parámetros son:

  • Matriz de acciones con un valor predeterminado de ["Microsoft.Resources/subscriptions/resourceGroups/read"].
  • Matriz de notActions con un valor predeterminado vacío.
  • Nombre del rol con un valor predeterminado de Custom Role - RG Reader.
  • Descripción del rol con un valor predeterminado de Subscription Level Deployment of a Role Definition.

El ámbito en el que se puede asignar este rol personalizado se establece en la suscripción actual.

{
  "$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]"
        ]
      }
    }
  ]
}

El recurso definido en la plantilla es el siguiente:

Implementación de la plantilla

Siga estos pasos para implementar la plantilla anterior.

  1. Inicie sesión en Azure Portal.

  2. Abra Azure Cloud Shell para PowerShell.

  3. Copie y pegue el siguiente script en 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. Escriba una ubicación para la implementación, como centralus.

  5. Escriba una lista de acciones para el rol personalizado como una lista separada por comas, como Microsoft.Resources/resources/read,Microsoft.Resources/subscriptions/resourceGroups/read.

  6. Si es necesario, presione Entrar para ejecutar el comando New-AzDeployment.

    El comando New-AzDeployment implementa la plantilla para crear el rol personalizado.

    Debería ver un resultado similar al siguiente:

    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 :
    

Revisión de los recursos implementados

Siga estos pasos para comprobar que se ha creado el rol personalizado.

  1. Ejecute el comando Get-AzRoleDefinition para mostrar el rol personalizado.

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

    Debería ver un resultado similar al siguiente:

    {
      "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. Abra la suscripción en Azure Portal.

  3. En el menú izquierdo, seleccione Control de acceso (IAM) .

  4. Seleccione la pestaña Roles.

  5. Establezca la lista Tipo en CustomRole.

  6. Compruebe que se muestre el rol Rol personalizado: lector RG.

    New custom role in Azure portal

Actualización de un rol personalizado

De forma similar a la creación de un rol personalizado, puede actualizar un rol personalizado existente mediante una plantilla. Para actualizar un rol personalizado, debe especificar el rol que quiere actualizar.

Estos son los cambios que debe realizar en la plantilla de inicio rápido anterior para actualizar el rol personalizado.

  • Incluya el id. de rol como parámetro.

        ...
        "roleDefName": {
          "type": "string",
          "metadata": {
            "description": "ID of the role definition"
          }
        ...
    
  • Incluya el parámetro de id. de rol en la definición de roles.

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

A continuación proporcionamos un ejemplo de cómo implementar la plantilla.

$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

Limpieza de recursos

Para quitar el rol personalizado, siga estos pasos.

  1. Ejecute el siguiente comando para quitar el rol personalizado.

    Get-AzRoleDefinition -Name "Custom Role - RG Reader" | Remove-AzRoleDefinition
    
  2. Escriba Y para confirmar que desea quitar el rol personalizado.

Pasos siguientes