빠른 시작: ARM 템플릿을 사용하여 비규격 리소스를 식별하는 정책 할당 만들기

이 빠른 시작에서는 ARM 템플릿(Azure Resource Manager 템플릿)을 사용하여 Azure 정책에 대한 리소스 준수 상태를 검증하는 정책 할당을 만듭니다. 정책은 리소스 그룹에 할당되고 관리 디스크를 사용하지 않는 가상 머신을 감사합니다. 정책 할당을 만든 후 비준수 가상 머신을 식별합니다.

Azure Resource Manager 템플릿은 프로젝트에 대한 인프라 및 구성을 정의하는 JSON(JavaScript Object Notation) 파일입니다. 이 템플릿은 선언적 구문을 사용합니다. 배포를 만들기 위한 프로그래밍 명령의 시퀀스를 작성하지 않고 의도하는 배포를 설명합니다.

환경이 필수 구성 요소를 충족하고 ARM 템플릿 사용에 익숙한 경우 Azure에 배포 단추를 선택합니다. 그러면 Azure Portal에서 템플릿이 열립니다.

Azure Resource Manager 템플릿을 사용하여 정책을 할당하는 Azure에 배포 단추의 스크린샷

필수 조건

  • Azure 계정이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Azure PowerShell 또는 Azure CLI.
  • Visual Studio CodeARM(Azure Resource Manager) 도구.
  • Microsoft.PolicyInsights는 Azure 구독에 등록되어야 합니다. 리소스 공급자를 등록하려면 리소스 공급자를 등록할 수 있는 권한이 있어야 합니다. 해당 권한은 기여자 및 소유자 역할에 포함되어 있습니다.
  • 관리 디스크를 사용하지 않는 가상 머신이 하나 이상 포함된 리소스 그룹입니다.

템플릿 검토

ARM 템플릿은 리소스 그룹 범위에 대한 정책 할당을 만들고 기본 제공 정책 정의 관리 디스크를 사용하지 않는 VM 감사를 할당합니다.

다음 ARM 템플릿을 policy-assignment.json으로 만듭니다.

  1. Visual Studio Code를 열고 파일>새 텍스트 파일을 선택합니다.
  2. ARM 템플릿을 복사하고 Visual Studio Code에 붙여 넣습니다.
  3. 파일>저장을 선택하고 파일 이름에 policy-assignment.json을 사용합니다.
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyAssignmentName": {
      "type": "string",
      "defaultValue": "audit-vm-managed-disks",
      "metadata": {
        "description": "Policy assignment name used in assignment's resource ID"
      }
    },
    "policyDefinitionID": {
      "type": "string",
      "defaultValue": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
      "metadata": {
        "description": "Policy definition ID"
      }
    },
    "policyDisplayName": {
      "type": "string",
      "defaultValue": "Audit VM managed disks",
      "metadata": {
        "description": "Display name for Azure portal"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2023-04-01",
      "name": "[parameters('policyAssignmentName')]",
      "properties": {
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "description": "Policy assignment to resource group scope created with ARM template",
        "displayName": "[parameters('policyDisplayName')]",
        "nonComplianceMessages": [
          {
            "message": "Virtual machines should use managed disks"
          }
        ]
      }
    }
  ],
  "outputs": {
    "assignmentId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Authorization/policyAssignments', parameters('policyAssignmentName'))]"
    }
  }
}

ARM 템플릿에 정의된 리소스 종류는 Microsoft.Authorization/policyAssignments입니다.

템플릿은 세 가지 매개 변수를 사용하여 정책 할당을 배포합니다.

  • policyAssignmentName은 이름이 audit-vm-managed-disks인 정책 할당을 만듭니다.
  • policyDefinitionID는 기본 제공 정책 정의의 ID를 사용합니다. 참고로 ID를 가져오는 명령은 템플릿을 배포하는 섹션에 있습니다.
  • policyDisplayName은 Azure Portal에 표시되는 표시 이름을 만듭니다.

ARM 템플릿 파일에 대한 자세한 내용은 다음을 참조하세요.

ARM 템플릿 배포

Azure PowerShell 또는 Azure CLI를 사용하여 ARM 템플릿을 배포할 수 있습니다.

Visual Studio Code 터미널 세션에서 Azure에 연결합니다. 구독이 두 개 이상인 경우 명령을 실행하여 구독에 대한 컨텍스트를 설정합니다. <subscriptionID> 를 Azure 구독 ID로 바꿉니다.

Connect-AzAccount

# Run these commands if you have multiple subscriptions
Get-AzSubScription
Set-AzContext -Subscription <subscriptionID>

Microsoft.PolicyInsights가 등록되었는지 확인할 수 있습니다. 그렇지 않은 경우 명령을 실행하여 리소스 공급자를 등록할 수 있습니다.

Get-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights' |
   Select-Object -Property ResourceTypes, RegistrationState

Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'

자세한 내용은 Get-AzResourceProviderRegister-AzResourceProvider에서 확인하세요.

다음 명령은 policyDefinitionID 매개 변수의 값을 표시합니다.

(Get-AzPolicyDefinition |
  Where-Object { $_.Properties.DisplayName -eq 'Audit VMs that do not use managed disks' }).ResourceId

다음 명령은 리소스 그룹에 정책 정의를 배포합니다. <resourceGroupName>을 리소스 그룹 이름으로 바꿉니다.

$rg = Get-AzResourceGroup -Name '<resourceGroupName>'

$deployparms = @{
Name = 'PolicyDeployment'
ResourceGroupName = $rg.ResourceGroupName
TemplateFile = 'policy-assignment.json'
}

New-AzResourceGroupDeployment @deployparms

$rg 변수는 리소스 그룹의 속성을 저장합니다. $deployparms 변수는 스플래팅을 사용하여 매개 변수 값을 만들고 가독성을 향상합니다. New-AzResourceGroupDeployment 명령은 $deployparms 변수에서 정의된 매개 변수 값을 사용합니다.

  • Name은 리소스 그룹의 배포에 대해 출력 및 Azure에 표시되는 배포 이름입니다.
  • ResourceGroupName$rg.ResourceGroupName 속성을 사용하여 정책이 할당된 리소스 그룹의 이름을 가져옵니다.
  • TemplateFile은 로컬 컴퓨터에서 ARM 템플릿의 이름과 위치를 지정합니다.

다음 명령을 사용하여 정책 할당의 배포를 확인할 수 있습니다.

이 명령은 $rg.ResourceId 속성을 사용하여 리소스 그룹의 ID를 가져옵니다.

Get-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
Name               : audit-vm-managed-disks
ResourceId         : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
ResourceName       : audit-vm-managed-disks
ResourceGroupName  : {resourceGroupName}
ResourceType       : Microsoft.Authorization/policyAssignments
SubscriptionId     : {subscriptionId}
PolicyAssignmentId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
Properties         : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyAssignmentProperties

자세한 내용은 get-AzPolicyAssignment에서 확인하세요.

비규격 리소스 식별

정책 할당이 배포되면 리소스 그룹에 배포된 가상 머신이 관리 디스크 정책을 준수하도록 감사됩니다.

새 정책 할당에 대한 준수 상태가 활성화되고 정책 상태에 대한 결과를 제공하는 데 몇 분 정도 걸립니다.

$complianceparms = @{
ResourceGroupName = $rg.ResourceGroupName
PolicyAssignmentName = 'audit-vm-managed-disks'
Filter = 'IsCompliant eq false'
}

Get-AzPolicyState @complianceparms

$complianceparms 변수는 Get-AzPolicyState 명령에서 사용되는 매개 변수 값을 만듭니다.

  • ResourceGroupName$rg.ResourceGroupName 속성에서 리소스 그룹 이름을 가져옵니다.
  • PolicyAssignmentName은 정책 할당을 만들 때 사용된 이름을 지정합니다.
  • Filter는 식을 사용하여 정책 할당을 준수하지 않는 리소스를 찾습니다.

결과는 다음 예시와 유사하며 ComplianceStateNonCompliant를 보여 줍니다.

Timestamp                : 2/26/2024 19:02:56
ResourceId               : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmId}
PolicyAssignmentId       : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks
PolicyDefinitionId       : /providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d
IsCompliant              : False
SubscriptionId           : {subscriptionId}
ResourceType             : Microsoft.Compute/virtualMachines
ResourceLocation         : {location}
ResourceGroup            : {resourceGroupName}
ResourceTags             : tbd
PolicyAssignmentName     : audit-vm-managed-disks
PolicyAssignmentOwner    : tbd
PolicyAssignmentScope    : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}
PolicyDefinitionName     : 06a78e20-9358-41c9-923c-fb736d382a4d
PolicyDefinitionAction   : audit
PolicyDefinitionCategory : tbd
ManagementGroupIds       : {managementGroupId}
ComplianceState          : NonCompliant
AdditionalProperties     : {[complianceReasonCode, ]}

자세한 내용은 Get-AzPolicyState에서 확인하세요.

리소스 정리

Remove-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId

Azure PowerShell 세션에서 로그아웃하려면 다음을 수행합니다.

Disconnect-AzAccount

다음 단계

이 빠른 시작에서는 Azure 환경에서 규정 비준수 리소스를 식별하는 정책 정의를 할당했습니다.

리소스 준수의 유효성을 검사하는 정책을 할당하는 방법에 대해 자세히 알아보려면 자습서를 계속 진행합니다.