
Azure 보안 상태, RBAC, NSG, 스토리지, ID 및 암호화를 감사하는 CLI 도구
Azure 보안 구성을 감사하고 일반적인 잘못된 구성을 표면화하는 가볍고 프로덕션 스타일의 CLI 도구입니다. Microsoft Defender for Cloud가 내부적으로 수행하는 검사를 그대로 반영합니다.
| ID | 카테고리 | 점검 항목 | 심각도 |
|---|---|---|---|
| AZ-001 | RBAC | 구독 범위에 Owner / Contributor 할당됨 | CRITICAL |
| AZ-002 | RBAC | 리소스 그룹 범위에 Owner / Contributor 할당됨 | HIGH |
| AZ-003 | 네트워크 | 0.0.0.0/0 인바운드 허용 규칙이 있는 NSG | HIGH |
| AZ-004 | 스토리지 | 공용 Blob 액세스가 활성화된 스토리지 계정 | HIGH |
| AZ-005 | ID | MFA가 등록되지 않은 Entra ID 사용자 | HIGH |
| AZ-006 | ID | Owner / Contributor 권한이 있는 서비스 주체 | HIGH |
| AZ-007 | 암호화 | 명시적 암호화 구성이 없는 관리 디스크 | MEDIUM |
| AZ-008 | 암호화 | 방화벽 제한 없이 공용 네트워크에 노출된 Key Vault | HIGH |
| AZ-009 | 모니터링 | 활동 로그 보존 기간 90일 미만 | MEDIUM |
| AZ-010 | 모니터링 | 핵심 리소스 유형에서 Microsoft Defender for Cloud가 활성화되지 않음 | HIGH |
| AZ-011 | 모니터링 | 진단 로깅이 활성화되지 않은 Key Vault | MEDIUM |
| AZ-012 | 컴퓨팅 | 공용 IP가 직접 연결된 Virtual Machine | MEDIUM |
| AZ-013 | 컴퓨팅 | 엔드포인트 보호 확장이 없는 Virtual Machine | MEDIUM |
| AZ-014 | 컴퓨팅 | Azure Disk Encryption(ADE)이 적용되지 않은 Virtual Machine OS 디스크 | MEDIUM |
| AZ-015 | 네트워크 | NSG를 통해 인터넷에 노출된 RDP 포트 3389 | CRITICAL |
| AZ-016 | 네트워크 | NSG를 통해 인터넷에 노출된 SSH 포트 22 | CRITICAL |
| AZ-017 | 스토리지 | HTTPS가 아닌 트래픽을 허용하는 스토리지 계정 | HIGH |
| AZ-018 | 스토리지 | 레거시 TLS 버전(1.2 미만)을 허용하는 스토리지 계정 | MEDIUM |
| AZ-019 | ID | Entra ID 테넌트에 존재하는 게스트 사용자 계정 | LOW |
| AZ-020 | 암호화 | 일시 삭제 또는 제거 보호가 없는 Key Vault | MEDIUM |
az login (Azure CLI)AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_IDReaderUserAuthenticationMethod.Read.AllApplication.Read.AllGraph API 권한을 사용할 수 없는 경우 ID 점검(AZ-005, AZ-019)은 정상적으로 건너뜁니다. 나머지 감사는 영향을 받지 않고 실행됩니다.
pip install -e .
# Full audit — all checks, all severities
azure-auditor
# Target a specific subscription
azure-auditor --subscription <subscription-id>
# Show only HIGH and CRITICAL findings
azure-auditor --severity HIGH
# Save JSON report to a specific directory
azure-auditor --output-dir ./reports
# Terminal output only
azure-auditor --no-json
# Verbose logging
azure-auditor --verbose
또는 설치하지 않고:
PYTHONPATH=src python -m azure_security_auditor.cli --subscription <id>
터미널 — 심각도순(CRITICAL 우선)으로 정렬된 Rich 형식 테이블:
╭──────────────────────────────────────────────────────────────────╮
│ Azure Security Posture Audit │
│ Subscription: My Production Subscription │
│ ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │
│ Run at: 2026-07-12T10:00:00Z │
│ Findings: 12 total (2 CRITICAL 6 HIGH 4 MEDIUM 0 LOW) │
╰──────────────────────────────────────────────────────────────────╯
Severity Check ID Check Resource Detail
✖ CRITICAL AZ-015 RDP Port 3389 Exposed to Internet... /subscriptions/. ...
✖ CRITICAL AZ-001 Owner Role Assigned at Subscription... <principal-id> ...
■ HIGH AZ-010 Defender for Cloud Not Enabled — VMs /subscriptions/. ...
...
JSON — reports/azure_audit_<subscription>_<timestamp>.json 파일로 저장됩니다.
src/
azure_security_auditor/
cli.py # argparse entrypoint
engine.py # ThreadPoolExecutor orchestrator
models.py # Finding, AuditResult, Severity
checks/
rbac.py # AZ-001, AZ-002
network.py # AZ-003, AZ-015, AZ-016
storage.py # AZ-004, AZ-017, AZ-018
identity.py # AZ-005, AZ-019
service_principals.py # AZ-006
encryption.py # AZ-007, AZ-008, AZ-020
monitoring.py # AZ-009, AZ-010, AZ-011
compute.py # AZ-012, AZ-013, AZ-014
reporters/
terminal.py # Rich table output
json_reporter.py # JSON file output
DefaultAzureCredential을 사용하며 다음 순서로 시도합니다:
AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)az login)export AZURE_CLIENT_ID="<app-id>"
export AZURE_CLIENT_SECRET="<secret>"
export AZURE_TENANT_ID="<tenant-id>"
azure-auditor --subscription <subscription-id>