Como criar uma função personalizada para RBAC
Tags: azure, security, devops, sre
Published: 2021-12-27 12:57:44

## Função de diretório e RBAC

Ao usar o Azure AD, muitas pessoas ficam confusas porque não entendem a diferença entre funções de diretório e RBAC (Controle de Acesso Baseado em Recursos), falo por mim e minha dificuldades de forma generalista (beneficios de escrever esse post :p).

As funções de diretório são configurações de privilégios para recursos do Azure AD (usuários, grupos, acesso condicional etc. nas entradas do Azure Active Directory no portal do Azure), enquanto o RBAC está além do escopo do Azure AD, como a Rede do Azure.) É a configuração de permissão usar.

Não vou entrar em detalhes aqui, mas os seguintes blogs da Microsoft são muito fáceis de entender. [https://docs.microsoft.com/pt-br/azure/role-based-access-control/overview](https://docs.microsoft.com/pt-br/azure/role-based-access-control/overview)

## Eu quero usar o RBAC de forma mais flexível

RBAC tem funções padrão como co-administrador, proprietário, etc. (atribuições de funções adicionais na tela abaixo)

![https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62u7uu1pli6fvcikytps.png](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62u7uu1pli6fvcikytps.png)

No entanto, em alguns casos, a função padrão é muito poderosa ou isso seria perfeito se eu pudesse fazer isso com um teste. Acho que existem algumas situações como essa. E ai que entra as funções personalizadas.

Bora no passo a paso por que e complicadinho ><

## Etapa 1. Entenda como é a função personalizada

Antes de configurar uma função personalizada, vamos primeiro entender como o RBAC é configurado.
Vamos verificar as funções padrão das configurações de co-administrador e colaborador de rede no Powershell.

```powershell
Get-AzRoleDefinition | where Name -eq "Contributor"

Name             : Contributor
Id               : b24988ac-6180-42a0-ab88-20f7382dd24c
IsCustom         : False
Description      : Lets you manage everything except access to resources.
Actions          : {*}
NotActions       : {Microsoft.Authorization/*/Delete, Microsoft.Authorization/*/Write, Microsoft.Authorization/elevateAccess/Action, Microsoft.Blueprint/blueprintAssignments/write...}
DataActions      : {}
NotDataActions   : {}
AssignableScopes : {/}
```

```powershell
Get-AzRoleDefinition | where Name -eq "Network Contributor"

Name             : Network Contributor
Id               : 4d97b98b-1d4f-4787-a291-c67834d212e7
IsCustom         : False
Description      : Lets you manage networks, but not access to them.
Actions          : {Microsoft.Authorization/*/read, Microsoft.Insights/alertRules/*, Microsoft.Network/*, Microsoft.ResourceHealth/availabilityStatuses/read...}
NotActions       : {}
DataActions      : {}
NotDataActions   : {}
AssignableScopes : {/}
```

Como você pode ver, o escopo definido em Actions/NotActions é a entidade do RBAC.

Para co-administradores, Actions define todos os escopos com [*] e NotActions define escopos que não podem ser manipulados, pois este é um privilégio bastante forte .

Os coautores da rede, por outro lado, são apenas funções configuráveis relacionadas à rede, portanto, Actions define apenas um escopo que pode ser aplicado.

As funções personalizadas, portanto, fornecem configurações de permissão flexíveis, definindo as ações que você deseja (ou não) executar no escopo de Ações (NotActions).

## Etapa 2. Definido de fato

Vamos definir uma função personalizada.

Desta vez, criaremos uma função personalizada que atenda aos requisitos a seguir.

> - Desejo evitar a visualização de informações relacionadas à assinatura, incluindo informações de faturamento.
- Quero ver/alterar permissão (quero evitar a exclusão).
- Eu quero conceder o acima em unidades de grupos de recursos especificados em vez de recursos individuais.
> 

Aplicar as condições acima para Actions/NotActions dá:

// Adicionado para habilitar operações básicas

> Ações: Criação e gerenciamento de todos os tipos de recursos
*
> 

// Adicionado para evitar a visualização de informações de faturamento

> Não ações: ler informações de faturamento
Microsoft.Billing / / ler
Microsoft.Commerce / / ler
Microsoft.Consumption / * / ler
> 

// Adicionado para tornar a exclusão impossível

Não ações: Excluir tudo

> - / excluir
> 

É uma configuração para impedir a exibição de informações de faturamento, mas aqui me referi ao documento público da Microsoft.
Há uma regra padrão chamada Leitor de cobrança, mas esta função adiciona a seguinte configuração a Ações para ler informações de cobrança, portanto, adicione esta configuração a NotActions. Se você fizer isso, não poderá ver suas informações de cobrança.

**Funções integradas para recursos do Azure**
[https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles](https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles)

> Leitura de informações de faturamento
Billing Reader
Microsoft.Billing / / read
Microsoft.Commerce / / read
Microsoft.Consumption / * / read
> 

Em seguida, crie um arquivo JSON no Bloco de notas.

```powershell
{
  "Name": "Test Custom Role",
  "Id": null,
  "IsCustom": true,
  "Description": "Test Custom Role",
  "Actions": [
    "*"
  ],
  "NotActions": [
    "*/delete", 
    "Microsoft.Billing/*/read", 
    "Microsoft.Commerce/*/read", 
    "Microsoft.Consumption/*/read", 
  ],
  "AssignableScopes": [
    "/subscriptions/e55e4aa8-889c-4424-a88d-7f5XXXXXXX20/resourceGroups/test"
  ]
}
```

Insira qualquer descrição para Nome e Descrição.Defina IsCustome como true e Actions / NotActions de acordo com seus requisitos.

A configuração de assinaturas especifica o ID de assinatura que você está usando. Normalmente, está OK se você definir da seguinte maneira.

```powershell
"/subscriptions/e55e4aa8-889c-4424-a88d-7f5XXXXXXX20"
```

Desta vez, há um requisito **[desejo conceder na unidade de grupo de recursos especificada, não em recursos individuais]**, então especifique como segue. É definido como uma função customizada que está disponível apenas no grupo de recursos denominado "teste".

Se desejar disponibilizá-lo para outros grupos de recursos, separe-os com vírgulas para aumentar a definição.

```powershell
"/subscriptions/e55e4aa8-889c-4424-a88d-7f5XXXXXXX20/resourceGroups/test"
```

Especifique o arquivo JSON preparado com o Powershell e execute-o.

```powershell
New-AzRoleDefinition -InputFile "C:\Users\admin\Desktop\customrole.json"

Name             : Test Custom Role
Id               : e6fabc8a-891a-4ae9-9ffd-21cb7b5798a7
IsCustom         : True
Description      : Test Custom Role
Actions          : {*}
NotActions       : {*/delete, Microsoft.Billing/*/read, Microsoft.Commerce/*/read, Microsoft.Consumption/*/read...}
DataActions      : {}
NotDataActions   : {}
AssignableScopes : {/subscriptions/e55e4aa8-889c-4424-a88d-7f5XXXXXXXX20/resourceGroups/test}
```

## Como atualizar uma função personalizada

Atualizar uma função personalizada é o mesmo que criá-la.

Está tudo bem se você executar o comando Set-azureAzRoleDefinition conforme mostrado abaixo

```powershell
Set-azureAzRoleDefinition -InputFile "C:\Users\nasekigu\Desktop\test.json"
```

O conteúdo do JSON é quase o mesmo de quando foi criado.

A única diferença é que você precisa especificar o Id da função personalizada que você criou para "Id".

Em Actions/NotActions, descreva todos os escopos a serem usados após a atualização.

Observe que se você inserir apenas um novo escopo, o escopo anterior à configuração será excluído

```powershell
{
  "Name": "Test",
  "Id": "40a919ec-0571-439d-aaec-XXXX510357",
  "IsCustom": true,
```

Vlw flw