注
Azure Az PowerShell モジュールを使用して Azure と対話することをお勧めします。 作業を始めるには、「Azure PowerShell をインストールする」を参照してください。 Az PowerShell モジュールに移行する方法については、「 Azure PowerShell を AzureRM から Az に移行する」を参照してください。
DNS ゾーンとレコードは重要なリソースです。 DNS ゾーンまたは 1 つの DNS レコードを削除すると、サービスが停止する可能性があります。 DNS ゾーンとレコードは、承認されていない変更や偶発的な変更から保護されることが重要です。
この記事では、Azure DNS を使用して、このような変更からプライベート DNS ゾーンとレコードを保護する方法について説明します。 Azure Resource Manager によって提供される 2 つの強力なセキュリティ機能 ( Azure ロールベースのアクセス制御 (Azure RBAC) と リソース ロック) を適用します。
Azure ロールベースのアクセス制御
Azure ロールベースのアクセス制御 (Azure RBAC) を使用すると、Azure ユーザー、グループ、およびリソースに対してきめ細かいアクセス管理が可能になります。 Azure RBAC を使用すると、ユーザーが必要とするアクセス レベルを付与できます。 Azure RBAC を使用してアクセスを管理する方法の詳細については、「 Azure ロールベースのアクセス制御 (Azure RBAC) とは」を参照してください。
DNS ゾーン貢献者役割
DNS ゾーン共同作成者ロールは、プライベート DNS リソースを管理するための組み込みロールです。 ユーザーまたはグループに適用されるこのロールを使用すると、DNS リソースを管理できます。
リソース グループ myResourceGroup には、Contoso Corporation 用の 5 つのゾーンが含まれています。 そのリソース グループに DNS 管理者の DNS ゾーン共同作成者のアクセス許可を付与すると、それらの DNS ゾーンを完全に制御できます。 不要なアクセス許可の付与を回避します。 DNS 管理者は仮想マシンを作成または停止できません。
Azure RBAC アクセス許可を割り当てる最も簡単な方法は、 Azure portal を使用することです。
リソース グループの アクセス制御 (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 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 RBAC
Azure RBAC ルールは、サブスクリプション、リソース グループ、または個々のリソースに適用できます。 そのリソースには、個々の DNS ゾーンまたは個々のレコード セットを指定できます。
たとえば、リソース グループ myResourceGroup には、ゾーン contoso.com とサブゾーン customers.contoso.com が含 まれます。 CNAME レコードは、顧客アカウントごとに作成されます。 CNAME レコードの管理に使用する管理者アカウントには、 customers.contoso.com ゾーンにレコードを作成するためのアクセス許可が割り当てられます。 アカウントは 、customers.contoso.com のみを管理できます。
ゾーン レベルの Azure RBAC アクセス許可は、Azure portal を使用して付与できます。 ゾーンの アクセス制御 (IAM) を開き、[ + 追加] を選択してから、 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 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 RBAC
権限はレコードセットのレベルで適用されます。 ユーザーには、必要なエントリに対する制御が付与され、他の変更を行うことができません。
レコード セット レベルの Azure RBAC アクセス許可は、レコード セット ページの [ユーザー ] ボタンを使用して、Azure portal を使用して構成できます。
レコード セット レベルの 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 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>"
カスタム ロール
組み込みの 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
]
}
Actions プロパティは、次の DNS 固有のアクセス許可を定義します。
-
Microsoft.Network/dnsZones/CNAME/*CNAME レコードを完全に制御できます -
Microsoft.Network/dnsZones/readは DNS ゾーンを読み取るアクセス許可を付与しますが、変更することはできません。これにより、CNAME が作成されているゾーンを確認できます。
残りのアクションは、 DNS ゾーン共同作成者の組み込みロールからコピーされます。
注
Azure カスタム ロールを使用してレコード セットを削除しないようにしながら、レコード セットの更新を許可することは、効果的な制御ではありません。 レコード セットが削除されるのを防ぎますが、レコード セットが変更されるのを防ぐことはありません。 許可される変更には、レコード セットのレコードの追加と削除が含まれます。これには、空のレコード セットから残すすべてのレコードの削除が含まれます。 これは、DNS 解決ビューポイントからレコード セットを削除する場合と同じ効果があります。
カスタム ロール定義は、現在、Azure portal を使用して定義することはできません。 このロール定義に基づくカスタム ロールは、Azure PowerShell を使用して作成できます。
# Create new role definition based on input file
New-AzRoleDefinition -InputFile <file path>
また、Azure CLI を使用して作成することもできます。
# Create new role definition based on input file
az role definition create --role-definition <file path>
その後、この記事で前述したように、組み込みロールと同じ方法でロールを割り当てることができます。
カスタム ロールを作成、管理、割り当てる方法の詳細については、「 Azure カスタム ロール」を参照してください。
リソース ロック
Azure Resource Manager では、リソースをロックする機能という別の種類のセキュリティ制御がサポートされています。 リソース ロックはリソースに適用され、すべてのユーザーとロールで有効になります。 詳細については、「Azure Resource Manager によるリソースのロック」を参照してください。
リソース ロックには、 CanNotDelete と ReadOnly の 2 種類があります。 これらのロックの種類は、プライベート DNS ゾーンまたは個々のレコード セットに適用できます。 次のセクションでは、いくつかの一般的なシナリオと、リソース ロックを使用してそれらをサポートする方法について説明します。
すべての変更からの保護
変更が行われないようにするには、ゾーンに ReadOnly ロックを適用します。 このロックにより、新しいレコード セットが作成されず、既存のレコード セットが変更または削除されなくなります。
ゾーン レベルのリソース ロックは、Azure portal を使用して作成できます。 [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 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>"
個々のレコードの保護
既存の DNS レコード セットが変更されないようにするには、レコード セットに ReadOnly ロックを適用します。
注
レコード セットに CanNotDelete ロックを適用することは、有効なコントロールではありません。 レコード セットは削除されませんが、変更を妨げることはありません。 許可される変更には、レコード セットのレコードの追加と削除が含まれます。これには、空のレコード セットから残すすべてのレコードの削除が含まれます。 これは、DNS 解決ビューポイントからレコード セットを削除する場合と同じ効果があります。
レコード セット レベルのリソース ロックは、現在、Azure PowerShell を使用してのみ構成できます。 これらは、Azure portal または 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
ゾーンの削除からの保護
Azure DNS でゾーンが削除されると、ゾーン内のすべてのレコード セットが削除されます。 この操作を元に戻すことはできません。 クリティカル ゾーンを誤って削除すると、ビジネスに大きな影響を与える可能性があります。 偶発的なゾーンの削除から保護することが重要です。
CanNotDelete ロックをゾーンに適用すると、ゾーンが削除されなくなります。 ロックは、子リソースによって継承されます。 ロックにより、ゾーン内のすべてのレコード セットが削除されなくなります。 上記のメモで説明したように、既存のレコード セットからレコードを削除できるため、効果がありません。
別の方法として、ゾーン内のレコード セット (SOA レコード セットなど) に CanNotDelete ロックを適用します。 レコード セットも削除しないと、ゾーンは削除されません。 このロックにより、ゾーンの削除から保護されますが、ゾーン内のレコード セットは自由に変更できます。 ゾーンを削除しようとすると、Azure Resource Manager によってこの削除が検出されます。 削除によって SOA レコード セットも削除されます。SOA がロックされているため、Azure Resource Manager によって呼び出しがブロックされます。 レコード セットは削除されません。
次の PowerShell コマンドは、指定されたゾーンの SOA レコードに対して CanNotDelete ロックを作成します。
# 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 つのオプションは、カスタム ロールを使用することです。 このロールにより、ゾーンの管理に使用されるアカウントにゾーンの削除アクセス許可が付与されません。
ゾーンを削除する必要がある場合は、次の 2 ステップの削除を適用できます。
- まず、ゾーンの削除アクセス許可を付与します。
- 次に、ゾーンを削除するアクセス許可を付与します。
カスタム ロールは、これらのアカウントによってアクセスされるすべてのゾーンに対して機能します。 サブスクリプション所有者などのゾーン削除アクセス許可を持つアカウントは、ゾーンを誤って削除する可能性があります。
DNS ゾーン保護に対する多層防御アプローチとして、リソース ロックとカスタム ロールの両方のアプローチを同時に使用できます。
次のステップ
- Azure RBAC の操作の詳細については、「 Azure ロールベースのアクセス制御 (Azure RBAC) とは」を参照してください。
- リソース ロックの操作の詳細については、「 Azure Resource Manager を使用してリソースをロックする」を参照してください。