프라이빗 DNS 영역 및 레코드 보호 방법

참고

이 문서는 Azure Az PowerShell 모듈을 사용하도록 업데이트되었습니다. Az PowerShell 모듈은 Azure와 상호 작용하는 데 추천되는 PowerShell 모듈입니다. Az PowerShell 모듈을 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

프라이빗 DNS 영역 및 레코드는 중요한 리소스입니다. DNS 영역 또는 단일 DNS 레코드를 삭제하면 서비스 중단이 발생할 수 있습니다. 따라서 DNS 영역 및 레코드를 무단 변경 또는 실수로 인한 변경으로부터 보호하는 것이 중요합니다.

이 문서에서는 Azure DNS를 사용하여 프라이빗 DNS 영역 및 레코드를 해당 변경으로부터 보호하는 방법을 설명합니다. Azure Resource Manager에서 제공하는 두 가지 강력한 보안 기능, 즉 Azure RBAC(Role Based Access Control)리소스 잠금을 적용합니다.

Azure 역할 기반 액세스 제어

Azure RBAC(Role Based Access Control)를 사용하면 Azure 사용자, 그룹 및 리소스에 대한 세분화된 액세스 관리가 가능합니다. Azure RBAC를 사용하면 사용자에게 필요한 액세스 수준을 부여할 수 있습니다. Azure RBAC를 사용하여 액세스를 관리하는 방법은 Azure RBAC(Role Based Access Control)란?을 참조하세요.

프라이빗 DNS 영역 contributor 역할

프라이빗 DNS 영역 contributor 역할은 프라이빗 DNS 리소스를 관리하기 위한 기본 제공 역할입니다. 사용자 또는 그룹에 적용된 이 역할을 통해 프라이빗 DNS 리소스를 관리할 수 있습니다.

myPrivateDNS 리소스 그룹에는 Contoso Corporation에 대한 5개의 영역이 포함되어 있습니다. DNS 관리자에게 해당 리소스 그룹에 대한 프라이빗 DNS 영역 Contributor 권한을 부여할 경우 해당 DNS 영역을 완전히 제어할 수 있습니다. 불필요한 권한 부여를 방지합니다. DNS 관리자가 가상 머신을 만들거나 중지할 수 없습니다.

Azure RBAC 권한을 할당하는 가장 간단한 방법은 Azure Portal을 사용하는 것입니다.

리소스 그룹에 대한 액세스 제어(IAM) 를 열고 추가 를 선택한 다음 프라이빗 DNS 영역 Contributor 역할을 선택합니다. 필요한 사용자 또는 그룹을 선택하여 권한을 부여합니다.

Azure Portal을 통한 리소스 그룹 수준 Azure RBAC

권한은 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 레코드를 관리하는 데 사용되는 Administrator 계정에는 customers.private.contoso.com 영역에 레코드를 만들 수 있는 권한이 할당됩니다. 이 계정은 customers.private.contoso.com 만 관리할 수 있습니다.

영역 수준 Azure RBAC 권한은 Azure Portal을 통해 부여할 수 있습니다. 영역에 대한 액세스 제어(IAM) 를 열고 추가 를 선택한 다음 프라이빗 DNS 영역 Contributor 역할을 선택합니다. 필요한 사용자 또는 그룹을 선택하여 권한을 부여합니다.

Azure Portal을 통한 DNS 영역 수준 Azure RBAC

권한은 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 RBAC 권한은 Azure Portal의 레코드 집합 페이지에서 액세스 제어(IAM) 단추를 사용하여 구성할 수 있습니다.

스크린샷은 액세스 제어(IAM) 단추를 보여 줍니다.

스크린샷은 역할 할당 추가가 선택된 액세스 제어를 보여 줍니다.

레코드 집합 수준 Azure RBAC 권한은 Azure PowerShell을 사용하여 부여할 수도 있습니다.

# 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 영역 Contributor 역할을 사용하면 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/c276fc76-9cd4-44c9-99a7-4fd71546436e"
    ]
}

작업 속성은 다음과 같은 DNS별 권한을 정의합니다.

  • Microsoft.Network/privateDnsZones/CNAME/*은 CNAME 레코드에 대한 모든 권한을 부여합니다.
  • Microsoft.Network/privateDNSZones/read는 프라이빗 DNS 영역을 읽을 수 있는 권한은 부여하지만 수정할 수 있는 권한은 부여하지 않으므로 CNAME이 생성되는 영역을 확인할 수 있습니다.

참고

레코드 집합 삭제를 방지하기 위해 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 create -inputfile <file path>

그런 다음 이 문서의 앞부분에서 설명한 대로 역할을 기본 역할과 동일한 방식으로 할당할 수 있습니다.

사용자 지정 역할을 만들고 관리하고 할당하는 방법은 Azure 사용자 지정 역할을 참조하세요.

리소스 잠금

Azure Resource Manager는 리소스 잠금 기능과 같은 다른 유형의 보안 제어를 지원합니다. 리소스 잠금은 리소스에 적용되고 모든 사용자 및 역할에서 유효합니다. 자세한 내용은 Azure 리소스 관리자를 사용하여 리소스 잠그기를 참조하세요.

리소스 잠금에는 CanNotDeleteReadOnly 의 두 가지 유형이 있습니다. 잠금 유형은 프라이빗 DNS 영역 또는 개별 레코드 집합에 적용할 수 있습니다. 다음 섹션에서는 몇 가지 일반적인 시나리오와 리소스 잠금을 사용하여 지원하는 방법에 대해 설명합니다.

모든 변경으로부터 보호

변경을 방지하려면 영역에 ReadOnly 잠금을 적용합니다. 이 잠금은 새 레코드 집합을 만들지 못하도록 하며 기존 레코드 집합을 수정 또는 삭제하지 못하도록 합니다.

Azure Portal을 통해 영역 수준의 리소스 잠금을 만들 수 있습니다. DNS 영역 페이지에서 잠금 을 선택한 다음, +추가 를 선택합니다.

Azure Portal을 통한 영역 수준 리소스 잠금

또한 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 Portal 또는 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"
$rsg = "<resource group name>"

New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rnm -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>"
$rnm = "<zone name>/@"
$rty = "Microsoft.Network/privateDnsZones/SOA"
$rsg = "<resource group name>"

New-AzResourceLock -LockLevel $lvl -LockName $lnm -ResourceName $rnm -ResourceType $rty -ResourceGroupName $rsg

실수로 인한 영역 삭제를 방지하는 또 다른 옵션은 사용자 지정 역할을 사용하는 것입니다. 이 역할은 영역을 관리하는 데 사용되는 계정에 영역 삭제 권한이 없도록 합니다.

영역을 삭제해야 하는 경우 다음과 같이 2단계 삭제를 적용할 수 있습니다.

  • 먼저 영역 삭제 권한을 부여합니다.
  • 그런 다음 영역을 삭제할 수 있는 권한을 부여합니다.

사용자 지정 역할은 해당 계정에서 액세스하는 모든 영역에 대해 작동합니다. 구독 소유자와 같이 영역 삭제 권한이 있는 계정은 여전히 영역을 실수로 삭제할 수 있습니다.

DNS 영역 보호에 대한 심층 방어 접근 방식으로 두 가지 접근 방식인 리소스 잠금과 사용자 지정 역할을 동시에 사용할 수도 있습니다.

다음 단계