Bicep 및 Azure 정책: Azure 정책 집합(또는 정책 이니셔티브) 만들기

이 부분 문서는 Azure Policy, Azure Bicep 및 Azure PowerShell에 대한 시리즈의 일부입니다.

Bicep 및 PowerShell을 사용하여 자동화할 수 있는 많은 것들이 있습니다.
  • 정책 정의, 생성 및 업데이트
  • 정책 정의(또는 정책 집합)
  • 정책 할당
  • 정책 교정

  • 먼저 정책 세트를 만들고 배포하는 방법을 보여 드리겠습니다. 그러나 먼저 Azure 정책 집합(또는 이니셔티브)이 무엇인지 정의해 보겠습니다. 정책 집합(또는 이니셔티브)은 Azure 정책 모음입니다. 이니셔티브를 범위(구독 또는 관리 그룹)에 적용하는 이러한 정책(정책 추가 또는 제거) 및 할당의 수명 주기를 단순화합니다.

    정책 세트는 여러 속성을 포함하는 JSON 정의입니다.
  • 표시 이름(128자로 제한됨°
  • 설명
  • 이름(64자로 제한)
  • 메타데이터(분류 범주, 버전 등)
  • 정책 이니셔티브 매개변수
  • 세트에 포함될 정책 정의 목록
  • 정책 유형이며 기본 제공 Azure 이니셔티브를 생성할 수 없으므로 항상 사용자 지정입니다
  • .

    마지막으로 정책 정의 및 정책 집합은 관리 그룹 또는 구독 범위 중 하나의 범위에 배포됩니다.

    Bicep에서는 다음과 같이 보입니다.

    resource symbolicname 'Microsoft.Authorization/policySetDefinitions@2021-06-01' = {
      name: 'string'
      scope: resourceSymbolicName
      properties: {
        description: 'string'
        displayName: 'string'
        metadata: {}
        parameters: {}
        policyDefinitions: [
          {
            groupNames: [
              'string'
            ]
            parameters: {}
            policyDefinitionId: 'string'
            policyDefinitionReferenceId: 'string'
          }
        ]
        policyType: 'custom'
      }
    }
    


    이제 3개의 기본 제공 정책이 있는 정책 이니셔티브를 만들고 관리하라는 요청을 받았다고 상상해 보십시오.
  • Azure SQL Database에 대한 공용 네트워크 액세스를 비활성화해야 합니다(ID:/providers/Microsoft.Authorization/policyDefinitions/1b8ca024-1d5c-4dec-8995-b1a932b41780)
  • MySQL 서버에 대해 공용 네트워크 액세스를 비활성화해야 합니다(ID//providers/Microsoft.Authorization/policyDefinitions/d9844e8a-1437-4aeb-a32c-0c992f056095)
  • PostgreSQL 서버에 대해 공용 네트워크 액세스를 비활성화해야 함(ID:/providers/Microsoft.Authorization/policyDefinitions/b52376f7-9612-48a1-81cd-1ffe4b61032c)

  • 다른 정책을 추가할 수 있고 기존 정책을 제거할 수 있다는 점, 솔루션 설계 방법을 알고 있습니다.
    우리는 PolicyDefinitions 속성이 개체의 배열이며 여기에 사용된 정책 정의가 기본 매개 변수를 사용한다는 것을 알고 있습니다.
    Bicep은 루프 및 배열을 처리할 수 있으므로 배포하려는 정책 이니셔티브의 텍스트 버전을 간단한 JSON 파일로 정의하는 간단한 방법을 쉽게 상상할 수 있습니다.
    이 파일은 정책 세트 표시 이름, 설명, 범주 및 버전, 마지막으로 정책 ID 배열을 저장해야 합니다.

    JSON 정의는 다음과 같습니다.

    {
      "initiativeName": "demoPolicySet",
      "displayName": "Demo Policy Initiative for Dev.to",
      "Category": "compliance",
      "version": "1.0.0",
      "policyToInclude": [
        "/providers/Microsoft.Authorization/policyDefinitions/b52376f7-9612-48a1-81cd-1ffe4b61032c",
        "/providers/Microsoft.Authorization/policyDefinitions/d9844e8a-1437-4aeb-a32c-0c992f056095",
        "/providers/Microsoft.Authorization/policyDefinitions/1b8ca024-1d5c-4dec-8995-b1a932b41780"
      ],
      "description": "Demo Policy Initiative for Dev.to"
    }
    


    간단하고 사람이 읽을 수 있습니다.

    이제 솔루션을 배포하기 위해 bicep 파일을 살펴보겠습니다.

    targetScope = 'managementGroup' 
    
    @maxLength(64)
    @description('PolicySet name')
    param initiativeName string 
    
    @maxLength(128)
    @description('PolicySet display Name')
    param initiativeDisplayName string
    
    @description('PolicySet description')
    param initiativeDescription string
    
    @minLength(1)
    @description('array of policy ID')
    param initiativePoliciesID array
    
    param category string = 'compliance' 
    param verion string = '1.0.0'
    
    resource policySetDef 'Microsoft.Authorization/policySetDefinitions@2021-06-01' = {
    
      name: initiativeName
    
        properties: {
          description: initiativeDescription
          displayName: initiativeDisplayName 
          metadata: {
            category: Category
            version: version
          }
    
          parameters: {}
    
          policyDefinitions: [for ID in initiativePoliciesID: {
              parameters: {}
              policyDefinitionId: ID
              policyDefinitionReferenceId: ''
            } ]
          policyType: 'Custom'
    
        }
    }
    


    다른 사람이 잘못된 값을 사용하는 경우 오류를 방지하기 위해 이니셔티브 이름 및 이니셔티브 디스플레이 이름에 대한 일부 제약 조건이 있는 매개 변수 블록이 있습니다.

    일련의 정책을 처리하려면 for 루프가 필요합니다.

    이제 정책 이니셔티브를 배포하려면 bicep 파일을 JSON 파일과 연결해야 합니다.
    간단한 PowerShell 스크립트가 필요합니다!

    이 스크립트는 JSON 파일을 읽고 bicep 파일을 배포하는 데 필요한 변수를 생성합니다.

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]
        $managementGroupID,
    
        [string]
        $location = "westeurope"
    )
    
    if (!(Test-Path -Path "./policysetdef.json")) {
        throw "Definition policy configuration json file is not present"
        exit 1
    }
    
    if ($null -eq ( Get-AzContext -ErrorAction SilentlyContinue)){
        throw "You need to have an open session in Azure, please use connect-azaccount"
        exit 1 
    }
    
    try {
        $jsonDefinition = Get-Content -Path "./policysetdef.json" | ConvertFrom-Json
    }
    catch {
        write-error "unable to get configuration data"
        exit 1
    }
    
    $randomNumber = Get-Random
    $deployName = "$($jsonDefinition.initiativeName)-$($randomNumber)"
    
    New-AzManagementGroupDeployment -Name $deployName  -ManagementGroupId $managementGroupID -Location $location -TemplateFile ./deploySet.bicep -initiativeName $jsonDefinition.initiativeName  -initiativeDisplayName $jsonDefinition.displayName -initiativeDescription $jsonDefinition.description -initiativePoliciesID $jsonDefinition.policyToInclude
    


    이 스크립트는 정책 이니셔티브의 배포 범위인 필수 managementGroupID와 기본적으로 서유럽인 배포 위치인 위치라는 두 가지 매개 변수를 사용합니다.

    그런 다음 스크립트는 bicep 파일의 존재 여부와 Azure 세션이 열려 있는지 테스트합니다. 그런 다음 JSON 파일을 가져오고 데이터와 함께 New-AzManagementGroupDeployment Cmdlet을 사용하여 정책 이니셔티브를 배포합니다.

    좋은 웹페이지 즐겨찾기