Dev&Ops/DevOps

[CI/CD] GitHub Action AWS에 IAM Role로 접근하기

zeroneCoder 2023. 3. 4. 21:03

안녕하세요! zerone-code입니다.

 

오늘은 아마 대부분의 개발자들이 Github을 이용한다면 사용해봤을 GitHub Action에 대해 말해보고자 합니다.

 

GitHub Action을 이용해서 CI/CD를 많이 하는데, 이 과정에서 AWS에 접근하는 방법에 대해 다뤄보고자 합니다.


1. GitHub Action에서 AWS  접근하기

GitHub Action에서 AWS를 접근하기 위해 정보를 찾아보면 대부분 IAM User를 생성하고, Access Key ID와 Secret Access Key를 설정해서 사용하는 use case가 정말 많습니다.

 

Action Secrets and variables

위와 같이 설정에서 Action에서 사용될 secrets를 설정하고, Action에서 아래와 같이 설정해서 사용할 수 있습니다.

아래 예시는 Access Key ID와 Secret Access Key를 적용해서 ECR에 접근하는 예시입니다.

name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  
 jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Src
      uses: actions/checkout@v3

    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
        
    # AWS credentials 설정
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    # AWS ECR 로그인
    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

하지만 이게 과연 최선일까라는 고민을 하게 됐습니다. 요즘 보안사고가 많이 일어나고, 해킹사고도 많이 일어나기 때문에 Github가 해킹당한다면..?이라는 생각이 들었습니다. Security best practices in IAM에도 보면 Application에서는 IAM User가 아닌 IAM Role을 사용하길 권고하고 있습니다.

 

그래서 특정 User를 생성해서 사용하는 Key 기반이 아닌 Role기반으로 변경하는 것이 좋을 거 같다는 생각으로 접근을 했습니다.

 

분명히 Action도 Container 기반으로 돌기 때문에 Key를 기반으로 동작한다면 Role 기반으로도 동작하지 않을까라는 생각을 했습니다. 역시나... AWS에 리소스에 접근하기 위해서 IAM Role을 Assume하여 사용할 수 있었습니다.

 

이를 적용하기 위해서는 3 가지 사전 작업이 필요합니다. 각각에 대해 자세히 알아보도록 하겠습니다.

 

1. External Identity Provider 생성

IAM OIDC identity providers는 외부 자격 공급자(external identity provider - IdP)로부터 AWS 계정에 접근할 수 있도록 아래와 같이 설정해줘야합니다. Provider URL에서 Assume을 할 수 있도록 Audience에 sts.amazoeaws.com을 지정해줍니다.

Identity Providers

2. AWS IAM Role 생성

그리고 GitHub Action에서 사용할 IAM Role을 생성해줍니다.

 

여기서 Trust Relationships에는 앞서서 생성해준 Identity Providers에서 생성한 IdP의 arn을 추가해주고, Role을 사용할 Condition으로 Assume role을 할 수 있도록 sts.amazonaws.com과 어떤 조직의 Repository에서 사용할지를 명시해줍니다.

 

만약 해당 Role을 Orginization 내의 모든 Repository에서 사용할다면 "repo:OrgName/*:*"로 해주면 됩니다.

Trust Relationship

그리고 Role을 이용해 사용할 IAM Policy들을 생성해서 붙여줍니다.

IAM Policy

3. GitHub Action에서 Role 적용

이제 마지막 단계로 생성한 IAM Role을 Github Action에 적용해주는 과정입니다.

위에서 적용했던 Action의 yaml을 변경해보도록 하겠습니다. 

env의 Access Key ID와 Secret Access Key를 제거해주고, 아래의 AWS 인증 부분에 role-to-assume에 앞서 만든 IAM Role의 arn을 지정해줍니다. 

name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  
 jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Src
      uses: actions/checkout@v3

    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
        
   # AWS 인증
    - name: configure aws credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        role-to-assume: ${{ env.AWS_ROLE_NAME }}
        aws-region: ${{ env.AWS_DEFAULT_REGION }}

    # AWS ECR 로그인
    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1

만약 session name을 지정해주기 위해서는 아래에 aws-region 아래에 role-session-name이라는 key로 지정을 해줍니다.

role-session-name: MySessionName

위와 같이 설정한 다음 GitHub Action을 다시 돌려보면 정상적으로 Role을 사용하여 AWS에 접근하는 것을 확인할 수 있습니다.

되도록이면 IAM User의 AWS Acess Key와 Secret Key를 쓰지 않는 방법으로 Key의 유출을 최소화해서 보안사고를 막는 방법을 항상 생각하고 적용해야 할 것 같습니다.

 

궁금한 부분은 댓글로 남겨주시면 아는 만큼 성심성의껏 답변해드리도록 하겠습니다.

잘 읽으셨다면 많은 공감과 구독 부탁드립니다!

Reference

https://github.com/aws-actions/configure-aws-credentials

 

GitHub - aws-actions/configure-aws-credentials: Configure AWS credential environment variables for use in other GitHub Actions.

Configure AWS credential environment variables for use in other GitHub Actions. - GitHub - aws-actions/configure-aws-credentials: Configure AWS credential environment variables for use in other Git...

github.com

https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html

 

Security best practices in IAM - AWS Identity and Access Management

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com