콘텐츠로 이동

아키텍처

기본 리전은 서울(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 구현 범위는 위 모듈 표와 프로젝트 개요를 기준으로 확인한다.

후속 구성을 포함한 근두운 전체 인프라 설계도