최종 판단: ARN 전면 삭제가 아니라 일부 일반화가 적절하다.
ARN과 Account ID는 인증정보가 아니므로 공개만으로 계정 침해가 발생하지 않는다. 다만 실제 계정·정책·리소스 이름은 정찰에 쓰일 수 있고 코드를 특정 환경에 종속시키므로, 운영값만 변수·data source·resource reference로 전환한다.
검토 기준일: 2026-09-16
대상: kintoun-secops/kintoun-infra
main ZIP 스냅샷 범위: ARN 노출 위험과 Public Terraform 공개 정책
한눈에 보기
ARN은 주소
ARN·Account ID만으로 로그인,
AssumeRole, S3 접근은 불가능하다.현실적 위험은 정찰
계정, Region, Role·Bucket 이름과 인프라 구조를 파악하는 비용을 낮춘다.
우선순위는 권한
ARN 마스킹보다 apply Role 최소권한화와 Secret·state 차단이 중요하다.
저장소 실측
검사 항목 | 결과 | 판단 |
전체 / Terraform 파일 | 133개 / 50개 | CI·Rego·YAML까지 정적 검토 |
리터럴 ARN | 15개 파일, 60회 | AWS 관리형·더미·실계정 값을 분리해야 함 |
실제 Account ID | 9개 파일, 18회 | Credential은 아니나 일반화 권장 |
Access Key·Token·Private Key | 발견하지 못함 | 현재 스냅샷에서 직접 인증정보 유출 증거 없음 |
State·plan·실제 tfvars | 발견하지 못함 | .gitignore 제외 규칙도 확인 |
Role Trust Principal: "*" | 검토한 실제 Role에서 없음 | GitHub OIDC·EC2 신뢰 주체가 제한됨 |
S3 Public Access Block | state·victim 모두 4개 설정 활성화 | Bucket Name 공개가 익명 접근을 뜻하지 않음 |
현재 위험도: 직접 침해 낮음 · 정찰/구조 노출 중간 · 코드 이식성 문제 중간
무엇을 유지하고 무엇을 바꿀까
구분 | 대상 | 조치 |
유지 | AWS Managed Policy ARN | AWS가 공개한 공통 식별자이므로 그대로 사용 |
유지 | aws_s3_bucket.x.arn, aws_iam_policy.x.arn | 실제 값을 소스에 고정하지 않는 권장 패턴 |
유지 | 123456789012 더미 ARN | 예제임을 명시하면 공개 가능 |
일반화 | 실제 Account ID·Customer Managed Policy ARN | aws_caller_identity, aws_partition, 변수로 전환 |
일반화 | 실제 state Bucket·운영 리소스 이름 | 환경별 입력 또는 partial backend config 사용 |
제거 | EC2·VPC·IGW·SG 마이그레이션 ID | 마이그레이션 완료 후 삭제하거나 비공개 입력으로 이동 |
공개 금지 | Access Key, Token, Password, Private Key, state, 실제 tfvars | 발견 즉시 폐기·교체 후 history와 로그까지 조사 |
파일별 수정안
platform/migration.tf- 실제 EC2 ARN/ID, VPC·IGW·SG ID, 정책 ARN 제거
- 일회성 fallback이면 만료일을 정하고 마이그레이션 종료 후 삭제
bootstrap/example.tfvars·bootstrap/variables.tf- 실제 Account ID를
123456789012로 교체 - 실제 권한 경계 ARN은 비공개 입력으로 분리
identity/groups.yaml- AWS Managed Policy ARN은 유지
- Customer Managed Policy는 이름만 저장하고 실행 계정에서 ARN 생성
identity/variables.tf·platform/victim/variables.tf·platform/wazuh/variables.tf- 반복된 실제 권한 경계 ARN 기본값을
null또는 공통 입력으로 전환
.github/policy/*_test.rego- 테스트의 실제 Account ID를 모두 더미 값으로 통일
- 여러
backend.tf - state Bucket 고정값은 partial backend configuration 적용 검토
보안 우선순위
P0 — apply Role 최소권한화:
PowerUserAccess + IAMFullAccess를 실제 Terraform 작업에 필요한 권한으로 축소P0 — Git history 검사: Gitleaks 또는 TruffleHog로 과거 커밋·Actions 로그·artifact 확인
P1 — 운영 식별자 일반화: 실제 Account ID, 정책 ARN, 마이그레이션 리소스 ID 정리
P1 — GitHub 보호 기능 확인: Secret Scanning과 Push Protection 활성화
P2 — 실제 AWS 상태 검증: 코드와 배포된 Trust/Resource Policy를 IAM Access Analyzer·CLI로 대조
P2 — IaC 교차 점검: 기존 OPA 검사에 Trivy·Checkov·tfsec 중 하나를 보조 적용
ARN보다 중요한 발견
apply Role의 기본 정책은
PowerUserAccess와 IAMFullAccess다. Permissions Boundary와 자기 수정 차단이 있어도 권한 범위가 넓으므로, ARN 마스킹보다 먼저 축소해야 한다.공격 가능성 판단
- Role ARN 공개: 대상은 특정할 수 있지만 정상 Trust Policy와 호출자 권한을 통과하지 못하면
AssumeRole은 거부된다.
- S3 Bucket Name 공개: 접근 시험은 쉬워지지만 Public Policy·ACL 오류가 없으면 데이터는 읽을 수 없다.
- Customer Policy ARN 공개: 계정과 정책 목적이 드러날 뿐 정책 조회·부착 권한이 생기지는 않는다.
- ARN + Credential 동시 공개: 이때의 사고 원인은 ARN이 아니라 Credential 유출이다.
컴플라이언스 회신 문구
AWS 공식 문서에 따르면 ARN과 AWS Account ID는 리소스와 계정을 식별하는 값이며 일반적으로 secret, sensitive 또는 confidential 정보로 분류되지 않습니다. ARN만으로 IAM Role을 Assume하거나 AWS 리소스에 접근할 수 없으며, 실제 접근은 Trust Policy, Identity-based Policy, Resource-based Policy와 Condition이 결정합니다. 2026-09-16 기준 저장소 스냅샷에서 Access Key, Session Token, Private Key, Terraform state·plan은 발견되지 않았고, 검토한 Role Trust Policy에는 조건 없는Principal: "*"가 없었습니다. 다만 실제 Account ID와 운영 정책·마이그레이션 리소스 식별자는 정찰 비용을 낮추고 코드 이식성을 저해하므로 변수, data source, resource reference로 일반화하겠습니다. 따라서 조치 방향은 ARN 전면 제거가 아니라 운영 식별정보의 일부 일반화, apply Role 최소권한화, Git history Secret 검사 강화입니다.
검토 한계
이번 검토는 제공된
main 브랜치 ZIP의 정적 분석이다. 다음은 별도 확인이 필요하다.- Git history와 삭제된 과거 파일
- GitHub Actions 로그·artifact
- Secret Scanning·Push Protection 설정
- 실제 AWS에 배포된 IAM·S3 정책
- ZIP 생성 이후 저장소 변경사항
근거
- AWS — Amazon Resource Names: ARN은 비밀·민감·기밀 정보가 아니라는 공식 설명
- AWS — Account identifiers: Account ID도 비밀정보가 아니라는 공식 설명
- AWS — IAM roles: Trust Policy와 호출자 권한의 관계
- AWS — Third-party access: External ID와 confused deputy
- AWS — S3 policies: S3 접근제어 구조
- HashiCorp — Sensitive data: state·plan의 민감정보와
sensitive의 한계
- GitHub — Secret scanning patterns: AWS Access Key·Session Token 탐지 범위
한 문장 결론: ARN은 주소이지 열쇠가 아니다. 주소를 숨기는 것보다 문을 제대로 잠그고, 불필요한 운영 주소만 코드에서 일반화하는 것이 맞다.


