如何保護 DNS 區域和記錄

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

DNS 區域和記錄是重要的資源。 刪除 DNS 區域或只是一筆 DNS 記錄可能導致服務中斷。 必須防未經授權或意外變更 DNS 區域和記錄。

本文說明 Azure DNS 如何讓您保護避免 DNS 區域和記錄遭到這種變更。 我們運用 Azure Resource Manager 提供的兩個強大的安全性功能︰Azure 角色型存取控制 (Azure RBAC)資源鎖定

Azure 角色型存取控制

Azure 角色型存取控制 (RBAC) 支援對 Azure 使用者、群組和資源進行細部的存取權管理。 Azure RBAC 可讓您授與使用者所需的存取層級。 如需 Azure RBAC 如何協助您管理存取權的詳細資訊,請參閱什麼是 Azure 角色型存取控制 (Azure RBAC)

DNS 區域參與者角色

DNS 區域參與者角色是內建角色,用於管理私人 DNS 資源。 此角色套用至使用者或群組,使其能夠管理 DNS 資源。

資源群組 myResourceGroup 包含 Contoso Corporation 的五個區域。 將該資源群組的 DNS 區域參與者權限授與 DNS 系統管理員,可讓他們具有這些 DNS 區域的完整控制權。 這樣可避免授與不必要的權限。 DNS 系統管理員無法建立或停止虛擬機器。

指派 RBAC 權限最簡單的方式是透過 Azure 入口網站

開啟資源群組的 [存取控制 (IAM)],接著選取 [+ 新增],然後選取 [DNS 區域參與者] 角色。 選取需要授與限權的使用者或群組。

Screenshot of access control page for resource group.

權限也可以使用 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 入口網站授與區域層級 Azure RBAC 權限。 開啟區域的 [存取控制 (IAM)] 刀鋒視窗、選取 [+ 新增],然後選取 [DNS 區域參與者] 角色,並選取必要的使用者或群組以授與權限。

Screenshot of access control page for DNS zone.

權限也可以使用 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 入口網站,使用記錄集頁面中的 [使用者] 按鈕來設定:

Screenshot of user button in record set.

您也可以使用 Azure PowerShell 授與記錄集層級 RBAC 權限:

# 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/c276fc76-9cd4-44c9-99a7-4fd71546436e"
    ]
}

Actions 屬性會定義下列 DNS 特定權限︰

  • Microsoft.Network/dnsZones/CNAME/* 授與 CNAME 記錄的完整控制權
  • Microsoft.Network/dnsZones/read 授與權限以讀取 DNS 區域,但無法修改它們,讓您查看在其中建立 CNAME 的區域。

剩餘的動作會從 DNS 區域參與者內建角色複製。

注意

如果使用 Azure 自訂角色來防止刪除記錄集,但卻允許更新,這樣不算是有效控制。 它會防止記錄集被刪除,但它不會防止它們被修改。 允許的修改包括從記錄集新增和移除記錄,包括移除所有記錄以保持空白記錄集。 這與從 DNS 解析觀點來刪除記錄集有相同的效果。

目前無法透過 Azure 入口網站來定義自訂角色。 可以使用 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 來鎖定資源

有兩種資源鎖定︰CanNotDeleteReadOnly。 這些鎖定類型可以套用至私人 DNS 區域,或個別記錄集。 下列章節說明幾個常見的案例,以及如何使用資源鎖定進行支援。

保護免於所有變更

若要防止變更,請將 ReadOnly 鎖定套用至區域。 此鎖定可防止建立新的記錄集,也防止修改或刪除現有的記錄集。

可以透過 Azure 入口網站來建立區域層級資源鎖定。 從 [DNS 區域] 頁面選取 [鎖定],然後選取 [+ 新增]

Screenshot of zone level resource locks.

您也可以透過 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 入口網站或 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 鎖定套用至區域可防止區域刪除。 子資源會繼承鎖定。 鎖定可防止刪除區域中的任何記錄集。 如以上備註所述,因為仍可從現有的記錄集移除記錄,效果有限。

可改為將 CanNotDelete 鎖定套用至區域中的記錄集,例如 SOA 記錄集。 只要不刪除記錄集就不會刪除區域。 此鎖定可防止刪除區域,但仍允許自由修改區域內的記錄集。 如果試圖刪除區域,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

另一種選擇是使用自訂角色來防止意外刪除區域。 此角色可確保用來管理區域的帳戶沒有區域刪除權限。

確實需要刪除區域時,您可以強制執行兩步驟刪除:

  • 首先,授與區域刪除權限
  • 其次,授與權限來刪除區域。

自訂角色適用於這些帳戶存取的所有區域。 具有區域刪除權限的帳戶 (例如訂用帳戶擁有者) 仍可能不小心刪除區域。

兩種方法 (資源鎖定和自訂角色) 可同時運用,作為 DNS 區域保護的深度防禦方法。

下一步