DNS ゾーンとレコードを保護する方法How to protect DNS zones and records

注意

この記事は、Azure Az PowerShell モジュールを使用するように更新されています。This article has been updated to use the Azure Az PowerShell module. Az PowerShell モジュールは、Azure と対話するために推奨される PowerShell モジュールです。The Az PowerShell module is the recommended PowerShell module for interacting with Azure. Az PowerShell モジュールの使用を開始するには、「Azure PowerShell をインストールする」を参照してください。To get started with the Az PowerShell module, see Install Azure PowerShell. Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。To learn how to migrate to the Az PowerShell module, see Migrate Azure PowerShell from AzureRM to Az.

DNS ゾーンと DNS レコードは、重要なリソースです。DNS zones and records are critical resources. DNS ゾーンまたは DNS レコードを削除すると、サービス全体が停止する可能性があります。Deleting a DNS zone or a single DNS record can result in a service outage. DNS ゾーンとレコードは、承認されていない変更や意図しない変更が加えられないように保護することが重要です。It's important that DNS zones and records are protected against unauthorized or accidental changes.

この記事では、Azure DNS でプライベート DNS ゾーンとレコードをこのような変更から保護する方法について説明します。This article explains how Azure DNS enables you to protect your private DNS zones and records against such changes. Azure Resource Manager によって提供される 2 つの強力なセキュリティ機能である、Azure ロールベースのアクセス制御 (Azure RBAC)リソース ロックを適用します。We apply two powerful securities features provided by Azure Resource Manager: Azure role-based access control (Azure RBAC) and resource locks.

Azure ロールベースのアクセス制御Azure role-based access control

Azure のロールベースのアクセス制御 (Azure RBAC) では、Azure ユーザー、グループ、およびリソースのアクセス権を詳細に管理できます。Azure role-based access control (Azure RBAC) enables fine-grained access management for Azure users, groups, and resources. Azure RBAC を使用すると、ユーザーが必要とするアクセス レベルを付与することができます。With Azure RBAC, you can grant the level of access that users need. Azure RBAC を使用したアクセス管理の詳細については、「Azure ロールベースのアクセス制御 (Azure RBAC) とは」を参照してください。For more information about how Azure RBAC helps you manage access, see What is Azure role-based access control (Azure RBAC).

DNS ゾーン共同作成者ロールThe DNS Zone Contributor role

DNS ゾーンの共同作成者ロールは、プライベート DNS リソースの管理用の組み込みロールです。The DNS Zone Contributor role is a built-in role for managing private DNS resources. このロールをユーザーまたはグループに適用すると、ユーザーまたはグループは DNS リソースを管理できるようになります。This role applied to a user or group enables them to manage DNS resources.

リソース グループ myResourceGroup には、Contoso Corporation の 5 つのゾーンが含まれています。The resource group myResourceGroup contains five zones for Contoso Corporation. このリソース グループに対する DNS ゾーン共同作成者アクセス許可を DNS 管理者に付与すると、管理者はこれらの DNS ゾーンを完全に制御できるようになります。Granting the DNS administrator DNS Zone Contributor permissions to that resource group, enables full control over those DNS zones. これは、不要なアクセス許可の付与を防ぐことができます。It avoids granting unnecessary permissions. DNS 管理者は、仮想マシンを作成または停止することはできません。The DNS administrator can't create or stop virtual machines.

Azure RBAC のアクセス許可は、Azure portal から 割り当てるのが最も簡単な方法です。The simplest way to assign Azure RBAC permissions is via the Azure portal.

リソース グループの [アクセス制御 (IAM)] を開き、 [追加] を選択して、 [DNS Zone Contributor(DNS ゾーン共同作成者)] ロールを選択します。Open Access control (IAM) for the resource group, then select Add, then select the DNS Zone Contributor role. アクセス許可を付与する必要があるユーザーまたはグループを選択します。Select the required users or groups to grant permissions.

Azure Portal を使用したリソース グループ レベルの Azure RBAC

アクセス許可は、Azure PowerShell を使用して付与することもできます。Permissions can also be granted using 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 CLI から実行することもできます。The equivalent command is also available via the Azure CLI:

# 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 RBACZone level Azure RBAC

Azure RBAC のルールは、サブスクリプション、リソース グループ、または個々のリソースに適用できます。Azure RBAC rules can be applied to a subscription, a resource group or to an individual resource. このリソースは、個々の DNS ゾーンまたは個々のレコード セットのいずれかになります。That resource can be an individual DNS zone, or an individual record set.

たとえば、リソース グループ myResourceGroup には、ゾーン contoso.com とサブゾーン customers.contoso.com が含まれています。For example, the resource group myResourceGroup contains the zone contoso.com and a subzone customers.contoso.com. 顧客アカウントごとに CNAME レコードが作成されています。CNAME records are created for each customer account. これらの CNAME レコードの管理に使用する管理者アカウントに、customers.contoso.com ゾーンにレコードを作成できるアクセス許可を割り当てます。The administrator account used to manage CNAME records is assigned permissions to create records in the customers.contoso.com zone. このアカウントでは customers.contoso.com のみを管理できます。The account can manage customers.contoso.com only.

ゾーン レベルの Azure RBAC アクセス許可は、Azure portal から付与できます。Zone-level Azure RBAC permissions can be granted via the Azure portal. ゾーンの [アクセス制御 (IAM)] を開き、 [追加][DNS Zone Contributor(DNS ゾーン共同作成者)] ロールの順に選択し、アクセス許可の付与が必要なユーザーまたはグループを選択します。Open Access control (IAM) for the zone, select Add, then select the DNS Zone Contributor role and select the required users or groups to grant permissions.

Azure Portal を使用した DNS ゾーン レベルの Azure RBAC

アクセス許可は、Azure PowerShell を使用して付与することもできます。Permissions can also be granted using 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 CLI から実行することもできます。The equivalent command is also available via the Azure CLI:

# 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 RBACRecord set level Azure RBAC

アクセス許可は、レコード セット レベルで適用されます。Permissions are applied at the record set level. ユーザーには、必要とするエントリに対する制御が許可され、他の変更を行うことはできません。The user is granted control to entries they need and are unable to make any other changes.

レコード セット レベルの Azure RBAC アクセス許可は、Azure portal の [レコード セット] ページにある [アクセス制御 (IAM)] ボタンを使用して構成できます。Record-set level Azure RBAC permissions can be configured via the Azure portal, using the Access Control (IAM) button in the record set page:

Azure portal でのレコード セット レベルの Azure RBAC

レコード セット レベルの Azure RBAC アクセス許可は、Azure PowerShell を使用して付与することもできます。Record-set level Azure RBAC permissions can also be granted using 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 CLI から実行することもできます。The equivalent command is also available via the Azure CLI:

# 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>"

カスタム ロールCustom roles

組み込みの DNS ゾーン共同作成者ロールでも DNS リソースを完全に制御できます。The built-in DNS Zone Contributor role enables full control over a DNS resource. 独自のカスタム Azure ロールを作成して、さらにきめ細かくリソースを制御することもできます。It's possible to build your own custom Azure roles to provide finer-grained control.

CNAME の管理に使用するアカウントには、CNAME レコードのみを管理できるアクセス許可を付与します。The account that is used to manage CNAMEs is granted permission to manage CNAME records only. そのアカウントは、他の種類のレコードを変更することはできません。The account is unable to modify records of other types. また、ゾーンの削除などのゾーンレベルの操作を行うこともできません。The account is unable to do zone-level operations such as zone delete.

次の例は、CNAME レコードのみを管理するためのカスタム ロールの定義を示しています。The following example shows a custom role definition for managing CNAME records only:

{
    "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 に固有のアクセス許可を定義しています。The Actions property defines the following DNS-specific permissions:

  • Microsoft.Network/dnsZones/CNAME/* は CNAME レコードを完全に制御できるアクセス許可を付与しています。Microsoft.Network/dnsZones/CNAME/* grants full control over CNAME records
  • Microsoft.Network/dnsZones/read は DNS ゾーンを読み取ることができるが変更はできないアクセス許可を付与しています。これにより、CNAME が作成されているゾーンを表示できます。Microsoft.Network/dnsZones/read grants permission to read DNS zones, but not to modify them, enabling you to see the zone in which the CNAME is being created.

残りの Actions プロパティは、DNS ゾーン共同作成者組み込みロールからコピーしたものです。The remaining Actions are copied from the DNS Zone Contributor built-in role.

注意

レコード セットを削除できないようにしながらもレコード セットの更新は許可するような Azure カスタム ロールの使い方は、効果的な制御方法とは言えません。Using an Azure custom role to prevent deleting record sets while still allowing them to be updated is not an effective control. レコード セットの削除は防止できますが、変更は自由にできてしまうためです。It prevents record sets from being deleted, but it does not prevent them from being modified. レコード セットに対するレコードの追加や削除といった変更が許可されることになり、すべてのレコードを削除してレコード セットを空にすることもできてしまいます。Permitted modifications include adding and removing records from the record set, including removing all records to leave an empty record set. DNS 解決の視点から見ると、これはレコード セットが削除された場合と同等の影響があります。This has the same effect as deleting the record set from a DNS resolution viewpoint.

現時点では、Azure Portal でカスタム ロールを定義することはできません。Custom role definitions can't currently be defined via the Azure portal. カスタム ロールは、Azure PowerShell を使用して次のロール定義に基づいて作成できます。A custom role based on this role definition can be created using Azure PowerShell:

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

また、Azure CLI を使用して作成することもできます。It can also be created via the Azure CLI:

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

作成したロールは、この記事で前述した組み込みロールの場合と同じ方法で割り当てることができます。The role can then be assigned in the same way as built-in roles, as described earlier in this article.

カスタム ロールの作成、管理、および割り当ての方法の詳細については、「Azure カスタム ロール」を参照してください。For more information on how to create, manage, and assign custom roles, see Azure custom roles.

リソース ロックResource locks

Azure Resource Manager は、別のタイプのセキュリティ制御をサポートしています。それはリソースをロックする機能です。Azure Resource Manager supports another type of security control, the ability to lock resources. リソース ロックはリソースに適用され、すべてのユーザーおよびロールが対象になります。Resource locks are applied to the resource, and are effective across all users and roles. 詳細については、「Azure Resource Manager によるリソースのロック」を参照してください。For more information, see Lock resources with Azure Resource Manager.

リソースのロックは 2 種類あります。CanNotDeleteReadOnly です。There are two types of resource lock: CanNotDelete and ReadOnly. これらは、プライベート DNS ゾーンまたは個別のレコード セットのいずれかに適用できます。These lock types can be applied either to a Private DNS zone, or to an individual record set. 以降のセクションでは、一般的なシナリオをいくつか紹介し、そのシナリオにリソース ロックを使用して対応する方法について説明します。The following sections describe several common scenarios, and how to support them using resource locks.

あらゆる変更に対する保護Protecting against all changes

変更を防止するには、ゾーンに ReadOnly ロックを適用します。To prevent changes being made, apply a ReadOnly lock to the zone. このロックにより、レコード セットの新規作成と既存のレコード セットの変更または削除を防止できます。This lock prevents new record sets from being created, and existing record sets from being modified or deleted.

ゾーン レベルのリソース ロックは、Azure Portal を使用して作成できます。Zone level resource locks can be created via the Azure portal. DNS ゾーン ページから [ロック][+ 追加] の順に選択します。From the DNS zone page, select Locks, then select +Add:

Azure Portal を使用したゾーン レベルのリソース ロック

ゾーン レベルのリソース ロックは、Azure PowerShell を使用して作成することもできます。Zone-level resource locks can also be created via 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 CLI から実行することもできます。The equivalent command is also available via the Azure CLI:

# 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>"

個々のレコードの保護Protecting individual records

既存の DNS レコード セットが変更されないようにするには、レコード セットに ReadOnly ロックを適用します。To prevent an existing DNS record set against modification, apply a ReadOnly lock to the record set.

注意

レコード セットへの CanNotDelete ロックの適用は、制御方法として効果的ではありません。Applying a CanNotDelete lock to a record set is not an effective control. レコード セットの削除は防止できますが、変更は自由にできてしまうためです。It prevents the record set from being deleted, but it does not prevent it from being modified. レコード セットに対するレコードの追加や削除といった変更が許可されることになり、すべてのレコードを削除してレコード セットを空にすることもできてしまいます。Permitted modifications include adding and removing records from the record set, including removing all records to leave an empty record set. DNS 解決の視点から見ると、これはレコード セットが削除された場合と同等の影響があります。This has the same effect as deleting the record set from a DNS resolution viewpoint.

現時点では、レコード セット レベルのリソース ロックは、Azure PowerShell でのみ構成できます。Record set level resource locks can currently only be configured using Azure PowerShell. Azure Portal と Azure CLI ではサポートされていません。They aren't supported in the Azure portal or Azure CLI.

# 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

ゾーンの削除に対する保護Protecting against zone deletion

Azure DNS でゾーンを削除すると、ゾーン内のレコード セットもすべて削除されます。When a zone is deleted in Azure DNS, all record sets in the zone are deleted. この操作は元に戻すことができません。This operation can't be undone. 誤って重要なゾーンを削除すると、ビジネスに多大な影響を与えるおそれがあります。Accidentally deleting a critical zone has the potential to have a significant business impact. ゾーンの誤削除を防止することが重要です。It's important to protect against accidental zone deletion.

ゾーンに CanNotDelete ロックを適用することで、ゾーンが削除されるのを防止できます。Applying a CanNotDelete lock to a zone prevents the zone from being deleted. ロックは、子リソースによって継承されます。Locks are inherited by child resources. ロックは、ゾーン内のレコード セットが削除されるのを防止します。A lock prevents any record sets in the zone from being deleted. 上記の注で説明したとおり、既存のレコード セットからレコードを削除できるため、効果的な制御方法とは言えません。As described in the note above, it's ineffective since records can still be removed from the existing record sets.

代わりに、ゾーン内のレコード セット (SOA レコード セットなど) に対して CanNotDelete ロックを適用してください。As an alternative, apply a CanNotDelete lock to a record set in the zone, such as the SOA record set. レコード セットが削除されなければ、ゾーンは削除されません。The zone isn't deleted without also deleting the record sets. このロックは、ゾーンの削除を防止しますが、ゾーン内のレコード セットを自由に変更することができます。This lock protects against zone deletion, while still allowing record sets within the zone to be modified freely. ゾーンを削除しようとすると、削除は、Azure Resource Manager によって検出されます。If an attempt is made to delete the zone, Azure Resource Manager detects this removal. この削除により、SOA レコード セットも削除されます。SOA はロックされているため、Azure Resource Manager は、呼び出しをブロックします。The removal would also delete the SOA record set, Azure Resource Manager blocks the call because the SOA is locked. 結果として、レコード セットは削除されません。No record sets are deleted.

次の PowerShell コマンドを実行すると、指定されたゾーンの SOA レコードに対する CanNotDelete ロックが作成されます。The following PowerShell command creates a CanNotDelete lock against the SOA record of the given zone:

# 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

ゾーンの誤削除を防止するもう 1 つの方法は、カスタム ロールを使用することです。Another option to prevent accidental zone deletion is by using a custom role. このロールにより、ゾーンの管理に使用されるアカウントに、ゾーンの削除アクセス許可が付与されないようにします。This role ensures the accounts used to manage your zones don't have zone delete permissions.

ゾーンを削除する必要がある場合は、2 段階の削除操作を強制することができます。When you do need to delete a zone, you can enforce a two-step delete:

  • まず、ゾーンの削除アクセス許可を付与します。First, grant zone delete permissions
  • 次に、ゾーンを削除するアクセス許可を付与します。Second, grant permissions to delete the zone.

カスタム ロールは、これらのアカウントでアクセスされるすべてのゾーンに有効です。The custom role works for all zones accessed by those accounts. サブスクリプション所有者などのゾーンの削除アクセス許可を持つアカウントは、依然としてゾーンを誤って削除する可能性があります。Accounts with zone delete permissions, such as the subscription owner, can still accidentally delete a zone.

DNS ゾーン保護のための多層防御手法として、リソースのロックとカスタム ロールという 2 つの方法を同時に使用することもできます。It's possible to use both approaches - resource locks and custom roles - at the same time, as a defense-in-depth approach to DNS zone protection.

次のステップNext steps