아키텍처¶
기본 리전은 서울(ap-northeast-2)이다. Terraform state는 암호화와 버전 관리를
사용하는 S3 버킷에 저장하며 루트별 .tflock 객체로 잠근다.
관리 경로¶
flowchart LR
Admin[운영자] --> Bootstrap[bootstrap 수동 apply]
Bootstrap --> State[S3 state와 잠금]
Bootstrap --> OIDC[GitHub OIDC와 CI 역할]
PR[Pull request] --> Plan[변경 영향 루트 plan과 IAM 검사]
Main[main push] --> Apply[depends_on 순서로 apply]
OIDC --> Plan
OIDC --> Apply
Plan --> State
Apply --> State
Apply --> Network[platform/network: 공유 네트워크]
Network --> Wazuh[platform/wazuh: 호스트와 인프라 IAM]
Apply --> Identity[identity: 사용자 IAM]
Wazuh --> Legacy[platform: 기존 사용자 정책]
Network --> Victim[platform/victim: victim 호스트와 ALB]
Wazuh --> Victim
| 루트 | 관리 대상 | State key | 적용 주체 |
|---|---|---|---|
bootstrap |
state 버킷, OIDC, CI 역할과 보호 정책 | bootstrap/terraform.tfstate |
운영자 |
platform/network |
VPC, 서브넷과 라우팅 | platform/network/terraform.tfstate |
CI |
platform/wazuh |
Wazuh EC2, 보안 그룹, 인프라 IAM | platform/wazuh/terraform.tfstate |
CI |
platform/victim |
Victim EC2와 서브넷, ALB, 인증서와 DNS 레코드, 시크릿 S3 버킷, victim IAM | platform/victim/terraform.tfstate |
CI |
identity |
사용자, 그룹, 셀프 서비스와 MFA 정책 | identity/terraform.tfstate |
CI |
기존 platform |
기존 SSM 사용자 접근과 로그인 정책, 이전 기록 | platform/terraform.tfstate |
CI |
매니페스트는 network와 identity를 wave0, wazuh를 wave1, 기존 platform과 victim을 wave2에 둔다. 기존 platform은 두 루트의 import가 성공한 뒤 wave2에서 이전 13개의 관리만 해제한다. victim은 network의 VPC와 wazuh의 agent 보안 그룹 출력을 읽으므로 두 루트 뒤에 적용된다. 사용자 정책 3개는 기존 platform에 남으며 identity로의 이전은 별도 작업이다. 팀 그룹에 붙이던 연결은 코드에서 제거했다. 출력 계약은 Platform, 이전과 롤백은 Platform state 이전에 있다.
Wazuh 통신 경로¶
flowchart LR
PC[관리자 PC] -->|SSM 세션| SSM[AWS Systems Manager]
subgraph VPC["VPC 10.50.0.0/16"]
subgraph Public["Public subnet 10.50.10.0/24"]
EC2[Wazuh EC2]
end
IGW[Internet Gateway]
EC2 -->|TCP 443 outbound| IGW
end
IGW --> SSM
IGW --> Packages[패키지 저장소]
서버에 연결된 wazuh_sg는 inbound 규칙이 없고 outbound TCP 443만 허용한다.
대시보드 접속은 SSM으로 로컬 포트 56789를 인스턴스의 443 포트에 연결한다.
퍼블릭 서브넷의 자동 공인 IP 할당은 꺼져 있지만 Wazuh EC2는 최초 생성 때
명시적으로 공인 IP를 요청한다. NAT Gateway나 VPC endpoint는 현재 코드에 없다.
별도의 wazuh_sg_agent는 platform/wazuh에서 생성과 출력만 하고 현재 Wazuh EC2에 연결되어 있지 않다.
victim agent 보안 그룹에서 오는 TCP 1514, 1515 ingress 규칙은 platform/victim이 이 보안 그룹에 붙인다.
후속 agent 연동에서는 Wazuh EC2에 이 보안 그룹을 연결하는 작업이 남아 있다.
권한과 데이터 경계¶
- CI는 장기 AWS 키 대신 OIDC로 임시 세션을 받는다. apply 역할은
main의 subject만 허용한다. - CI 역할, 인프라 역할과 팀원 사용자에는 각 모듈의
permissions_boundary_arn을 적용한다. - state와 잠금의 권한을 분리한다. state 객체 삭제는 명시적으로 거부하고
.tflock삭제는 허용한다. - apply 역할은 CI 역할·OIDC 공급자·state 접근 정책·지정된 경계 정책을 수정할 수 없다.
- Wazuh 루트 EBS는 암호화되며 EC2 종료 후에도 보존된다. 교체된 서버에 자동 재연결되지는 않는다.
운영 절차는 State와 장애 대응과 Wazuh 접속 및 복구에 있다.
전체 설계 참고¶
기존 전체 설계도에는 attacker, WAF, 로깅 등 후속 구성도 포함되어 있다. 현재 Terraform 구현 범위는 위 모듈 표와 프로젝트 개요를 기준으로 확인한다.
