Как защитить зоны и записи DNS

Примечание

Для взаимодействия с Azure рекомендуется использовать модуль Azure Az PowerShell. Чтобы начать работу, см. статью Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Зоны и записи DNS являются критически важными ресурсами. Удаление зоны DNS или отдельной записи DNS может привести к отключению службы. Поэтому важно, чтобы важные зоны и записи DNS были защищены от несанкционированных или случайных изменений.

В этой статье объясняется, как с помощью службы DNS Azure защитить частные зоны и записи DNS от таких изменений. Мы применяем две эффективные функции безопасности, предоставляемые Azure Resource Manager: управление доступом на основе ролей Azure и блокировка ресурсов.

Управление доступом на основе ролей в Azure

Управление доступом на основе ролей (RBAC) Azure обеспечивает точное управление доступом для пользователей, групп и ресурсов Azure. С помощью Azure RBAC вы можете предоставлять пользователям тот уровень доступа, который им необходим. Дополнительные сведения о том, как Azure RBAC помогает управлять доступом, см. в статье Начало работы с управлением доступом на портале Azure.

Роль "Участник зоны DNS"

Роль участника зоны DNS — это встроенная роль для управления частными DNS-ресурсами. Эта роль, присвоенная пользователю или группе, позволяет им управлять DNS-ресурсами.

Группа ресурсов myResourceGroup содержит пять зон для компании Contoso Corporation. Если предоставить администратору DNS разрешения "Участник зоны DNS" для этой группы ресурсов, то он получит полный контроль над этими зонами DNS. Это позволяет избежать предоставления ненужных разрешений. Администратор DNS не может создавать виртуальные машины или останавливать их.

Самый простой способ назначения разрешений Azure RBAC — через портал Azure.

Откройте Управление доступом (IAM) для группы ресурсов, щелкните Добавить и выберите роль Участник зоны DNS. Выберите необходимых пользователей или группы для предоставления разрешений.

Снимок экрана, на котором показана страница управления доступом для группы ресурсов.

Разрешения также можно предоставить с помощью 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

Аналогичную команду также можно выполнить через интерфейс командной строки 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>"

Azure RBAC на уровне зоны

Правила RBAC Azure могут применяться к подписке, группе ресурсов или к отдельному ресурсу. Этот ресурс может быть отдельной зоной DNS или отдельным набором записей.

Например, группа ресурсов myResourceGroup содержит зону contoso.com и подзону customers.private.contoso.com. Для каждой учетной записи клиента созданы записи CNAME. Учетной записи администратора, используемой для управления записями CNAME, назначаются разрешения на создание записей в зоне customers.contoso.com. Учетная запись может управлять только зоной customers.contoso.com.

Разрешения Azure RBAC на уровне зоны можно предоставлять через портал Azure. Откройте колонку Управление доступом (IAM) для зоны, затем щелкните Добавить, выберите роль Участник зоны DNS и выберите пользователей или группы, которым будут предоставлены эти разрешения.

Снимок экрана, на котором показана страница управления доступом для зоны DNS.

Разрешения также можно предоставить с помощью 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

Аналогичную команду также можно выполнить через интерфейс командной строки 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>/"

Azure RBAC на уровне набора записей

Разрешения применяются на уровне набора записей. Пользователю предоставляется доступ к записям, которые ему нужны, и он не может вносить какие-либо другие изменения.

Разрешения Azure RBAC на уровне набора записей можно настроить на портале Azure с помощью кнопки Пользователи на странице набора записей.

Снимок экрана кнопки

Разрешения Azure RBAC на уровне набора записей также можно предоставить с помощью 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

Аналогичную команду также можно выполнить через интерфейс командной строки 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>"

Пользовательские роли

Встроенная роль "Участник зоны DNS" разрешает полный контроль над ресурсом DNS. Можно также создавать собственные пользовательские роли Azure, чтобы обеспечить более точный контроль.

Учетной записи, используемой для управления записями CNAME, предоставляется разрешение на управление только записями CNAME. Эта учетная запись не может изменять записи другого типа. Учетная запись не может выполнять операции на уровне зоны, такие как удаление зоны.

В следующем примере показано определение пользовательской роли для управления только записями 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/c276fc76-9cd4-44c9-99a7-4fd71546436e"
    ]
}

Свойство Actions определяет следующие разрешения для DNS:

  • Microsoft.Network/dnsZones/CNAME/* предоставляет полный контроль над записями CNAME.
  • Microsoft.Network/dnsZones/read предоставляет разрешение на чтение зон DNS, но не позволяет их изменять. Таким образом вы можете видеть зону, в которой создается запись CNAME.

Остальные элементы свойства Actions копируются из встроенной роли участника зоны DNS.

Примечание

Применение пользовательской роли Azure для предотвращения удаления наборов записей, разрешая при этом их обновление, не является эффективным. Наборы записей нельзя удалить, но ничто не препятствует их изменению. К разрешенным изменениям относятся добавление и удаление записей из набора записей, включая удаление всех записей (при этом остается "пустой" набор записей). Это действует так же, как удаление набора записей с точки зрения разрешения DNS.

В настоящее время определения пользовательских ролей не определяются через портал Azure. Пользовательскую роль на основе этого определения роли можно создать с помощью Azure PowerShell:

# Create new role definition based on input file
New-AzRoleDefinition -InputFile <file path>

Ее также можно создать с помощью интерфейса командной строки Azure:

# Create new role definition based on input file
az role definition create --role-definition <file path>

Затем роль можно назначить таким же образом, как и встроенные роли. Этот процесс описан ранее в этой статье.

Дополнительные сведения о создании и назначении пользовательских ролей, а также об управлении ими см. в статье Пользовательские роли Azure.

Блокировки ресурсов

Azure Resource Manager поддерживает и другой тип управления безопасностью — возможность блокировать ресурсы. Блокировку можно применить к конкретному ресурсу, и она будет действовать для всех пользователей и ролей. Дополнительные сведения см. в статье Блокировка ресурсов с помощью диспетчера ресурсов Azure.

Существует два типа блокировки ресурсов: CanNotDelete и ReadOnly. Блокировки этого типа могут применяться либо к Частной зоне DNS, либо к отдельному набору записей. Следующие разделы описывают несколько распространенных сценариев и способы их поддержки с помощью блокировок ресурсов.

Защита от любых изменений

Чтобы предотвратить внесение изменений, примените к зоне блокировку ReadOnly. Эта блокировка не позволит создавать наборы записей, а также изменять или удалять существующие наборы.

Блокировки ресурсов на уровне зоны можно создавать через портал Azure. На странице зоны DNS выберите Блокировки, затем щелкните + Добавить.

Снимок экрана блокировки ресурсов на уровне зоны.

Блокировки ресурсов на уровне зоны также можно создать с помощью 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

Аналогичную команду также можно выполнить через интерфейс командной строки 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>"

Защита отдельных записей

Чтобы предотвратить внесение изменений в существующий набор записей DNS, примените к нему блокировку ReadOnly.

Примечание

Применение к набору записей блокировки CanNotDelete (Запрет удаления) не является эффективным. Набор записей нельзя удалить, но ничто не препятствует его изменению. К разрешенным изменениям относятся добавление и удаление записей из набора записей, включая удаление всех записей (при этом остается "пустой" набор записей). Это действует так же, как удаление набора записей с точки зрения разрешения DNS.

В настоящее время блокировки ресурсов на уровне наборов записей можно настраивать только с помощью Azure PowerShell. Эта возможность пока не предоставляется через портал Azure или интерфейс командной строки 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

Защита зоны от удаления

При удалении зоны в службе DNS Azure все наборы записей в этой зоне удаляются. Отменить эту операцию невозможно. Случайное удаление критически важной зоны может оказать серьезное влияние на коммерческую деятельность. Важно обезопаситься от случайного удаления зоны.

Применение блокировки CanNotDelete (Запрет удаления) предотвращает удаление зоны. Блокировки наследуются дочерними ресурсами. Блокировка предотвращает удаление наборов записей в зоне. Как уже говорилось ранее в примечании, это неэффективно, так как записи по-прежнему могут удаляться из существующих наборов записей.

Альтернативным решением может быть применение блокировки CanNotDelete (Запрет удаления) к набору записей в зоне, например к набору записей типа SOA. Зону невозможно удалить без удаления наборов записей. Эта блокировка защищает от удаления зоны, в то же время позволяя свободно изменять наборы записей в зоне. При попытке удалить зону Azure Resource Manager обнаружит эту попытку. Удаление также приведет к удалению набора записей SOA, поэтому Azure Resource Manager блокирует вызов, так как SOA заблокирован. Наборы записей не будут удалены.

Следующая команда PowerShell создает блокировку CanNotDelete (Запрет удаления) для записи типа SOA в указанной зоне:

# 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

Другим вариантом предотвращения случайного удаления зоны является использование настраиваемой роли. Эта роль гарантирует, что учетные записи, используемые для управления зонами, не имеют разрешений на удаление зоны.

При необходимости удалить зону можно прибегнуть к двухэтапной процедуре удаления:

  • Сначала предоставьте разрешения на удаление зон.
  • Затем предоставьте разрешения на удаление этой зоны.

Настраиваемая роль работает для всех зон, к которым обращаются эти учетные записи. Учетные записи с разрешениями на удаление зоны, такие как "Владелец подписки", по-прежнему могут случайно удалить зону.

Оба подхода — блокировки ресурсов и пользовательские роли — можно использовать одновременно в качестве эшелонированного подхода к защите зоны DNS.

Дальнейшие действия