소개
AWS IAM의 모범사례에서는 AWS에 Access 가 필요한 워크로드가 있을 경우, 임시자격증명 사용을 권장하고 있습니다. 이는 Permanent 한 자격증명 대신 expired가 존재하는 자격증명을 이용함으로서 더욱 보안적인 자격증명 관리를 하기 위함인데요.
그래서 Github Action 에서도 AWS Access가 필요할 경우, Permanent한 Access Key/Secret Key를 이용하는 것이 아닌, IAM Role을 이용하는 방법을 알아보고자 합니다.
Github Action에서 workflow를 통해 AWS s3 버킷 리스트를 출력하는 시나리오로 진행해보려고 하며,
Github Action 에서 aws-actions/configure-aws-credentials@v1 에서 Role 기반으로 자격증명을 구성할 수 있도록 v2가 릴리즈되어 이를 이용해보도록 하겠습니다.
절차 요약
- AWS – IAM Identity Provider 생성
- AWS – Role 생성
- Trusted entity 설정
- Permission 부여
- Trust Policy 에 적절한 github 계정 및 Repository 제어 설정
- Github Workflow 작성
- aws-actions/configure-aws-credentials@v2 이용
1. AWS – IAM Identity Provider 생성
- AWS IAM 에서 Identity providers 생성
- OpenID Connect 에서 Provider URL, Audience를 아래와 같이 입력
- Provider URL – https://token.actions.githubusercontent.com
- Audience – sts.amazonaws.com
2. AWS – Role 생성
- Trusted entity 를 web identity 설정
- Identity provider – 1번에서 생성한 provider 선택
- Audience – sts.amazonaws.com 선택
- 원하는 Permission 부여
- Role name, Description 설정
- Role 생성생성된 IAM Role 에서 Trust relationships 수정
- 아래 내용을 참고하여 수정한다
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<AccountID 기입>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:<깃헙 ID>/<레파지토리 이름>:*"
},
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
}
}
}
]
}
- Condition을 통해 반드시 Github repository 정보를 입력하고 해당 계정 or Repository 에서만 접근이 가능하도록 하여야 합니다.
- 그렇지 않으면 다른 계정에서도 해당 Role을 Assume 할수 있어, 보안적으로 취약해 질 수 있습니다.
3. Github Workflow 작성
- aws-actions/configure-aws-credentials@v2 를 이용합니다.
- Role 기반으로 임시자격 증명을 이용할 수 있도록 v2가 릴리즈 되었으니, 이용하면 쉽게 구현이 가능합니다.
- 보시다시피 Access key, Secret key 를 permanent 하게 사용하지 않고 Role ARN 기반으로 작성되게 됩니다.
name : AWS S3 LS on PR
on: push
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
jobs:
s3-ls:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ap-northeast-2
- name: List S3 Bucket
run: |
aws s3 ls
- Actions 결과
참고
- https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/best-practices.html
- https://github.com/aws-actions/configure-aws-credentials
- https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services