Como proteger zonas e registros de DNS privado

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Confira Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

Registros e zonas de DNS privado são recursos críticos. Excluir uma zona DNS ou um único registro DNS pode resultar em uma interrupção do serviço. É importante que registros e zonas DNS sejam protegidos contra alterações acidentais ou não autorizadas.

Este artigo explica como o DNS do Azure permite que você proteja seus registros e zonas de DNS privado contra essas alterações. Aplicamos dois recursos de segurança avançados fornecidos pelo Azure Resource Manager: o controle de acesso baseado em função do Azure (Azure RBAC) e os bloqueios de recurso.

Controle de acesso baseado em função do Azure

O controle de acesso baseado em função do Azure (Azure RBAC ) permite o gerenciamento de acesso refinado para usuários, grupos e recursos do Azure. Com o Azure RBAC, você pode conceder o nível de acesso de que os usuários precisam. Para obter mais informações sobre como o Azure RBAC ajuda você a gerenciar o acesso, veja O que é controle de acesso baseado em função do Azure (Azure RBAC).

A função Colaborador da zona de DNS privado

A função Colaborador de zona de DNS privado é uma função interna para o gerenciamento de recursos de DNS privado. Essa função aplicada a um usuário ou grupo permite que ele(s) gerencie(m) recursos de DNS privado.

O grupo de recursos myPrivateDNS contém cinco zonas para a Contoso Corporation. A concessão das permissões de Colaborador de zona de DNS privado do administrador de DNS a esse grupo de recursos permite o controle total sobre essas zonas DNS. Ela evita a concessão de permissões desnecessárias. O administrador de DNS não pode criar ou parar máquinas virtuais.

A maneira mais simples de atribuir permissões do Azure RBAC é por meio do Portal do Azure.

Abra Controle de acesso (IAM) para o grupo de recursos, selecione Adicionar e selecione a função Contribuidor de zona de DNS privado. Selecione os usuários ou grupos necessários para conceder permissões.

Captura de tela do RBAC para o grupo de recursos DNS privado.

As permissões também podem ser concedidas usando o Azure PowerShell:

# Grant 'Private DNS Zone Contributor' permissions to all zones in a resource group

$rsg = "<resource group name>"
$usr = "<user email address>"
$rol = "Private DNS Zone Contributor"

New-AzRoleAssignment -SignInName $usr -RoleDefinitionName $rol -ResourceGroupName $rsg

O comando equivalente também está disponível por meio da CLI do Azure:

# Grant 'Private DNS Zone Contributor' permissions to all zones in a resource group

az role assignment create \
--assignee "<user email address>" \
--role "Private DNS Zone Contributor" \
--resource-group "<resource group name>"

Azure RBAC no nível da zona privada

É possível aplicar regras de RBAC do Azure a uma assinatura, grupo de recursos ou a um recurso individual. Esse recurso pode ser uma zona DNS individual ou um conjunto de registros individual.

Por exemplo, o grupo de recursos myPrivateDNS contém a zona private.contoso.com e uma subzona customers.private.contoso.com. Os registros CNAME são criados para cada conta de cliente. A conta de administrador usada para gerenciar registros CNAME recebe permissões para criar registros na zona customers.private.contoso.com. A conta pode gerenciar somente customers.private.contoso.com.

É possível conceder permissões do Azure RBAC no nível da zona por meio do portal do Azure. Abra Controle de acesso (IAM) para a zona, selecione Adicionar e selecione a função Contribuidor de zona de DNS privado. Selecione os usuários ou grupos necessários para conceder permissões.

Captura de tela do RBAC para a zona DNS privada.

As permissões também podem ser concedidas usando o Azure PowerShell:

# Grant 'Private DNS Zone Contributor' permissions to a specific zone

$rsg = "<resource group name>"
$usr = "<user email address>"
$zon = "<zone name>"
$rol = "Private DNS Zone Contributor"
$rsc = "Microsoft.Network/privateDnsZones"

New-AzRoleAssignment -SignInName $usr -RoleDefinitionName $rol -ResourceGroupName $rsg -ResourceName $zon -ResourceType $rsc

O comando equivalente também está disponível por meio da CLI do Azure:

# Grant 'Private DNS Zone Contributor' permissions to a specific zone

az role assignment create \
--assignee <user email address> \
--role "Private DNS Zone Contributor" \
--scope "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/privateDnsZones/<zone name>/"

Azure RBAC no nível do conjunto de registros

As permissões são aplicadas no nível do conjunto de registros. O usuário recebe o controle das entradas necessárias e não consegue fazer nenhuma outra alteração.

As permissões do Azure RBAC no nível de conjunto de registros podem ser configuradas por meio do portal do Azure, usando o botão Controle de acesso (IAM) na página do conjunto de registros:

Captura de tela do RBAC para o conjunto de registros DNS privado.

Captura de tela da atribuição de função para o conjunto de registros DNS privado.

As permissões do Azure RBAC no nível do conjunto de registros também podem ser concedidas usando o Azure PowerShell:

# Grant permissions to a specific record set

$usr = "<user email address>"
$rol = "Private DNS Zone Contributor"
$sco = 
"/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/privateDnsZones/<zone name>/<record type>/<record name>"

New-AzRoleAssignment -SignInName $usr -RoleDefinitionName $rol -Scope $sco

O comando equivalente também está disponível por meio da CLI do Azure:

# Grant permissions to a specific record set

az role assignment create \
--assignee "<user email address>" \
--role "Private DNS Zone Contributor" \
--scope "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/privateDnsZones/<zone name>/<record type>/<record name>"

Funções personalizadas

A função Colaborador de zona de DNS privado interna permite controle total sobre um recurso DNS. É possível criar suas próprias funções personalizadas do Azure para fornecer um controle mais refinado.

A conta usada para gerenciar os CNAMEs recebe permissão para gerenciar apenas registros CNAME. A conta não pode modificar os registros de outros tipos. A conta não pode fazer operações no nível da zona, como a exclusão de zona.

O exemplo a seguir mostra uma definição de função personalizada para gerenciar apenas registros CNAME:

{
    "Name": "Private DNS CNAME Contributor",
    "Id": "",
    "IsCustom": true,
    "Description": "Can manage DNS CNAME records only.",
    "Actions": [
        "Microsoft.Network/privateDnsZones/CNAME/*",
        "Microsoft.Network/privateDNSZones/read",
        "Microsoft.Authorization/*/read",
        "Microsoft.Insights/alertRules/*",
        "Microsoft.ResourceHealth/availabilityStatuses/read",
        "Microsoft.Resources/deployments/*",
        "Microsoft.Resources/subscriptions/resourceGroups/read",
        "Microsoft.Support/*"
    ],
    "NotActions": [
    ],
    "AssignableScopes": [
        "/subscriptions/c276fc76-9cd4-44c9-99a7-4fd71546436e"
    ]
}

A propriedade Actions define as seguintes permissões específicas do DNS:

  • Microsoft.Network/privateDnsZones/CNAME/* concede controle total sobre os registros CNAME
  • Microsoft.Network/privateDNSZones/read concede permissão para ler as zonas de DNS privado, mas não para modificá-las, permitindo que você veja a zona na qual o CNAME está sendo criado.

Observação

Usar uma função personalizada do Azure para evitar a exclusão de conjuntos de registros permitindo simultaneamente que eles sejam atualizados não é um controle efetivo. Isso impede que os conjuntos de registro sejam excluídos, mas não impede que sejam modificados. As modificações permitidas incluem adicionar e remover registros do conjunto de registros, incluindo a remoção de todos os registros para deixar um conjunto de registros vazio. Do ponto de vista de resolução de DNS, isso tem o mesmo efeito de excluir o registro.

Definições de função personalizada não podem ser definidas por meio do portal do Azure no momento. Uma função personalizada com base nessa definição de função pode ser criada usando o Azure PowerShell:

# Create new role definition based on input file

New-AzRoleDefinition -InputFile <file path>

Ela também pode ser criada por meio da CLI do Azure:

# Create new role definition based on input file

az role create -inputfile <file path>

A função pode então ser atribuída da mesma forma que as funções internas, conforme descrito anteriormente neste artigo.

Para obter mais informações sobre como criar, gerenciar e atribuir funções personalizadas, veja Funções personalizadas do Azure.

Bloqueios de recurso

O Azure Resource Manager dá suporte a outro tipo de controle de segurança, que é a capacidade de bloquear recursos. Os bloqueios de recurso são aplicados ao recurso e são efetivos entre todos os usuários e funções. Para saber mais, confira Bloquear recursos com o Gerenciador de Recursos do Azure.

Há dois tipos de bloqueio de recurso: CanNotDelete e ReadOnly. Esses tipos de bloqueio podem ser aplicados a uma zona de DNS privado ou a um conjunto de registros individual. As seções a seguir descrevem vários cenários comuns e como dar suporte a eles usando bloqueios de recurso.

Proteção contra todas as alterações

Para impedir que alterações sejam feitas, aplique um bloqueio ReadOnly à zona. Esse bloqueio impede que novos conjuntos de registros sejam criados e que os existentes sejam modificados ou excluídos.

Bloqueios de recurso em nível de zona podem ser criados via Portal do Azure. Na página da zona DNS, selecione Bloqueios e, em seguida, selecione +Adicionar:

Captura de tela de bloqueios para a zona DNS privada.

Bloqueios de recurso em nível de zona podem ser criados via Azure PowerShell:

# Lock a DNS zone

$lvl = "<lock level>"
$lnm = "<lock name>"
$rsc = "<zone name>"
$rty = "Microsoft.Network/privateDnsZones"
$rsg = "<resource group name>"

New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rsc -ResourceType $rty -ResourceGroupName $rsg

O comando equivalente também está disponível por meio da CLI do Azure:

# Lock a DNS zone

az lock create \
--lock-type "<lock level>" \
--name "<lock name>" \
--resource-name "<zone name>" \
--namespace "Microsoft.Network" \
--resource-type "privateDnsZones" \
--resource-group "<resource group name>"

Protegendo registros individuais

Para impedir que um conjunto de registros DNS existente sofra modificações, aplique um bloqueio ReadOnly ao conjunto de registros.

Observação

Aplicar um bloqueio CanNotDelete a um conjunto de registros não é um controle efetivo. Ele impede que os conjuntos de registro sejam excluídos, mas não impede que sejam modificados. As modificações permitidas incluem adicionar e remover registros do conjunto de registros, incluindo a remoção de todos os registros para deixar um conjunto de registros vazio. Do ponto de vista de resolução de DNS, isso tem o mesmo efeito de excluir o registro.

Atualmente, os bloqueios de recurso em nível de conjunto de registros só podem ser configurados pelo uso do Azure PowerShell. Eles não têm suporte no portal do Azure nem na CLI do Azure.

Azure PowerShell

# Lock a DNS record set

$lvl = "<lock level>"
$lnm = "<lock name>"
$rnm = "<zone name>/<record set name>"
$rty = "Microsoft.Network/privateDnsZones/<record type>"
$rsg = "<resource group name>"

New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rnm -ResourceType $rty -ResourceGroupName $rsg

Proteção contra a exclusão de zona

Quando uma zona é excluída no DNS do Azure, todos os conjuntos de registros na zona são excluídos. Essa operação não pode ser desfeita. A exclusão acidental de uma zona crítica tem o potencial para ter um impacto significativo nos negócios. É muito proteger-se contra a exclusão acidental de zona.

Aplicar um bloqueio CanNotDelete a uma zona impede que a zona seja excluída. Os bloqueios são herdados por recursos filho. Um bloqueio evita que qualquer conjunto de registros na zona seja excluído. Conforme descrito na observação acima, ele é também ineficaz, pois registros ainda podem ser removidos dos conjuntos de registros existentes.

Como alternativa, aplique um bloqueio CanNotDelete a um conjunto de registros na zona, como o conjunto de registros SOA. A zona não é excluída sem excluir também os conjuntos de registros. Esse bloqueio protege contra a exclusão de zona, enquanto ainda permite que conjuntos de registros dentro da zona sejam modificados livremente. Se for feita uma tentativa de excluir a zona, o Azure Resource Manager detectará essa remoção. A remoção também excluiria o conjunto de registros SOA, e o Azure Resource Manager bloqueia a chamada porque o SOA está bloqueada. Nenhum conjunto de registros é excluído.

O seguinte comando do PowerShell cria um bloqueio CanNotDelete no registro SOA da zona especificada:

# Protect against zone delete with CanNotDelete lock on the record set

$lvl = "CanNotDelete"
$lnm = "<lock name>"
$rnm = "<zone name>/@"
$rty = "Microsoft.Network/privateDnsZones/SOA"
$rsg = "<resource group name>"

New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rnm -ResourceType $rty -ResourceGroupName $rsg

Outra opção para impedir a exclusão acidental de zona é usar uma função personalizada. Essa função garante que as contas usadas para gerenciar suas zonas não tenham permissões de exclusão de zona.

Quando você precisa excluir uma zona, é possível impor uma exclusão de duas etapas:

  • Primeiro, conceda permissões de exclusão de zona.
  • Em segundo lugar, conceda permissões para excluir a zona.

A função personalizada funciona para todas as zonas acessadas por essas contas. Contas com permissões de exclusão de zona, como o proprietário da assinatura, ainda podem excluir uma zona acidentalmente.

É possível usar as duas abordagens — bloqueios de recursos e funções personalizadas — ao mesmo tempo, como abordagem de defesa detalhada para a proteção de zonas DNS.

Próximas etapas