PF-05 · Multi-cloud · Python
멀티 클라우드 자산·감사 자동화
AWS, GCP, Tencent Cloud의 자산·권한·감사 로그를 공통 스키마로 모으고, 위험 이벤트가 생기면 바로 알리는 Python 도구입니다.
- 역할
- 설계 · 구현
- 기간
- 개인 프로젝트 · 2026.11 공개
- CSP
- AWS · GCP · Tencent
- 규모
- 클라우드 3개 · 수집기 7종 · 감사 액션 49종
- 핵심 기술
- Python · boto3 · Google Cloud SDK · Tencent Cloud SDK · Google Sheets · Slack · Telegram
- 3
- 공개 코드가 다루는 클라우드
- 7
- 자원 종류별 수집기
- 49
- 추적하는 감사 액션 (16종은 즉시 알림)
한눈에 보기
문제
세 클라우드는 같은 개념을 서로 다른 형태로 돌려줍니다. 권한이나 방화벽을 비교하려면 사람이 세 형식을 맞춰 읽어야 했습니다.
접근
계정별로 STS AssumeRole 등 교차 계정 역할로 접근하고, 자원 종류별 수집기 7개로 모은 결과를 자원별 데이터 클래스 하나로 정규화합니다. Google Sheets와 CSV로 내보내고, 위험 이벤트 16종은 critical_events.yaml 기준으로 Slack과 Telegram에 바로 보냅니다.
결과
바탕이 된 실무 도구는 Azure를 포함한 4개 클라우드를 매일 새벽에 점검해 월말 며칠의 수동 점검을 없앴고, Terraform 기본값과 CI 관문과 함께 보안 지적 조치율을 60%에서 85% 이상으로 올리는 데 기여했습니다.
자세히 보기
자원별 공통 스키마
이 코드가 하는 일: IAM 정보를 담는 데이터 클래스로, 세 클라우드의 계정 정보를 클라우드, 프로젝트, 사용자, 그룹, 권한, 생성 시각, 액세스 키, 마지막 로그인, 비밀번호 변경 시각 같은 같은 필드로 맞춥니다. frozen=True라 한 번 만든 기록은 바뀌지 않고, sheet 값 “IAM”이 내보낼 시트 이름을 정합니다. 클라우드마다 수집 코드는 달라도 결과가 이 형태로 모이기 때문에 한 표에서 세 클라우드의 권한을 나란히 비교할 수 있습니다.
@dataclass(frozen=True)
class IamRecord(Record):
sheet: ClassVar[str] = "IAM"
cloud: str
project: str
project_id: str
user_name: str
user_id: str
user_group: str = ""
permission: str = ""
user_creation_time: str = ""
access_key: str = ""
access_key_creation_time: str = ""
last_login: str = ""
password_last_changed: str = ""
위험 이벤트는 데이터로
이 코드가 하는 일: 즉시 알릴 위험 이벤트를 클라우드별 이름 목록으로 적은 설정 파일입니다(일부 발췌). 권한 연결, 키 생성, 서버 중지·삭제, 사양 변경처럼 영향이 큰 행위가 aws, gcp, tencent 아래에 각 클라우드의 이벤트 이름으로 들어 있고, 수집한 감사 로그의 이벤트가 이 목록에 있으면 Slack과 Telegram으로 바로 알립니다. 목록이 코드 밖에 있어 규칙을 바꿀 때 Python 코드를 고치지 않아도 됩니다.
aws:
- AttachUserPolicy
- CreateAccessKey
- StopInstances
- TerminateInstances
- ModifyInstanceAttribute
gcp:
- SetIamPolicy
- CreateServiceAccountKey
- v1.compute.instances.stop
- v1.compute.instances.delete
- v1.compute.instances.setMachineType
tencent:
- AttachUserPolicy
- AttachUserPolicies
- CreateApiKey
- StopInstances
- TerminateInstances배운 점
여러 클라우드를 함께 운영할 때 가장 큰 비용은 데이터를 모으는 일이 아니라 서로 다른 형식을 사람이 맞춰 읽는 일이었습니다. 수집 방식은 클라우드마다 달라도 결과를 자원별 데이터 클래스 하나로 정규화하면, 권한이나 방화벽을 같은 열에서 비교할 수 있고 새 클라우드를 붙일 때도 수집기만 추가하면 됩니다. 위험 이벤트 목록을 코드가 아니라 데이터(critical_events.yaml)로 둔 것도 중요했습니다. 보안 담당자가 Python을 읽지 않고도 규칙을 검토하고 고칠 수 있고, 규칙 변경과 코드 변경이 섞이지 않습니다. 다만 일부 경로는 실제 계정이 아닌 mock으로만 검증했기 때문에, 자동화를 믿을 수 있는 범위는 어디까지 실제로 확인했느냐로 정해진다는 점도 함께 배웠습니다.