티스토리 뷰
핸즈온1 : Advisor 보안 권고사항의 Azure Policy 연계
이전 글에서 우리는 Azure Advisor에 대하여 살펴보고 핸즈온을 수행해봤다. Advisor에 대해 생소한 독자는 이전 글을 참조한다.
Azure Advisor와 Azure Policy는 Azure 환경의 거버넌스와 최적화를 위한 핵심 서비스이며, 상호 보완적인 관계를 가진다. Azure Advisor가 "무엇을 개선해야 할지"에 대한 정보와 통찰을 제공한다면, Azure Policy는 그 통찰을 기반으로 "어떻게 개선하고, 향후 그러한 문제가 발생하지 않도록 강제할 것인지"에 대한 자동화된 메커니즘을 제공한다. 예를 들어, Azure Advisor가 "특정 지역에 보안 그룹이 열려 있어 보안 위험이 있다”라는 권장 사항을 제시하면, Azure Policy는 해당 지역에 특정 포트가 열린 보안 그룹 생성을 원천적으로 차단하거나, 이미 존재하는 경우 자동으로 수정하는 정책을 배포할 수 있다. 즉, Advisor는 문제 발견에, Policy는 문제 해결 및 예방에 초점을 맞춘다.
이번 핸즈온에서는 Advisor상에 보안 관련 권고사항이 발생했고 이에 대해 Azure Policy를 활용하여 조치하는 내용에 관한 것이다.
다음과 같이 All network ports should be restricted on network security groups associated to your virtual machine 라는 권고사항이 발생했다고 가정한다.

참고로 Microsoft Defender for Cloud에서도 동일한 내용의 보안 권고사항이 발생하는 것을 확인할 수 있다.

이는 Advisor의 보안 권고사항이 근본적으로 Microsoft Defender for Cloud의 보안 권고사항으로부터 근원하고 있기 때문이다. 하지만 두 서비스의 목적과 범위가 다르기 때문에 사용자는 약간의 차이를 경험할 수 있습니다. 이는 여러 사유로 기인하지만 기본적으로 Advisor에서는 선별된 뷰(View)를 확인하는 것이기 때문이다. 두 권고사항의 차이점은 대략 다음과 같다.
| 항목 | Azure Advisor | Microsoft Defender for Cloud |
| 목적 | 단순 권고사항 제공, 빠른 조치 유도 | 정밀한 보안 진단과 보안 점수 기반 지속 관리 |
| 표시되는 항목 수 | 제한적, 요약된 권고 | 실시간 위협 탐지, 정책 기반 취약점 진단 포함 |
| 기술 심도 | 낮음 (비전문가도 보기 쉽게 제공) | 높음 (보안 엔지니어 중심의 기술적 권고 포함 |
이제 핸즈온을 진행해 보자.
1. Azure Advisor 권고사항 확인

2. 해당 권고사항이 적용된 가상 머신 및 네트워크 보안 그룹을 확인한다. 이 정보는 정책을 적용할 범위를 결정한다.

2. 사용자 지정 정책 정의 생성
1. Azure Portal에서 Policy를 검색하여 선택한다.
2. Definitions를 선택하고 + Policy definition을 클릭한다.
3. 다음 예시 정보를 선택 및 입력한다.
- Definition location: 적용 범위 선택 (구독)
- Name: Restricting Virtual Machine NSG Inbound Ports
- Description: Deny inbound traffic on specific ports on the NSG associated with the virtual machine.
- Category: Network
- POLICY RULE: 아래 JSON 코드를 붙여넣는다. 이 코드는 RDP (3389) 및 SSH (22) 포트에 대한 인바운드 트래픽을 거부하는 정책을 정의한다. 필요에 따라 다른 포트를 추가하거나 제거할 수 있다.
{
"mode": "All",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Network/networkSecurityGroups/securityRules"
},
{
"field": "Microsoft.Network/networkSecurityGroups/securityRules/access",
"equals": "Allow"
},
{
"field": "Microsoft.Network/networkSecurityGroups/securityRules/direction",
"equals": "Inbound"
},
{
"anyOf": [
{
"field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange",
"equals": "3389"
},
{
"field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange",
"equals": "22"
}
]
}
]
},
"then": {
"effect": "Deny"
}
},
"parameters": {}
}
- mode: 정책이 평가되는 방식을 지정한다. All은 모든 리소스 유형을 평가한다.
- policyRule: 정책의 조건을 정의한다.
- if: 조건 블록이다.
- allOf: 모든 조건이 충족되어야 한다.
- field: 평가할 속성을 지정한다. 여기서는 NSG 보안 규칙의 속성을 확인한다.
- equals: 속성 값이 지정된 값과 일치하는지 확인한다.
- allOf: 모든 조건이 충족되어야 한다.
- then: 조건이 충족될 때 수행할 작업을 지정한다.
- effect: 작업을 지정한다. Deny는 작업을 거부한다.
- if: 조건 블록이다.
- parameters: 정책에 전달할 수 있는 매개변수를 정의한다. 이 예제에서는 매개변수가 없다.

4. Save를 클릭한다.
3. 정책 할당
1. Azure Portal에서 Policy를 검색하여 선택한다.
2. Assignments를 선택하고 Assign policy를 클릭한다.
3. Scope에서 대상 VM이 배포된 구독 및 리소스 그룹을 선택한다.
4. Policy definition에서 위에서 생성한 정책(Restricting Virtual Machine NSG Inbound Ports)을 선택한다.
5. Remediation을 구성하여 기존의 비규격 리소스를 수정할지 여부를 결정한다.
6. Non-compliance message 입력창에 다음 메시지를 입력한다.
Security policy violation: Inbound traffic to RDP (3389) or SSH (22) ports is not allowed on Network Security Groups for virtual machines. These ports are restricted for security hardening.
DeployIfNotExists 효과를 사용하면 기존 리소스를 자동으로 수정할 수 있다.
7. Review + create를 클릭한 다음 Create를 클릭한다.
4. 정책 준수 확인
1. Azure Portal에서 Policy를 검색하여 선택한다.
2. Compliance를 선택한다.
3. 할당된 정책을 선택하여 준수 상태를 확인한다.
위에서 생성 및 할당한 정책의 Compliance 여부가 체크된 것을 확인할 수 있다.

- Compliant 리소스는 정책을 준수하는 리소스이다.
- Non-compliant 리소스는 정책을 준수하지 않는 리소스이다.
4. Non-compliant 리소스가 있는 경우, 정책 정의에 따라 수정 작업을 수행하거나 리소스를 수정해야 한다.
5. 정책 테스트
이제 정책이 올바르게 적용되었는지 확인하기 위해 테스트를 수행한다.
1. 먼저 기존 RDP 허용 정책이 존재하는지 확인 후 존재한다면 제거한다.

2. RDP 허용을 위한 Inbound port rule을 생성한다.

3. Add를 클릭하자 마자 보안 규칙 생성 실패에 대한 팝업 메시지가 전시됨을 확인한다.
보안 규칙 'AllowAnyRDPInbound'를 생성하지 못했습니다. 오류: 정책에 따라 'AllowAnyRDPInbound' 리소스가 허용되지 않았습니다. 이유: '보안 정책 위반: 가상 머신의 네트워크 보안 그룹에서 RDP(3389) 또는 SSH(22) 포트로의 인바운드 트래픽이 허용되지 않습니다. 이러한 포트는 보안 강화를 위해 제한됩니다.' 정책 리소스 ID에 대한 오류 세부 정보를 참조하세요.

6. VM 접속 모범사례
그렇다면, 이러한 실무 환경에서 해당 VM에 접속하기 위한 Best Practice는 무엇일까? 일반적인 방법 3가지 정도를 정리해 보면,
- Azure Bastion
- 가장 권고된다. 보안성, 편리성, 관리 용이성 측면에서 탁월하다. → 대부분의 경우 (특히 작은 규모 또는 특정 VM에 대한 관리):
Jumpbox 서버
실무에서는 PaaS 서비스인 Azure Bastion의 비용 이슈로 Jumpbox 서버를 대체하여 구성하는 경우가 있다. 그러나 Jumpbox 서버데 대한 추가 관리 공수가 발생하고 Single Point of Failure 즉, 장애 시 리소스 접근에 어려움이 발생하게 된다.
- JIT VM Access
- Microsoft Defender for Cloud를 이미 사용하고 있고, 짧은 시간 동안만 접근을 허용하는 유연성이 필요한 경우에 매우 유용하다. → 보안 자동화 및 필요에 따른 임시 접근 제어
- JIT VM 액세스에 대한 자세한 설명은 여기를 참고한다.
- VPN Gateway
- 온프레미스 네트워크와 Azure 클라우드를 안전하게 연결해야 한다면 필수적이다. → 엔터프라이즈 규모의 통합된 네트워크 접근:
결론적으로, Azure Policy를 통해 RDP/SSH 직접 접속을 차단한 후에는 Azure Bastion 또는 JIT VM Access를 사용하는 것이 가장 일반적이고 권장되는 실무 접근 방식이다. VPN은 더 넓은 네트워크 통합 시나리오에서 고려된다.
다음 편에서는 Azure DevOps와 연계한 핸즈온을 시행해 보자.
다음 편에서 계속
