Partilhar via


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

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

Um modelo do Azure Resource Manager é um arquivo JSON (JavaScript Object Notation) que define a infraestrutura e a configuração do seu projeto. O modelo utiliza 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 Função Personalizada - Leitor RG com permissões de recursos que podem ser atribuídas em um escopo de assinatura ou inferior.

Se o seu ambiente cumpre os pré-requisitos e se está familiarizado com a utilização de modelos ARM, selecione o botão Implementar no Azure. O modelo será aberto no portal do Azure.

Button to deploy the Resource Manager template to Azure.

Pré-requisitos

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

Você deve usar a seguinte versão:

  • 2018-07-01 ou mais tarde

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

Rever o modelo

O modelo usado neste artigo é de 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 no qual essa função personalizada pode ser atribuída é definido para 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 é:

Implementar o modelo

Siga estas etapas para implantar o modelo anterior.

  1. Inicie sessão no portal do Azure.

  2. Abra o Azure Cloud Shell para PowerShell.

  3. Copie e cole o seguinte script 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írgula, como Microsoft.Resources/resources/read,Microsoft.Resources/subscriptions/resourceGroups/read.

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

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

    Deverá ver um resultado semelhante ao 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 :
    

Rever os recursos implementados

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

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

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

    Deverá ver um resultado semelhante ao 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 Tipo como CustomRole.

  6. Verifique se a função Função Personalizada - Leitor de RG está listada.

    New custom role in Azure portal

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 o ID da função como parâmetro.

        ...
        "roleDefName": {
          "type": "string",
          "metadata": {
            "description": "ID of the role definition"
          }
        ...
    
  • Inclua o parâmetro role ID 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

Clean up resources (Limpar recursos)

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

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

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

Próximos passos