본문 바로가기

DevOps

[Terraform] AWS 인증 2. Assuming Role with Github Actions(Multi Account 관리)

Terraform에서 AWS provider에 인증을 하기 위해서 assuming role을 사용하는 방법으로 provider block에 아래와 같이 assume_role에 trust relationship을 설정한 role의 role_arn을 지정하는 방법이 있습니다. 

variable "account" {}		 
// # account 값은 .tfvars 파일 또는 Terraform Cloud variables에서 관리하고 있다고 가정

provider "aws" {
  region = "ap-northeast-2"
  
  assume_role {
    role_arn = "arn:aws:iam::${var.account}:role/AWS-trusted-role"
  }
}

 

하지만 이번 포스트에서는 github oidc provider를 활용하여 github action에서 assuming role을 부여 받아서  테라폼과 연계하여 Multi account를 관리하는 방법에 대해서 설명하겠습니다.

 

 

Assuming Role은 IAM 사용자 또는 외부 자격 증명 (OIDC, IdP)으로 다른 AWS 계정 또는 리소스에 액세스 할 수 있는 AWS에서 제공하는 기능으로 아래와 같은 장점을 가지고 있습니다. 

  • 하나의 자격 증명으로 여러 계정을 사용할 수 있음
  • Role에 지정된 Policy를 통해서 권한을 조정할 수 있음
  • AWS STS (Security Token Service)와 연계하여 일시적인 권한을 설정하거나 외부 자격 증명으로 다른 AWS 계정에 액세스 할 수 있음. 

 

OIDC, Open ID Connect

클라이언트 (신뢰하는 파티)가 신원 제공자(Identity provider, IdP)에 의해 수행된 인증을 기반으로 최종 사용자의 신원을 확인할 수 있도록 함으로써 사용자 인증 및 권한을 부여하는 방법입니다. 

 

 

Github OIDC provider를 통해서 AWS에서 assuming role을 설정하기 위해서는, 

각 계정에 indentity proviider를 등록하고, Trust relationship이 설정된 role을 생성해야 합니다. 

아래 링크의 Github에서 제공하는 Document에 상세한 설명과 provider URL, Audience와 같은 중요한 정보가 있습니다. 

https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

 

Configuring OpenID Connect in Amazon Web Services - GitHub Docs

Use OpenID Connect within your workflows to authenticate with Amazon Web Services.

docs.github.com

 

1. Identity Provider 등록

  • 콘솔 로그인 
  • IAM으로 이동
  • Identity providers 메뉴 선택
  • Add provider
  • OpenID Connect 선택
  • Provider URL 입력 : https://token.actions.githubusercontent.com
  • Get thumbprint 버튼 클릭
  • Audience 입력 : sts.amazonaws.com

 

2. Role 생성

  • IAM 콘솔
  • Create role
  • Custom trust policy 선택
  • Custom trust policy에 아레와 같이 입력
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<Account-ID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:<my-org-name>/<my-repo-name>:*"
                },
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

<Account-id>에 12자리 account ID, <my-org-name>/<my-repo-name>에 Github의 Organization과 Repository name을 입력하면 됩니다. repository의 clone 정보의 SSH 주소에서 확인 가능합니다. 

  • Next
  • Permission 지정 : Terraform을 이용해서 인프라 관리를 위해서는 Administrator access 권한 필요, 불필요한 권한 deny 설정

3. Workflow 파일에서 AWS Credential 설정

  • aws-actions/configure-aws-credentials@v2를 이용해서 인증 시도
jobs: 
  authentication:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-region: ap-northeast-2
          role-to-assume: arn:aws:iam::<aws-account>:role/aws-oidc-role

Github action의 로그를 확인하면,  Configure AWS credentials 단계에서는 없었던 환경변수 (AWS_DEFAULT_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)가 다음 단계인 Print assumed role단계에서는 지정되어 있는 것이 확인됩니다. 

 

 

Github workflow를 설계할 때, dev, prod 환경이 각각 다른 계정에 구성되어 있을 때, branch별로 각각 다른 workflow 파일을 사용하여, 각 파일에 각각 다른 계정의 assume role을 지정하면 workflow 별로 다른 계정을 관리할 수 있습니다. 

 

 

 

감사합니다. 

 

 

사진출처: UnsplashMarkus Spiske