如何保護私人 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 資源。
資源群組 myPrivateDNS 包含 Contoso Corporation 的五個區域。 將該資源群組的私人 DNS 區域參與者權限授與 DNS 系統管理員,以完全控制這些 DNS 區域。 這樣可避免授與不必要的權限。 DNS 系統管理員無法建立或停止虛擬機器。
指派 RBAC 權限最簡單的方式是透過 Azure 入口網站。
開啟資源群組的 [存取控制 (IAM)],選取 [新增],然後選取 [私人 DNS 區域參與者] 角色。 選取需要授與限權的使用者或群組。
權限也可以使用 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
對等的命令也可以透過 Azure CLI 使用:
# 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>"
私人區域層級 Azure RBAC
Azure RBAC 規則可以套用至訂用帳戶、資源群組或個別資源。 該資源可以是個別 DNS 區域或個別記錄集。
例如,資源群組 myPrivateDNS 包含區域 private.contoso.com 和子區域 customers.private.contoso.com。 對每個客戶帳戶都建立 CNAME 記錄。 用來管理 CNAME 記錄的系統管理員帳戶獲得權限在 customers.private.contoso.com 區域中建立記錄。 此帳戶只能管理 customers.private.contoso.com。
您可以透過 Azure 入口網站授與區域層級 Azure RBAC 權限。 開啟區域的 [存取控制 (IAM)],選取 [新增],然後選取 [私人 DNS 區域參與者] 角色。 選取需要授與限權的使用者或群組。
權限也可以使用 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
對等的命令也可以透過 Azure CLI 使用:
# 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>/"
記錄集層級 Azure RBAC
套用的權限為記錄集層級。 使用者獲得所需項目的控制權,但無法進行任何其他變更。
您可以在 Azure 入口網站使用記錄集頁面中的 [存取控制 (IAM)] 按鈕,以設定記錄集層級 RBAC 權限︰
您也可以使用 Azure PowerShell 授與記錄集層級 RBAC 權限:
# 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
對等的命令也可以透過 Azure CLI 使用:
# 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>"
自訂角色
內建私人 DNS 區域參與者角色可以完全控制 DNS 資源。 您可以建立自己的自訂 Azure 角色,以提供更細部的控制。
用來管理 CNAME 的帳戶只獲得權限來管理 CNAME 記錄。 此帳戶無法修改其他類型的記錄。 此帳戶無法執行區域層級的作業,例如刪除區域。
下列範例示範只管理 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/<subscription id>"
]
}
Actions 屬性會定義下列 DNS 特定權限︰
Microsoft.Network/privateDnsZones/CNAME/*
授與 CNAME 記錄的完整控制權Microsoft.Network/privateDNSZones/read
會授與權限以讀取 DNS 區域,但無法修改,可讓您查看建立 CNAME 的區域。
注意
如果使用 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 create -inputfile <file path>
然後可以使用與內建角色相同的方式指派角色,如本文稍早所述。
如需如何建立、管理及指派自訂角色的詳細資訊,請參閱 Azure 自訂角色。
資源鎖定
Azure Resource Manager 支援另一種安全性控制,也就是能夠鎖定資源。 資源鎖定套用至資源,效力及於所有使用者和角色。 如需詳細資訊,請參閱使用 Azure Resource Manager 來鎖定資源。
有兩種資源鎖定︰CanNotDelete 和 ReadOnly。 這些鎖定類型可以套用至私人 DNS 區域,或個別記錄集。 下列章節說明幾個常見的案例,以及如何使用資源鎖定進行支援。
保護免於所有變更
若要防止變更,請將 ReadOnly 鎖定套用至區域。 此鎖定可防止建立新的記錄集,也防止修改或刪除現有的記錄集。
可以透過 Azure 入口網站來建立區域層級資源鎖定。 從 [DNS 區域] 頁面選取 [鎖定],然後選取 [+新增]:
您也可以透過 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
對等的命令也可以透過 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 "privateDnsZones" \
--resource-group "<resource group name>"
保護個別記錄
若要防止現有 DNS 記錄集遭到修改,請將 ReadOnly 鎖定套用至記錄集。
注意
將 CanNotDelete 鎖定套用至記錄集不是有效的控制。 它會防止記錄集被刪除,但它不會防止它被修改。 允許的修改包括從記錄集新增和移除記錄,包括移除所有記錄以保持空白記錄集。 這與從 DNS 解析觀點來刪除記錄集有相同的效果。
記錄集層級資源鎖定目前只能使用 Azure PowerShell 進行設定。 Azure 入口網站或 Azure CLI 中不支援這種鎖定。
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
防止區域刪除
在 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>"
$rnm = "<zone name>/@"
$rty = "Microsoft.Network/privateDnsZones/SOA"
$rsg = "<resource group name>"
New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rnm -ResourceType $rty -ResourceGroupName $rsg
另一種選擇是使用自訂角色來防止意外刪除區域。 此角色可確保用來管理區域的帳戶沒有區域刪除權限。
確實需要刪除區域時,您可以強制執行兩步驟刪除:
- 首先,授與區域刪除權限
- 其次,授與權限來刪除區域。
自訂角色適用於這些帳戶存取的所有區域。 具有區域刪除權限的帳戶 (例如訂用帳戶擁有者) 仍可能不小心刪除區域。
兩種方法 (資源鎖定和自訂角色) 可同時運用,作為 DNS 區域保護的深度防禦方法。
下一步
- 如需有關使用 Azure RBAC 的詳細資訊,請參閱什麼是 Azure 角色型存取控制 (Azure RBAC)?。
- 如需使用資源鎖定的詳細資訊,請參閱使用 Azure Resource Manager 鎖定資源。