프로덕션에서 본 7가지 Azure 보안 격차 (그리고 해결 방법)
Source: Dev.to
1. 부적절한 네트워크 보안 그룹(NSG) 규칙
문제점
네트워크 보안 그룹(NSG)은 Azure VM의 기본 네트워크 수준 제어입니다. 프로덕션 환경에서는 다음과 같이 과도하게 허용적인 인바운드 규칙이 자주 존재합니다:
Allow * from 0.0.0.0/0- SSH(22) 또는 RDP(3389)가 퍼블릭 인터넷에 노출
실제 사례
보안 감사 중 12개의 프로덕션 VM에서 SSH가 인터넷에 열려 있는 것이 발견되었습니다. NSG 흐름 로그에는 30일 동안 50,000회 이상의 실패 로그인 시도가 기록되었습니다.
탐지 방법
Azure 포털
- Network Security Groups → Inbound rules – 다음을 확인:
- Source:
Any또는0.0.0.0/0 - Ports:
22,3389,1433,5432
- Source:
- VM별 Effective security rules 검토
KQL (NSG Flow Logs)
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog"
| where SrcIP_s !startswith "10."
and SrcIP_s !startswith "172."
and SrcIP_s !startswith "192.168."
| where DestPort_d in (22, 3389)
| summarize Attempts = count() by SrcIP_s, DestPort_d
| order by Attempts desc
해결 방안
즉시
- SSH/RDP에 대한
0.0.0.0/0접근 제거 - 신뢰할 수 있는 사무실 또는 VPN IP 화이트리스트 적용
- Azure Bastion을 사용해 안전한 원격 액세스 제공
- Microsoft Defender for Cloud의 Just‑In‑Time (JIT) VM access 활성화
장기
- Application Security Groups (ASG) 도입
- 중앙 집중형 필터링을 위해 Azure Firewall 배포
- Azure Policy로 NSG 표준 강제 적용
2. Azure 백업 정책 누락
문제점
많은 팀이 Azure가 자동으로 VM을 백업한다고 착각합니다—실제로는 그렇지 않습니다. 프로덕션 워크로드 중 백업 볼트나 백업 일정이 전혀 설정되지 않은 경우가 발견되었습니다.
탐지 방법
Azure 포털
- Recovery Services vaults → Backup items – VM 인벤토리와 비교
KQL 쿼리
Resources
| where type == "microsoft.compute/virtualmachines"
| project name, resourceGroup
| join kind=leftouter (
RecoveryServicesResources
| where type contains "protectedItems"
| extend vmName = tostring(split(properties.sourceResourceId, "/")[8])
| project vmName
) on $left.name == $right.vmName
| where isnull(vmName)
해결 방안
- 지역별 Recovery Services vault 생성
- RPO/RTO에 맞는 백업 정책 정의
- Soft Delete 활성화
- 분기별 복구 테스트 수행
- Azure Monitor를 통해 백업 알림 구성
3. 약한 인증 방식
문제점
비밀번호 기반 SSH 및 RDP 접근이 여전히 일반적이며, 여러 관리자 계정이 동일 비밀번호를 재사용해 단일 실패 지점이 됩니다.
탐지 방법
Linux
grep -i PasswordAuthentication /etc/ssh/sshd_config
grep -i PubkeyAuthentication /etc/ssh/sshd_config
Windows
- Azure AD Conditional Access 정책 검토
- Azure AD sign‑in logs에서 비밀번호 기반 로그인 확인
해결 방안
Linux
- 비밀번호 인증 비활성화:
PasswordAuthentication no - SSH 키 기반 인증 강제
- 개인 키를 Azure Key Vault에 저장
- Azure AD Login for Linux VMs 활성화
Windows
- 다중 인증(MFA) 적용
- 로컬 관리자 사용 최소화
- Privileged Access Workstations (PAWs) 배포
4. 전송 중 데이터 암호화 누락
문제점
HTTP 엔드포인트, TLS 없이 운영되는 데이터베이스, FTP 전송 등이 여전히 프로덕션에 존재해 민감한 데이터가 노출될 위험이 있습니다.
탐지 방법
Application Gateway / WAF 로그
AzureDiagnostics
| where ResourceType == "APPLICATIONGATEWAYS"
| where requestUri_s startswith "http://"
| summarize Count = count() by requestUri_s, clientIP_s
| order by Count desc
해결 방안
- HTTPS 전면 적용
http://→https://리다이렉트 설정- 모든 데이터베이스 연결에 TLS 1.2+ 사용
- FTP 대신 SFTP/FTPS 사용
- 인증서는 Azure Key Vault로 관리
5. 부적절한 역할 기반 액세스 제어(RBAC)
문제점
개발자가 구독 수준에서 Contributor 또는 Owner 권한을 보유하는 경우가 많아 최소 권한 원칙을 위반합니다.
탐지 방법
authorizationresources
| where type == "microsoft.authorization/roleassignments"
| where properties.roleDefinitionId contains "Owner"
or properties.roleDefinitionId contains "Contributor"
| project principalId, scope = tostring(properties.scope)
해결 방안
- 정기적인 RBAC 감사 수행
- 불필요한 구독 수준 역할 제거
- 최소 권한을 가진 맞춤 역할 생성
- Azure AD Privileged Identity Management (PIM) 활용
- 고권한 계정에 대한 액세스 검토 활성화
6. 활동 로그 알림 누락
문제점
중요한 변경(예: NSG 규칙 업데이트, VM 삭제)이 알림 없이 발생해 팀이 인지하지 못합니다.
탐지 방법
- Azure Monitor → Alerts – Activity Log 필터링 후 관련 카테고리가 모니터링되고 있는지 확인
해결 방안
다음 항목에 대한 알림 생성:
- NSG 규칙 변경
- VM 생성/삭제
- RBAC 수정
- Defender for Cloud 정책 업데이트
- Key Vault 접근 변경
7. 관리 및 데이터베이스 포트 노출
문제점
SSH/RDP 외에도 데이터베이스 포트와 관리 인터페이스가 인터넷에 노출되는 경우가 많습니다(예: SQL, MySQL, PostgreSQL, MongoDB, Redis).
탐지 방법
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog"
| where DestPort_d in (1433, 3306, 5432, 8080, 8443, 27017, 6379)
| where SrcIP_s !startswith "10."
and SrcIP_s !startswith "172."
and SrcIP_s !startswith "192.168."
| summarize Count = count() by DestPort_d, DestIP_s
| order by Count desc
해결 방안
- 비필수 포트 차단
- 데이터베이스 접근을 위해 Private Endpoints / Private Link 사용
- 웹 기반 관리 인터페이스는 Application Gateway with WAF 배포
- 원격 관리는 Azure Bastion 활용
- Defender for Cloud 권고사항 준수
결론
Azure 보안은 지속적인 모니터링, 정기적인 감사, 사전 예방적 조치가 필요한 연속적인 프로세스입니다. 대부분의 격차는 도구가 아닌 방어 장치(guardrails)의 부재에서 비롯됩니다. Azure Policy, Defender for Cloud, Infrastructure as Code를 활용하면 이러한 문제를 프로덕션에 도달하기 전에 방지할 수 있습니다.
빠른 보안 체크리스트 (≈ 85 분)
0.0.0.0/0NSG 규칙 감사 – 5 분- VM 백업 확인 – 10 분
- RBAC 할당 검토 – 15 분
- SSH 비밀번호 인증 확인 – 10 분
- 활동 로그 알림 활성화 – 20 분
- 노출된 DB 포트 스캔 – 10 분
- HTTP 트래픽 확인 – 15 분
토론해봅시다
프로덕션에서 비슷한 Azure 보안 문제를 겪어보셨나요? 이를 방지하기 위해 어떤 방어 장치를 사용하고 계신가요?