Compartilhar via


Criar ou atualizar funções personalizadas do Azure usando um modelo do ARM

Se as funções internas do Azure não atenderem às necessidades específicas da sua organização, você poderá criar funções personalizadas próprias. Este artigo descreve como criar ou atualizar uma função personalizada usando um modelo do Azure Resource Manager (modelo do ARM).

Um modelo do Azure Resource Manager é um arquivo em JavaScript Object Notation (JSON) que define a infraestrutura e a configuração do seu projeto. O modelo usa a sintaxe declarativa. Você descreve a implantação pretendida sem escrever a sequência de comandos de programação para criar a implantação.

Para criar uma função personalizada, especifique um nome de função, permissões e onde a função pode ser usada. Neste artigo, você cria uma função chamada de Função Personalizada – Leitor RG com permissões de recurso que podem ser atribuídas a um escopo de assinatura ou inferior.

Se seu ambiente atender aos pré-requisitos e você estiver familiarizado com o uso de modelos ARM, selecione o botão Implantar no Azure. O modelo será aberto no portal do Azure.

Botão para implantar o modelo do Resource Manager no Azure.

Pré-requisitos

Para criar uma função personalizada, você deve ter:

Você deve usar a seguinte versão:

  • 2018-07-01 ou posterior

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

Examinar o modelo

O modelo usado neste artigo é proveniente dos Modelos de Início Rápido do Azure. O modelo tem quatro parâmetros e uma seção de recursos. Os quatro parâmetros são:

  • Matriz de ações com um valor padrão de ["Microsoft.Resources/subscriptions/resourceGroups/read"].
  • Matriz de notActions com um valor padrão vazio.
  • Nome da função com um valor padrão de Custom Role - RG Reader.
  • Descrição da função com um valor padrão de Subscription Level Deployment of a Role Definition.

O escopo onde essa função personalizada pode ser atribuída é definido como a assinatura atual.

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

O recurso definido no modelo inclui:

Implantar o modelo

Siga estas etapas para implantar o modelo anterior.

  1. Entre no portal do Azure.

  2. Abra o Azure Cloud Shell para PowerShell.

  3. Copie e cole o script a seguir no 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. Insira um local para a implantação, como centralus.

  5. Insira uma lista de ações para a função personalizada como uma lista separada por vírgulas, como Microsoft.Resources/resources/read,Microsoft.Resources/subscriptions/resourceGroups/read.

  6. Se necessário, pressione Enter para executar o comando New-AzDeployment.

    O comando New-AzDeployment implanta o modelo para criar a função personalizada.

    Será exibida uma saída semelhante à seguinte:

    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 :
    

Examinar os recursos implantados

Siga estas etapas para verificar se a função personalizada foi criada.

  1. Use o comando Get-AzRoleDefinition para listar a função personalizada.

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

    Será exibida uma saída semelhante à seguinte:

    {
      "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. No portal do Azure, abra sua assinatura.

  3. No menu à esquerda, selecione Controle de acesso (IAM) .

  4. Selecione a guia Funções.

  5. Defina a lista de Tipos como CustomRole.

  6. Verifique se a Função Personalizada – Leitor RG está listada.

    Nova função personalizada no portal do Azure

Atualizar uma função personalizada

Semelhante à criação de uma função personalizada, você pode atualizar uma função personalizada existente usando um modelo. Para atualizar uma função personalizada, você deve especificar a função que deseja atualizar.

Aqui estão as alterações que você precisaria fazer no modelo de Início Rápido anterior para atualizar a função personalizada.

  • Inclua a ID da função como um parâmetro.

        ...
        "roleDefName": {
          "type": "string",
          "metadata": {
            "description": "ID of the role definition"
          }
        ...
    
  • Inclua o parâmetro de ID da função na definição de função.

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

Aqui está um exemplo de como implantar o modelo.

$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

Limpar os recursos

Para remover a função personalizada, siga estas etapas.

  1. Execute o comando a seguir para remover a função personalizada.

    Get-AzRoleDefinition -Name "Custom Role - RG Reader" | Remove-AzRoleDefinition
    
  2. Insira Y para confirmar que deseja remover a função personalizada.

Próximas etapas