Azure Policy 정리
자동화된 보안 감사 체계 구축을 위해, Azure Policy 적용
1. Azure Policy 개론
- 개념 : 리소스의 생성 및 구성 상태를 정의된 규칙(policy definition)으로 제어하는 거버넌스 도구입니다.
- 기능: 비정상 리소스 감지, 수정 요청, 자동 수정(Remediation) 등 가능
- 유형:
- 정책 정의(Definition): 조건(조건: if), 효과(effect: deny, audit 등)
- 이니셔티브(Initiative): 여러 정책 정의를 묶은 그룹
- 주요 효과(effect):
- Deny: 리소스 생성 차단
- Audit: 비정상 리소스만 감지
- DeployIfNotExists: 조건에 따라 리소스를 배포하여 보완
- 동작방식
- Policy 정의(Definition) > Policy 할당(Assignment) > (선택) Remediation(자동보완) Task 실행
- Policy만으로는 “탐지”만 하며, 자동 보완하려면 remediation까지 구성
2. 효과
Effect 유형 | 설명 | 주요 용도 | 실무 적용 시 주의사항 |
Deny | 조건에 맞지 않으면 리소스 생성 또는 업데이트를 차단합니다. | 리전 제한, 허용된 VM SKU 등 엄격한 정책 | 리소스 배포 실패로 이어질 수 있으므로 사전 테스트 필요 |
Audit | 조건에 맞지 않는 리소스를 로그로 감지만 합니다. | 탐지, 감사 용도 (ex. 태그 누락 확인) | 영향 없이 점진 도입 가능 |
AuditIfNotExists | 특정 리소스가 없을 경우 감지 로그 기록 | NSG, 진단 설정이 없을 때 감지 | 리소스 상태 의존 (존재 여부만 체크) |
DeployIfNotExists | 조건 위반 시 템플릿을 기반으로 리소스를 자동 배포합니다. | NSG 자동 연결, 진단 설정 배포 등 | Remediation task 필요, Managed Identity 필요 |
Append | 리소스에 특정 속성을 강제로 추가합니다. | 태그, 진단 설정 추가 등 | Terraform와 충돌 가능성 있음 (drift 발생) |
Modify | 조건에 따라 리소스 속성 값을 수정합니다. | 태그 자동 추가, SKU 변경 등 | Terraform와 충돌 가능성 매우 높음 |
Disabled | 정책을 비활성화하여 적용되지 않도록 합니다. | 일시 중지, 테스트용 | 정책은 유지되나 효과 없음 |
EnforceOPAConstraint | Open Policy Agent 규칙을 적용합니다. (미리보기) | OPA 기반 고급 정책 사용 | 커스텀 템플릿 필요, 일반적인 정책과는 다름 |
EvaluateIfExists | 특정 리소스가 있을 때에만 추가 조건을 평가합니다. (미리보기) | 조건부 평가에 사용 | 복합 조건에 유용하지만 가독성 어려움 |
Manual | 수동 검토가 필요한 항목으로 기록됩니다. | 감사만 하고 정책 자체로는 처리하지 않음 | 운영 정책보다는 감사/문서 용도 |
DisabledWhenNotExists | 리소스가 없을 경우에는 정책 평가를 건너뜸 | 평가 대상 리소스 조건화 | 잘 쓰이진 않음, 고급 조건에서 사용됨 |
- 실무에서 자주 사용하는 조합
사용 목적 | 권장 Effect |
탐지 및 도입 준비 | Audit, AuditIfNotExists |
차단 및 보안 강화 | Deny |
자동 보완/수정 | DeployIfNotExists, Modify |
속성 강제 주입 | Append |
정책 중단/유지 보류 | Disabled |
3. Terraform과 함께 Azure Policy를 쓰는 방식
- 유의점 : Append, Modify, DeployIfNotExists와 같은 효과는 **Terraform의 선언적 상태(State)**와 충돌 가능성이 있어 Managed Identity, Role Assignment, Remediation 구성을 사전에 검토해야 함.
- Best Practice : Policy에서는 Terraform에서 만든 리소스를 변경하지 않도록, 역할 분리
a. 정책도 Terraform 코드로 선언
b. Managed Identity는 수동 생성 또는 Terraform으로 구성
c. Terraform으로 만든 리소스를 Policy에서 변경하지 않도록 주의
d. Terraform 상태 관리 (terraform import, lifecycle ignore_changes) 등 병행 고려
- 예시 시나리오
상황 | 조치 |
NSG 누락된 NIC이 발견됨 | AuditIfNotExists로 감지 → Terraform 코드에 NSG 추가 |
태그 누락 리소스 있음 | Audit로 감지 후 Terraform에 태그 선언 보완 |
개발자가 수동으로 VM 생성 | Deny 정책으로 배포 차단 → Terraform 통해만 생성 유도 |
스토리지 HTTPS 미적용 감지 | Audit + Terraform 수정 또는 Remediation 작업 수동 실행 |
4. 테라폼 코드 예제
- 정책 정의 (deny-location-policy.json)
{
"mode": "All", // 리소스 타입에 관계없이 모든 리소스에 적용
"policyRule": {
"if": {
"field": "location", // 리소스 생성 위치를 확인
"notIn": ["korea central", "korea south"] // 한국 리전이 아니면
},
"then": {
"effect": "deny" // 리소스 생성을 거부
}
}
}
- Terraform 코드 (정책 정의 + 할당)
# 커스텀 정책 정의
resource "azurerm_policy_definition" "deny_location" {
name = "deny-non-korea-location" # 정책 내부 이름 (중복 불가)
policy_type = "Custom" # 사용자 정의 정책
mode = "All" # 모든 리소스 타입 대상
display_name = "Deny Non-Korea Locations" # 포털에 표시될 이름
policy_rule = file("deny-location-policy.json") # 위 JSON 파일을 불러와 정책 본문으로 사용
}
# 정책을 구독 범위에 할당
resource "azurerm_policy_assignment" "deny_location_assign" {
name = "assign-deny-non-korea" # 정책 할당 이름
policy_definition_id = azurerm_policy_definition.deny_location.id # 위에서 정의한 정책 참조
scope = data.azurerm_subscription.primary.id # 적용 범위: 구독 전체
}
5. 기본 아키텍쳐에 권장되는 Azure Policy 10선
비교적 단순한 아키텍처에 적용하면 좋을 Azure Policy를 꼽아보았다.
정책 종류 | 정책 목적 | 예시 정책 설명 | 효과 유형 | 추천 이유 |
1. 리전 통제 | 비용/규제 거버넌스 | 한국 외 리전 배포 차단 (location notIn) | Deny | 일반적으로 특정 리전에만 배포함 |
2. 태그 관리 | 자산 식별 및 비용 분석 | 태그 누락 리소스 감지 (tags not exists) | Audit | 리소스 추적 및 책임자 관리 용이 |
3. NSG 검사 | 네트워크 보안 강화 | NSG 없는 NIC 감지 | Audit or DeployIfNotExists | SAP VM 네트워크 보안 필수 |
4. 퍼블릭 IP 제한 | 외부 노출 방지 | Private zone의 퍼블릭 IP 존재 시 감지 | Audit | VPN 환경에서 불필요한 외부노출 방지 |
5. 스토리지 HTTPS | 데이터 전송 보안 | HTTPS 미사용 스토리지 감지 | Deny or Audit | 민감한 데이터 보호 |
6. VNet Peering 검사 | 네트워크 연결 정책 확인 | 특정 VNet Peering만 허용 | Audit | 허용된 네트워크 구성만 유지 |
7. VM 크기 제한 | 비용 및 성능 제어 | 특정 VM SKU 외 배포 차단 | Deny | 과도한 사이즈 비허용 |
8. VPN Gateway SKU 제한 | 고비용 방지 | VPN Gateway SKU가 S2 이상이면 감지 | Audit | 필요 이상 스펙 사용 방지 |
9. NSG Inbound 제한 | 포트 제한 | All IP를 Allow하는 NSG 감지 (HTTP/HTTPS 제외) | Audit | 내부망 중심 아키텍처 보호 |
10. 리소스 이름 규칙 | 네이밍 표준화 | 이름 접두사/형식 위반 리소스 감지 (name notLike) | Audit | 일관성 있는 리소스 관리 |