[CI/CD] Github Action 과 AWS IAM 보안연결 구성하기

HYEONG HWAN, MUN/ 7월 16, 2024/ 미분류/ 0 comments

https://blog.lael.be/post/12178

이 글을 통해서, Github ActionAWS IAM 의 안전한 보안 연결을 설정하는 방법에 대해 알아보도록 하자.

 

이용 사례 (Case Study)

일반적인 사례를 예시로 들어보자.
Github 를 이용하고 있는 사용자가, 작성된 파일을 적절히 AWS S3 에 업로드 해야하는 상황이라고 가정해 보겠다.

너무 기초적인 부분은 생략했으니, 어느 정도 AWS 이용 경험이 있으셔야 이해하기 수월합니다.

1. S3 생성하기

파일이 저장될 S3 버킷을 적절히 생성합니다.

저는 laelblog-frontend-example 이라는 버킷을 생성했습니다.

 

2. IAM 사용자 생성하고 Access key 발급하기

IAM 사용자를 만들고, 적절히 권한을 부여합니다.

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::laelblog-frontend-example/*",
                "arn:aws:s3:::laelblog-frontend-example"
            ]
        }
    ]
}

 

3. Github Action 의 IP 대역 확인

https://api.github.com/meta

Github Action 의 IP 대역을 확인합니다.

2024년 7월 현재 Github Action이 사용하는 CIDR 네트워크 대역은 4597개 입니다.

해당 json 의 “actions” 항목을 살펴보면 됩니다.

 

4. AWS IAM 을 해당 IP 대역에서만 사용할 수 있게 제한하기

3번에서 확인한 Github Action 인스턴스의 IP 대역을 참고하여, 2번의 IAM 권한을 수정합니다. (IP 제한을 통해 보안강화)

이렇게 설정하면, 해당 AWS IAM 의 Access key 는 Github Action IP 에서만 사용이 가능해집니다.
문제는, IP대역이 너무나도 많고(4597개), 가끔 이 대역이 바뀐다는 점입니다.
그리고, 다른 github action 에서도 (accesskey 와 secretkey 를 안다면) 사용할 수 있는 보안 문제점도 있습니다.

 

따라서 위와 같은 방식은 권장하지 않습니다. (보안 관리가 어려움)

 


AWS 에서 Github Repository 단위로 권한을 부여하는 방법

정확히는 Github Repository 및 그 Branch 에 AWS IAM 권한을 부여할 수 있습니다.

 

일반적인 github action 예시

name: Deploy to S3
on:
  workflow_dispatch:
env:
  BUCKET_NAME : "laelblog-frontend-example"
  AWS_REGION : "ap-northeast-2"
permissions:
  id-token: write
  contents: read
jobs:
  integration:
    runs-on: ubuntu-24.04
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v4

 

Github Action 이 실행될 때에는 github.com 으로부터 GITHUB_TOKEN 이라는게 발급되고, 이것의 권한을 사용해서 동작을 합니다.

actions/checkout 구문에서 별도의 보안 설정을 하지 않아도 동작하는 이유는 GITHUB_TOKEN 에 checkout 을 할 수 있게 권한이 부여되어 있기 때문입니다.
권한 관련 내용은 https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs 글을 참고해주세요.

 

권장 설정 방법

 

1. AWS 콘솔에 로그인 한 후 IAM 으로 이동

우선 자격 증명 공급자(Identity Provider)를 정의해 봅시다.

[공급자 추가] 버튼을 누릅니다.

https://token.actions.githubusercontent.com
sts.amazonaws.com

참고 : https://docs.github.com/ko/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-the-identity-provider-to-aws

 

https://token.actions.githubusercontent.comsts.amazonaws.com 클라이언트에게 발급한 토큰을 사용하겠다는 뜻입니다.

상세 토큰 조건 및 권한 부여는 아래에서 진행합니다.

 

2. AWS IAM Role(역할) 생성하기

번역이 잘 되어 있긴 합니다만, 역할이라는 단어 대신 Role 이라고 읽도록 합니다.
Role(역할) 을 생성합니다.
신뢰 관계를 설정하고, 부여할 권한을 정의합니다.

 

[IAM] -> [역할] -> [역할 생성]

[웹 자격 증명] -> [token.actions.githubusercontent.com] 선택

Github 저장소 주소 규칙을 확인합니다.

예를 들면, https://github.com/laelbe/my-image-cdn

조직명 : laelbe

저장소명(Repository) : my-image-cdn

브랜치 : 특정 브랜치에서 실행한 액션에만 권한을 부여할 수 있습니다. (입력하지 않거나, main 또는 master 입력)

 

권한 : 아직 부여하지 말고, 다음 버튼을 누릅니다.

 

자동 생성된 정책 구문https://docs.github.com/ko/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#configuring-the-role-and-trust-policy 의 3번째 JSON 구문을 비교해보세요.

역할을 생성합니다.

 

1개의 Repo당 1개의 Role 을 사용하세요.

 

3. Role 에 권한 부여하기

[권한 추가] > [인라인 정책 생성] > [JSON]

이 블로그 글 상단의 2번 권한 구문을 참고해서 권한을 정의해 봅시다. IP 제한하는 condition 구문은 굳이 안하셔도 됩니다.

Role ARN 을 복사해 두세요.

 

4. Github Action 작성

name: Deploy to S3
on:
  workflow_dispatch:
env:
  BUCKET_NAME : "laelblog-frontend-example"
  AWS_REGION : "ap-northeast-2"
permissions:
  id-token: write
  contents: read
jobs:
  integration:
    runs-on: ubuntu-24.04
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v4
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::703307618487:role/gitaction-s3-deploy
          role-session-name: 'GitHubActions,${{ github.actor }}'
          aws-region: ${{ env.AWS_REGION }}
      - name: Upload a file to AWS S3
        run: |
          aws s3 cp README.md s3://${{ env.BUCKET_NAME }}/deploy/ --recursive

 

5. Github Action 실행!

github action runner image: ubuntu-2404 는 aws, java, composer, yarn, node 등 대부분의 빌드 및 배포 프로그램이 이미 설치되어 있습니다.
아래의 링크를 참고해서 이미 설치되어 바로 사용가능한 패키지를 확인해보세요.

https://github.com/actions/runner-images/blob/ubuntu22/20240708.1/images/ubuntu/Ubuntu2404-Readme.md

 

6. 이벤트 검토 (Event Audit - 감사)

GitAction 으로 아래와 같은 구문 실행한 후에, CloudTrail 을 보고 이벤트 기록을 확인해보세요.

aws s3 ls s3://${{ env.BUCKET_NAME }}

 

7. 기존에 사용하던 IAM 사용자 및 Access key 가 있다면 삭제

사용하지 않는 User 및 Access key삭제하는 것이 좋습니다.


 

주의 사항 : Action 에 권한이 부여되기 때문에, git repository에 push 를 할 수 있는 사용자를 미리 검토하세요.

private repo 에서 사용하는 것을 권장합니다.

사용하지 않는 AWS IAM Role은 주기적으로 삭제해 주세요.

 

참조

AWS 문서 : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html
Github 문서 : https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

 

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*