Como proteger os registos e as zonas DNS
Nota
Recomendamos que utilize o módulo Azure Az do PowerShell para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.
As zonas DNS e os registos DNS são recursos críticos. A eliminação de uma zona DNS ou de um único registo DNS pode resultar numa interrupção do serviço. É importante que as zonas DNS e os registos DNS estejam protegidos contra alterações não autorizadas ou acidentais.
Este artigo explica como o DNS do Azure permite que você proteja suas zonas e registros DNS privados contra essas alterações. Aplicamos dois poderosos recursos de segurança fornecidos pelo Azure Resource Manager: controle de acesso baseado em função do Azure (Azure RBAC) e bloqueios de recursos.
Controlo de acesso baseado em funções 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 RBAC do Azure, você pode conceder o nível de acesso de que os usuários precisam. Para obter mais informações sobre como o RBAC do Azure ajuda você a gerenciar o acesso, consulte O que é o controle de acesso baseado em função do Azure (Azure RBAC).
A função de Colaborador da Zona DNS
A função de Colaborador da Zona DNS é uma função interna para gerenciar recursos DNS privados. Essa função aplicada a um usuário ou grupo permite que eles gerenciem recursos DNS.
O grupo de recursos myResourceGroup contém cinco zonas para a Contoso Corporation. Conceder ao administrador do DNS permissões de Colaborador da Zona DNS para esse grupo de recursos permite o controle total sobre essas zonas DNS. 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 o controle de acesso (IAM) para o grupo de recursos, selecione + Adicionar e selecione a função de Colaborador da Zona DNS . Selecione os usuários ou grupos necessários para conceder permissões.
As permissões também podem ser concedidas usando o Azure PowerShell:
# Grant 'DNS Zone Contributor' permissions to all zones in a resource group
$usr = "<user email address>"
$rol = "DNS Zone Contributor"
$rsg = "<resource group name>"
New-AzRoleAssignment -SignInName $usr -RoleDefinitionName $rol -ResourceGroupName $rsg
O comando equivalente também está disponível por meio da CLI do Azure:
# Grant 'DNS Zone Contributor' permissions to all zones in a resource group
az role assignment create \
--assignee "<user email address>" \
--role "DNS Zone Contributor" \
--resource-group "<resource group name>"
Nível de zona do Azure RBAC
As regras do RBAC do Azure podem ser aplicadas a uma assinatura, a um 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 myResourceGroup contém a zona contoso.com e uma subzona customers.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.contoso.com . A conta só pode gerir customers.contoso.com .
As permissões do RBAC do Azure em nível de zona podem ser concedidas por meio do portal do Azure. Abra o controle de acesso (IAM) para a zona, selecione + Adicionar e, em seguida, selecione a função de Colaborador da Zona DNS e selecione os usuários ou grupos necessários para conceder permissões.
As permissões também podem ser concedidas usando o Azure PowerShell:
# Grant 'DNS Zone Contributor' permissions to a specific zone
$usr = "<user email address>"
$rol = "DNS Zone Contributor"
$rsg = "<resource group name>"
$zon = "<zone name>"
$typ = "Microsoft.Network/DNSZones"
New-AzRoleAssignment -SignInName $usr -RoleDefinitionName $rol -ResourceGroupName $rsg -ResourceName $zon -ResourceType $typ
O comando equivalente também está disponível por meio da CLI do Azure:
# Grant 'DNS Zone Contributor' permissions to a specific zone
az role assignment create \
--assignee <user email address> \
--role "DNS Zone Contributor" \
--scope "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/DnsZones/<zone name>/"
Nível do conjunto de registros Azure RBAC
As permissões são aplicadas no nível do conjunto de registros. O usuário recebe controle para as entradas de que precisa e não pode fazer quaisquer outras alterações.
As permissões do RBAC do Azure em nível de conjunto de registros podem ser configuradas por meio do portal do Azure, usando o botão Usuários na página do conjunto de registros:
As permissões do RBAC do Azure de nível de conjunto de registros também podem ser concedidas usando o Azure PowerShell:
# Grant permissions to a specific record set
$usr = "<user email address>"
$rol = "DNS Zone Contributor"
$sco =
"/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/dnszones/<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 "DNS Zone Contributor" \
--scope "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/dnszones/<zone name>/<record type>/<record name>"
Funções personalizadas
A função interna de Colaborador da Zona DNS permite o 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 CNAMEs recebe permissão para gerenciar somente registros CNAME. A conta não consegue modificar registos de outros tipos. A conta não consegue 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 somente registros CNAME:
{
"Name": "DNS CNAME Contributor",
"Id": "",
"IsCustom": true,
"Description": "Can manage DNS CNAME records only.",
"Actions": [
"Microsoft.Network/dnsZones/CNAME/*",
"Microsoft.Network/dnsZones/read",
"Microsoft.Authorization/*/read",
"Microsoft.Insights/alertRules/*",
"Microsoft.ResourceHealth/availabilityStatuses/read",
"Microsoft.Resources/deployments/*",
"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Support/*"
],
"NotActions": [
],
"AssignableScopes": [
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
]
}
A propriedade Actions define as seguintes permissões específicas do DNS:
Microsoft.Network/dnsZones/CNAME/*
concede controle total sobre os registros CNAMEMicrosoft.Network/dnsZones/read
concede permissão para ler zonas DNS, mas não para modificá-las, permitindo que você veja a zona na qual o CNAME está sendo criado.
As Ações restantes são copiadas da função interna de Colaborador da Zona DNS.
Nota
Usar uma função personalizada do Azure para impedir a exclusão de conjuntos de registros e, ao mesmo tempo, permitir que eles sejam atualizados não é um controle eficaz. Impede que os conjuntos de registos sejam eliminados, 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. Isso tem o mesmo efeito que excluir o conjunto de registros do ponto de vista da resolução DNS.
Atualmente, as definições de função personalizadas não podem ser definidas por meio do portal do Azure. 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>
Ele também pode ser criado por meio da CLI do Azure:
# Create new role definition based on input file
az role definition create --role-definition <file path>
A função pode 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, consulte Funções personalizadas do Azure.
Bloqueios de recursos
O Azure Resource Manager dá suporte a outro tipo de controle de segurança, a capacidade de bloquear recursos. Os bloqueios de recursos são aplicados ao recurso e são eficazes em todos os usuários e funções. Para obter mais informações, consulte Bloquear recursos com o Azure Resource Manager.
Existem dois tipos de bloqueio de recursos: CanNotDelete e ReadOnly. Esses tipos de bloqueio podem ser aplicados a uma zona DNS privada 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 recursos.
Proteção contra todas as alterações
Para evitar que alterações sejam feitas, aplique um bloqueio Somente Leitura à zona. Esse bloqueio impede que novos conjuntos de registros sejam criados e que conjuntos de registros existentes sejam modificados ou excluídos.
Os bloqueios de recursos no nível da zona podem ser criados por meio do portal do Azure. Na página Zona DNS, selecione Bloqueios e, em seguida, selecione + Adicionar:
Os bloqueios de recursos no nível da zona também podem ser criados por meio do Azure PowerShell:
# Lock a DNS zone
$lvl = "<lock level>"
$lnm = "<lock name>"
$rsc = "<zone name>"
$rty = "Microsoft.Network/DNSZones"
$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 "DnsZones" \
--resource-group "<resource group name>"
Proteção de registos individuais
Para impedir que um conjunto de registros DNS existente seja modificado, aplique um bloqueio Somente Leitura ao conjunto de registros.
Nota
Aplicar um bloqueio CanNotDelete a um conjunto de registros não é um controle eficaz. Ele impede que o conjunto de registros seja excluído, mas não impede que ele seja modificado. 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. Isso tem o mesmo efeito que excluir o conjunto de registros do ponto de vista da resolução DNS.
Atualmente, os bloqueios de recursos de nível de conjunto de registros só podem ser configurados usando o Azure PowerShell. Eles não têm suporte no portal do Azure ou na CLI do Azure.
# Lock a DNS record set
$lvl = "<lock level>"
$lnm = "<lock name>"
$rsc = "<zone name>/<record set name>"
$rty = "Microsoft.Network/DNSZones/<record type>"
$rsg = "<resource group name>"
New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rsc -ResourceType $rty -ResourceGroupName $rsg
Proteção contra exclusão de zona
Quando uma zona é excluída no DNS do Azure, todos os conjuntos de registros na zona são excluídos. Esta operação não pode ser desfeita. A exclusão acidental de uma zona crítica tem o potencial de ter um impacto significativo nos negócios. É importante proteger contra a exclusão acidental da zona.
A aplicação de um bloqueio CanNotDelete a uma zona impede que a zona seja excluída. As fechaduras são herdadas por recursos filho. Um bloqueio impede que qualquer conjunto de registros na zona seja excluído. Conforme descrito na nota acima, é ineficaz, uma vez que os 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 também excluir os conjuntos de registros. Esse bloqueio protege contra a exclusão de zona, ao mesmo tempo em que permite que conjuntos de registros dentro da zona sejam modificados livremente. Se for feita uma tentativa de excluir a zona, o Azure Resource Manager detetará essa remoção. A remoção também excluiria o conjunto de registros SOA, o Azure Resource Manager bloqueia a chamada porque a SOA está bloqueada. Nenhum conjunto de registros é excluído.
O comando PowerShell a seguir cria um bloqueio CanNotDelete no registro SOA de determinada zona:
# Protect against zone delete with CanNotDelete lock on the record set
$lvl = "CanNotDelete"
$lnm = "<lock name>"
$rsc = "<zone name>/@"
$rty = "Microsoft.Network/DNSZones/SOA"
$rsg = "<resource group name>"
New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rsc -ResourceType $rty -ResourceGroupName $rsg
Outra opção para evitar a exclusão acidental de zona é usando 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 precisar excluir uma zona, você poderá impor uma exclusão em 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 acidentalmente uma zona.
É possível usar ambas as abordagens - bloqueios de recursos e funções personalizadas - ao mesmo tempo, como uma abordagem de defesa profunda para a proteção de zona DNS.
Próximos passos
- Para obter mais informações sobre como trabalhar com o Azure RBAC, consulte O que é o controle de acesso baseado em função do Azure (Azure RBAC).
- Para obter mais informações sobre como trabalhar com bloqueios de recursos, consulte Bloquear recursos com o Azure Resource Manager.