[CI/CD] Github Action 과 AWS IAM 보안연결 구성하기
이 글을 통해서, Github Action 과 AWS 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 대역 확인
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://token.actions.githubusercontent.com 이 sts.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