본문으로 바로가기

Contents

    개요

    Terraform이 프로비저닝 해야 할 AWS의 Account가 늘어나면 늘어날수록 각 계정에 대한 Key 관리가 부담스러워진다. 그 관리 부담을 덜 수 있게 해주는 Assume Role 인증방식을 소개한다.

     

    기존의 인증방식

    기존의 인증 방식은 아래와 같다.

    1. 각 계정별로 Terraform 전용 IAM User를 생성한다.
    2. 인증에 필요한 Access Key와 Secret Key를 (접근 제한설정이 있는) 위키 페이지에 적는다.
    3. 해당 인증정보를 AWS Profile로 추가한다.
    4. Terraform provider.tf에 profile 이름이 명시되어 있어서 이를 통해 인증한다.

    ❗ 기존 인증방식의 문제점

    1. Access Key와 Secret Key만 있다면 누구나 Terraform의 권한을 취득할 수 있다. (유출이 되지 않게 유의해야 한다.)
    2. 해당 인증 정보를 이미 알고있는 사람이 퇴사를 했을경우 Access Key와 Secret Key를 바꿔야 하는 번거로움도 존재한다.
    3. 각 계정별로 인증키가 생성되기 때문에 계정이 많아지면 많아질수록 관리도 어렵고 보안도 취약해진다.

    결론적으로 계정이 늘어나면 늘어날수록 관리가 복잡해지므로 관리의 효율화를 위해 Assume Role 방식으로 인증하도록 변경하였다.

     

    Assume Role 방식으로 인증

    방법은 간단하다. AWS Managing Account에 TerraformManagingUser라는 IAM User를 생성한다. 해당 유저는 다른 AWS 계정에 있는 TerraformAssumeRole을 Assume 할 수 있는 권한이 있다. Terraform 설정파일에 (보통 provider.tf) Assume Role을 지정할 수 있는 속성이 있는데 해당 속성을 지정하게 되면 Role 기반으로 Terraform 명령어가 수행된다.

    Assume Role 인증방식

     

    설정 방법

    1️⃣ IAM User 및 Role 생성

    • IAM User 생성 (Managing Account)
      • IAM User
        • 이름
          • TerraformManagingUser
      • 정책
        • 이름
          • TerraformManagingPolicy
          {
              "Version": "2012-10-17",
              "Statement": [{
                  "Effect": "Allow",
                  "Action": [
                      "iam:PassRole"
                  ],
                  "Resource": [
                      "arn:aws:iam::<managed_account_id>:role/TerraformAssumedRole"
                  ]
              }]
          }
          
    💡 IAM User 생성 후 ARN은 따로 복사해놓자.
    • IAM Role 생성 (Managed Account)
      • IAM Role
        • 이름
          • TerraformAssumedRole
        • 신뢰정책
          • {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Principal": {
                    "AWS": [
                      "arn:aws:iam::<managing_account_id>:user/TerraformManagingUser"
                    ]
                  },
                  "Action": "sts:AssumeRole"
                }
              ]
            }
      • 정책
        • 이름
          • AdministratorAccess (관리형 정책)

    2️⃣ Terraform or Terragrunt 설정파일 변경

    1. Role을 Assume 할 수 있도록 설정
      • Terraform
        provider "aws" {
          region  = "${local.region}"
          assume_role {
            role_arn    = "arn:aws:iam::<managed_account_id>:role/TerraformAssumedRole"
          }
        }
      • Terragrunt
        • terragrunt.hcl 수정
      • # Assume Role
        iam_role = "arn:aws:iam::<managed_account_id>:role/TerraformAssumedRole"

    3️⃣ 인증정보 셋팅

    • Managing Account의 인증 정보 입력
      • 환경변수로 주입 (택 1)
    # Environment Variables
    export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
    

     

    • AWS Profile을 지정해서 주입 (택 1)
    # ~/.aws/profile
    [managing-account]
    aws_access_key_id = <AWS_ACCESS_KEY_ID>
    aws_secret_access_key = <AWS_SECRET_ACCESS_KEY>
    export AWS_PROFILE=managing-account

     

    • 명령어 실행
    terragrunt plan
    

     

    마치며

    계정이 늘어나면 늘어날수록 각 계정에 대한 Access Key와 Secret Key를 생성해주고 관리해줘야 한다는 부담이 있었으나 Assume Role 방식을 적용한 이후로는 관리 부담이 훨씬 줄어들기 때문에 여러 계정을 사용하는 Multi Account 환경에서는 해당 방식으로 인증하도록 하는것이 가장 효율적인 방법이 아닐까 싶다.

    대신 단점으로는 Manaing Account의 IAM User의 Access Key 및 Secret Key는 모든 계정에 접근할 수 있는 권한이 존재하기 때문에 해당 Key가 유출이 된다면 큰 사고가 일어날 수 있다. 그 점을 유의하면서 해당 방식을 적용하면 좋을 것 같다.

     

    Reference

     

    'Devops > Terraform' 카테고리의 다른 글

    [Terraform] For문  (0) 2023.02.12
    [Terraform] Configuration Syntax  (0) 2022.12.30
    [Terraform] Types  (0) 2022.12.26
    [Terraform] count와 for_each (Meta-Arguments)  (0) 2022.12.25
    [Terraform] Terragrunt와 Terraform Cloud(TFC) 연동해보기  (1) 2022.12.16