Como proteger zonas e registos DNS privados

Nota

Recomendamos que utilize o módulo do Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

DNS Privado zonas e registos 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 lhe permite proteger as suas zonas DNS privadas e registos contra essas alterações. Aplicamos duas funcionalidades avançadas de títulos fornecidas pelo Azure Resource Manager: controlo de acesso baseado em funções do Azure (RBAC do Azure) e bloqueios de recursos.

Controlo de acesso baseado em funções do Azure

O controlo de acesso baseado em funções do Azure (RBAC do Azure) permite uma gestão de acesso detalhada para utilizadores, grupos e recursos do Azure. Com o RBAC do Azure, pode conceder o nível de acesso de que os utilizadores precisam. Para obter mais informações sobre como o RBAC do Azure o ajuda a gerir o acesso, veja O que é o controlo de acesso baseado em funções do Azure (RBAC do Azure).

A função contribuidor de zona de DNS Privado

A função contribuidor de zona DNS Privado é uma função incorporada para gerir recursos DNS privados. Esta função aplicada a um utilizador ou grupo permite-lhes gerir recursos DNS privados.

O grupo de recursos myPrivateDNS contém cinco zonas para a Contoso Corporation. Conceder ao administrador do DNS permissões de Contribuidor de Zona DNS Privado para esse grupo de recursos permite o controlo total sobre essas zonas DNS. Evita conceder permissões desnecessárias. O administrador do DNS não consegue criar ou parar máquinas virtuais.

A forma mais simples de atribuir permissões RBAC do Azure é através do portal do Azure.

Abra o Controlo de acesso (IAM) para o grupo de recursos, selecione Adicionar e, em seguida, selecione a função Contribuidor de Zona DNS Privado. Selecione os utilizadores ou grupos necessários para conceder permissões.

Captura de ecrã do RBAC para o grupo de recursos DNS privado.

As permissões também podem ser concedidas com 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 através 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>"

RBAC do Azure ao nível da Zona Privada

As regras RBAC do Azure podem ser aplicadas a uma subscrição, a um grupo de recursos ou a um recurso individual. Esse recurso pode ser uma zona DNS individual ou um conjunto de registos individual.

Por exemplo, o grupo de recursos myPrivateDNS contém a zona private.contoso.com e uma customers.private.contoso.com de subzona. Os registos CNAME são criados para cada conta de cliente. A conta de administrador utilizada para gerir registos CNAME tem permissões atribuídas para criar registos na zona de customers.private.contoso.com . A conta só pode gerir customers.private.contoso.com .

As permissões RBAC do Azure ao nível da zona podem ser concedidas através do portal do Azure. Abra o Controlo de acesso (IAM) para a zona, selecione Adicionar e, em seguida, selecione a função contribuidor de zona DNS Privado. Selecione os utilizadores ou grupos necessários para conceder permissões.

Captura de ecrã do RBAC para a zona DNS privada.

As permissões também podem ser concedidas com 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 através 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>/"

RBAC do Azure de nível de conjunto de registos

As permissões são aplicadas ao nível do conjunto de registos. É concedido ao utilizador controlo sobre as entradas de que precisa e não consegue efetuar outras alterações.

As permissões RBAC do Azure ao nível do conjunto de registos podem ser configuradas através do portal do Azure, utilizando o botão Controlo de Acesso (IAM) na página do conjunto de registos:

Captura de ecrã do RBAC para conjunto de registos DNS privados.

Captura de ecrã a mostrar a atribuição de funções para o conjunto de registos DNS privado.

As permissões RBAC do Azure ao nível do conjunto de registos também podem ser concedidas com 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 através 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 contribuidor de zona de DNS Privado incorporada permite o controlo total sobre um recurso DNS. É possível criar as suas próprias funções personalizadas do Azure para fornecer um controlo mais detalhado.

A conta utilizada para gerir CNAMEs tem permissão para gerir apenas registos CNAME. A conta não consegue modificar registos de outros tipos. A conta não consegue efetuar operações ao nível da zona, como a eliminação de zonas.

O exemplo seguinte mostra uma definição de função personalizada apenas para gerir registos 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 Ações define as seguintes permissões específicas do DNS:

  • Microsoft.Network/privateDnsZones/CNAME/* concede controlo total sobre os registos CNAME
  • Microsoft.Network/privateDNSZones/read concede permissão para ler zonas privadas DNS, mas não para modificá-las, permitindo-lhe ver a zona na qual o CNAME está a ser criado.

Nota

A utilização de uma função personalizada do Azure para impedir a eliminação de conjuntos de registos, ao mesmo tempo que permite que sejam atualizados, não é um controlo eficaz. Impede que os conjuntos de registos sejam eliminados, mas não impede que sejam modificados. As modificações permitidas incluem adicionar e remover registos do conjunto de registos, incluindo remover todos os registos para deixar um conjunto de registos vazio. Isto tem o mesmo efeito que eliminar o conjunto de registos de um ponto de vista de resolução de DNS.

Atualmente, as definições de funções personalizadas não podem ser definidas através do portal do Azure. Uma função personalizada baseada nesta definição de função pode ser criada com Azure PowerShell:

# Create new role definition based on input file

New-AzRoleDefinition -InputFile <file path>

Também pode ser criado através da CLI do Azure:

# Create new role definition based on input file

az role create -inputfile <file path>

Em seguida, a função pode ser atribuída da mesma forma que as funções incorporadas, conforme descrito anteriormente neste artigo.

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

Bloqueios de recurso

O Azure Resource Manager suporta outro tipo de controlo de segurança, a capacidade de bloquear recursos. Os bloqueios de recursos são aplicados ao recurso e são eficazes em todos os utilizadores 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. Estes tipos de bloqueio podem ser aplicados a uma zona de DNS Privado ou a um conjunto de registos individual. As secções seguintes descrevem vários cenários comuns e como os suportar através de bloqueios de recursos.

Proteger contra todas as alterações

Para impedir que sejam efetuadas alterações, aplique um bloqueio ReadOnly à zona. Este bloqueio impede a criação de novos conjuntos de registos e os conjuntos de registos existentes são modificados ou eliminados.

Os bloqueios de recursos ao nível da zona podem ser criados através do portal do Azure. Na página zona DNS, selecione Bloqueios e, em seguida, selecione +Adicionar:

Captura de ecrã a mostrar bloqueios para a zona DNS privada.

Os bloqueios de recursos ao nível da zona também podem ser criados através de 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 através 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>"

Proteger registos individuais

Para impedir um conjunto de registos DNS existente contra a modificação, aplique um bloqueio ReadOnly ao conjunto de registos.

Nota

Aplicar um bloqueio CanNotDelete a um conjunto de registos não é um controlo eficaz. Impede que o conjunto de registos seja eliminado, mas não impede que seja modificado. As modificações permitidas incluem adicionar e remover registos do conjunto de registos, incluindo remover todos os registos para deixar um conjunto de registos vazio. Isto tem o mesmo efeito que eliminar o conjunto de registos de um ponto de vista de resolução de DNS.

Atualmente, os bloqueios de recursos de nível de conjunto de registos só podem ser configurados com Azure PowerShell. Não são suportados no portal do Azure ou 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

Proteger contra a eliminação de zonas

Quando uma zona é eliminada no DNS do Azure, todos os conjuntos de registos na zona são eliminados. Esta operação não pode ser anulada. Eliminar acidentalmente uma zona crítica tem o potencial de ter um impacto comercial significativo. É importante proteger contra a eliminação acidental de zonas.

Aplicar um bloqueio CanNotDelete a uma zona impede que a zona seja eliminada. Os bloqueios são herdados por recursos subordinados. Um bloqueio impede que quaisquer conjuntos de registos na zona sejam eliminados. Conforme descrito na nota acima, é ineficaz, uma vez que os registos ainda podem ser removidos dos conjuntos de registos existentes.

Como alternativa, aplique um bloqueio CanNotDelete a um conjunto de registos na zona, como o conjunto de registos SOA. A zona não é eliminada sem eliminar também os conjuntos de registos. Este bloqueio protege contra a eliminação de zonas, ao mesmo tempo que permite que os conjuntos de registos dentro da zona sejam modificados livremente. Se for feita uma tentativa de eliminar a zona, o Azure Resource Manager deteta esta remoção. A remoção também eliminaria o conjunto de registos SOA, o Azure Resource Manager bloqueia a chamada porque o SOA está bloqueado. Não são eliminados conjuntos de registos.

O seguinte comando do PowerShell cria um bloqueio CanNotDelete no registo SOA da determinada zona:

# 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 evitar a eliminação acidental de zonas é utilizar uma função personalizada. Esta função garante que as contas utilizadas para gerir as suas zonas não têm permissões de eliminação de zona.

Quando precisar de eliminar uma zona, pode impor uma eliminação de dois passos:

  • Primeiro, conceder permissões de eliminação de zona
  • Em segundo lugar, conceda permissões para eliminar a zona.

A função personalizada funciona para todas as zonas acedidas por essas contas. As contas com permissões de eliminação de zona, como o proprietário da subscrição, ainda podem eliminar acidentalmente uma zona.

É possível utilizar ambas as abordagens - bloqueios de recursos e funções personalizadas - ao mesmo tempo, como uma abordagem de defesa em profundidade à proteção da zona DNS.

Passos seguintes