Github Actions에서 OIDC로 AWS에 안전하게 접근하기

개발하는 구황작물·2024년 11월 22일
0

해당 글은 Github OIDC 적용 방법에 대해서만 중점적으로 작성하였습니다.

Github Actions에서 서비스 배포를 위해 AWS에 접근 시 access-key, secret-key로 인증을 하는 경우가 있습니다.

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with: 
          with:
        	aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        	aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        	aws-region: ${{ secrets.AWS_REGION }}

그러나 access-key, secret-key를 github secrets변수로 저장해서 안전하게 보관하고 IAM 권한 범위를 적절히 지정하더라도 한 번쯤 찜찜하다고 생각한 적이 있을 것입니다.(Github 가 털린다거나 Github 가 털린다거나Github 가 털린다거나)

애초에 AWS 에서도 access key, secret key 사용을 지양하라고 하고 있습니다. (access key를 잃어먹는다거나, 털린다거나...)

그래서 이번에는 access Key 대신 Github OIDC를 활용하여 AWS 에 접근하기로 하였습니다.

Github OIDC

OIDC를 통해 장기적인 자격 증명 대신, 수명이 짧은 액서스 토큰을 발급받는 방식으로 진행됩니다.

작동 순서


출처 : https://docs.github.com/ko/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect

  1. 클라우드 공급자(AWS)에서 클라우드에 액서스 해야 하는 역할(AWS Role)과 Github Workflow 간에 OIDC Trust를 만듭니다.
  2. 작업이 생성될 때마다 Github의 OIDC 공급자는 OIDC 토큰을 생성합니다.
  3. Github의 OIDC 공급자에서 클라우드 공급자(AWS)에게 토큰을 전달합니다.
  4. 클라우드 공급자가 토큰에 제공된 클레임의 유효성을 성공적으로 검사하면 작업 기간동안 사용 가능한 수명이 짧은 클라우드 액서스 토큰을 제공합니다.

적용 방법

1. AWS Role 생성

AWS IAM -> 역할 -> 역할 생성 으로 들어갑니다.

웹 자격 증명을 선택한 후, 자격증명 공급자에 token.actions.githubusercontent.com을 입력, Audience에 sts.amazonaws.com 입력, Github 조직 및 repository에 해당하는 organization 과 repository 명을 적으면 됩니다.

이후 해당 계정에 사용할 권한을 추가하거나 Role 생성 후 다시 추가해도 됩니다.

저같은 경우 EC2로 특정 파일을 전송하기 위해(scp) 보안그룹에 22번 포트 Github Actions IP를 추가하고 작업이 끝나면 삭제하기 위해 Role 생성 이후 권한 추가를 통해 권한을 연결해주었습니다.

이후 만든 Role의 ARN 을 따로 기억해둡니다.

2. Github Actions Secrets 변수 추가

Github Actions를 사용할 레포지토리에 들어가 Settings -> Secrets and variables -> Actions 로 들어갑니다.

이후 이전에 기억해두었던 ARN을 저장합니다.

3. gradle.yml에 작성

이제 AWS에 인증 과정을 gradle.yml에 작성하면 됩니다.

...
  CD:
    needs: [CI]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: ${{ secrets.AWS_REGION }}

이전에 저장해둔 ARN을 role-to-assume에 입력하고 aws region도 작성하면 됩니다.

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글