CI에 장기 클라우드 키를 저장하는 건 이제 그만
CI에서 AWS를 배포할 때 전통적으로 쓰던 방식은 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 비밀값으로 저장하는 거야. 이 키들은 만료 기한이 없고 장기적으로 쓰이는데, 하나만 유출돼도 접근 가능한 모든 걸 침해당할 수 있어. 이제 그만해.
OpenID Connect (OIDC)를 쓰면 GitHub Actions가 클라우드 제공자의 IAM에서 직접 짧은 수명으로 범위가 정해진 토큰을 요청할 수 있어. 흐름은 이래:
- 워크플로가
permissions: id-token: write를 선언해. - 액션이 GitHub에 OIDC ID 토큰을 요청해. 토큰에는 '저장소 X, 브랜치 Y, Z가 실행한 워크플로'라는 정보가 들어있어.
- 클라우드 제공자(AWS / GCP / Azure 등)가 GitHub의 공개 키로 토큰 서명을 검증해.
- 클라우드 제공자가 신뢰 정책을 확인해. '저장소 X의 워크플로가 역할 R을 맡는 걸 신뢰할까?'
- 그렇다면 짧은 수명(약 1시간)의 자격 증명을 반환해.
- 액션이 그 자격 증명을 쓰고, 시간이 지나면 자동으로 만료돼.
주요 클라우드 제공자가 다 지원해
- AWS — token.actions.githubusercontent.com 용 IAM Identity Provider를 만들고,
repo:my-org/my-repo:ref:refs/heads/main키로 신뢰 정책을 가진 역할을 설정해. - GCP — Workload Identity Federation을 쓰는데, 개념은 비슷해.
- Azure — 서비스 주체의 Federated 자격 증명을 써.
- Vault, AWS Cognito 등 — 똑같은 원리야.