키가 한 번 유출되면 만료가 없어 피해가 크다.
유출/탈취 방지로 키를 주기적으로 교체해야 하고, 교체 중 장애가 발생할 수 있다.
환경별로 권한을 나누기 위해서는 IAM 사용자와 키를 증가시켜야 하기에 관리하기 어려워진다.
어느 곳에서 접근을 했는지 구분하기 어려워 감사 및 추적에 취약하다.
이러한 단점으로 인해 AWS에서는 IAM Role을 사용을 권장한다.
특히 GitHub Actions 같은 CI/CD 환경에서는 OIDC와 결합하면 보안성과 편의성이 크게 향상된다.
세션 만료(기본 1시간)로 유출 피해를 축소시킬 수 있다.
Repository, Branch 등 맥락 기준으로 접근 범위를 정확히 제한한 수 있다.
AWS의 CloudTrail 서비스를 이용하면 AssumeRole과 세션 태그로 로그를 남겨 추적할 수 있다.
키 관리 및 교체하지 않아도 된다.
환경별로 역할을 분리하기 쉽다.
역할 단위로 정책을 최소화하여 유지할 수 있다.
아래와 같이 각 항목에 맞는 값을 넣어주고 공급자 추가를 해준다.
공급자 유형 : OpenID Connect
선택
공급자 URL : https://token.actions.githubusercontent.com
대상 : sts.amazonaws.com
ID 제공업체 : token.actions.githubusercontent.com
Audience : sts.amazonaws.com
GitHub organization : GitHub Actions를 사용하는 GitHub Organization
GitHub repository : 접근을 허용하는 GitHub Repository
GitHub branch : 접근을 허용하는 GitHub Branch
나는 이전에 IAM User를 생성하면서 부여한 정책을 선택했다.
원하는 이름을 설정해주고, 아래 권한 정책 요약을 통해 제대로 선택했는지 확인 후 생성해주면 된다.
나는 "AWS_IAM_ROLE"이라는 이름으로 추가했다.
deploy:
runs-on: ubuntu-latest
needs: build
permissions:
id-token: write
steps:
- name: AWS credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
aws-region: ${{ secrets.AWS_REGION }}
id-token
에 대한 쓰기 권한을 부여하여, OIDC 공급자에게 JWT ID 토큰 요청
기존 aws-access-key-id
와 aws-secret-access-key
속성 삭제
role-to-assume
속성에 ARN 값이 들어있는 secrets를 추가
IAM Role로 접근하여 정상적으로 배포가 진행되었다.
최근 여러 보안 사고가 터지면서, 보안에 대한 중요도가 높아졌다.
그러나 GitHub Actions를 통해 AWS에 배포하는 블로그 글 대부분은 권장되지 않는 Access Key로 하는 경우가 많았다.
나는 두 가지 방식을 모두 해보며, AWS 접근 시 발생하는 보안적 허점을 분석하게 된 계기가 되었다.
그래서 보다 더 안전한 방식을 많은 사람들이 적용했으면 하는 바램으로 이 글을 작성해본다.
Use an IAM role to grant permissions to applications running on Amazon EC2 instances | AWS Docs
Use IAM roles to connect GitHub Actions to actions in AWS | AWS Security Blog
configure-aws-credentials Docs | aws-actions GitHub
OIDC 토큰을 요청하는 워크플로 권한 | GitHub Docs