본문 바로가기
IaC/Terraform

Terraform Cloud를 활용한 AWS Provider 동적 자격 증명 구성(Dynamic Provider Credentials)

by wlsdn3004 2024. 1. 9.
728x90
반응형

 

Terraform Cloud 환경에서 Terraform을 사용할 때 AWS Provider 사용에 필요한 "access_key", "secret_key" 값을 설정해야 하는데 일반적으로 워크스페이스 변수 또는 변수 세트를 사용하여 정적으로 자격 증명을 저장하여 사용한다.

 

그러나 이 방식은 장기간 자격 증명이 저장되어 있고, 모든 작업에 동일한 권한이 부여되어야 함을 의미하며 이는 보안 문제를 야기할 수 있다. 또한, 정적 자격 증명을 저장하여 사용할 때 자격 증명을 교체해야 하는 상황이 발생하는데, 매번 수동으로 교체하는 작업은 운영 부담이 증가하게 되고 이 과정 중 보안 위험에 노출될 수 있다.

 

이러한 문제를 해결하기 위해 Terraform은 AWS 환경에서 사용할 수 있는 Dynamic Provider Credentials을 제공한다.

 

Dynamic Provider Credentials은 자격 증명을 수동으로 관리하고 교체할 필요가 없고, Terraform Cloud 실행 단계에서 Provider에 대한 동적 자격 증명을 얻을 수 있다.

 

예를 들어, AWS의 IAM Role을 통해 AWS Provider에서 사용할 수 있는 권한을 실행 단계에서 동적으로 할당하는 것이 가능해진다. 또한, 각 Terraform Cloud의 프로젝트와 워크스페이스별로 얻을 수 있는 권한에 대한 세밀한 제어가 가능하다.

 

AWS Dynamic Provider Credentials의 인증 워크플로우는 아래와 같다.

  1. 사용자가 Terraform Cloud에 접근하여 Plan & Apply를 실행한다.
  2. Terraform Cloud는 AWS STS에게 인증을 요청 및 조직과 워크스페이스 이름을 포함한 JWT Token을 전달하여 검증한다.
  3. AWS IAM ROLE에 설정되어 있는 신뢰 정책을 통해 유효한지 검증한다.
  4. 검증된 후 임시 자격 증명을 제공한다.
  5. Terraform Cloud는 제공받은 자격 증명을 사용하여 필요한 AWS 리소스를 생성한다.

 

구성 환경 구조는 아래와 같다.

  • Terraform Cloud 워크스페이스별 Github 저장소에 Terraform 설정 파일 보관
  • Terraform Cloud 워크스페이스별 IAM ROLE 할당
  • Terraform Cloud 워크스페이스별 할당받은 IAM ROLE 권한을 통해 AWS 환경에 리소스 배포

 

이번 실습에서는 Terraform Cloud와 AWS 사이의 신뢰 관계를 설정하고, 워크스페이스에 동적 자격 증명을 구성하여 해당 워크스페이스에서 AWS 리소스(EC2 Instance)를 생성하는 실습을 다룰 것이다.

 

 

전제 조건

 

 

1. AWS 자격 증명 공급자 생성


아래와 같이 AWS Console에서 자격 증명 공급자를 생성한다.

 

  • AWS Console > IAM > 자격 증명 공급자 > 자격 증명 공급자 생성

 

정상적으로 생성되었는지 확인한다.

 

 

2. IAM ROLE생성


Terraform Cloud에서 사용할 IAM ROLE 생성 단계에서 신뢰 관계를 설정하여 생성 후 필요한 권한을 추가한다. 

  • AWS Console > IAM > 역할 > 역할 생성

 

위 설정한 신뢰 정책 내용 형식은 아래와 같다.

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Principal": {
       "Federated": "{OIDC_PROVIDER_ARN}"
   },
     "Action": "sts:AssumeRoleWithWebIdentity",
     "Condition": {
       "StringEquals": {
         "app.terraform.io:aud": "aws.workload.identity"
        },
       "StringLike": {
         "app.terraform.io:sub": "organization:{TFC_조직_이름}:project:{TFC_프로젝트_이름}:workspace:{TFC_워크스페이스_이름}:run_phase:*"
        }
      }
    }
  ]
}
  • "app.terraform.io:sub"의 값의 의미는 Terraform Cloud의 조직, 프로젝트, 워크스페이스가 일치해야 액세스 할 수 있다는 내용이다.

 

생성된 IAM ROLE에 각 환경에 필요한 정책을 추가한다.

 

 

3. Terraform Cloud 변수 설정


Terraform Cloud에서 AWS 인증을 위한 Terraform Cloud 워크스페이스에서 환경 변수를 설정해야 한다.

아래 위치로 이동하여 Terraform Cloud 워크스페이스의 variables를 설정한다.

  • TFC_AWS_PROVIDER_AUTH : true
    • Dynamic Provider Credentials을 사용하도록 true 입력
  • TFC_AWS_RUN_ROLE_ARN : 위에서 생성한 "iam_role_arn" 입력
    • 테라폼이 프로비저닝에 사용할 iam role이다
기존 테라폼 코드의 AWS Provider에 설정되어 있는 access_key, secret_key 정보는 전부 제거한다.

 

 

4. 리소스 생성 확인


아래 예시 테라폼 코드를 추가하여 aws 인스턴스를 생성해 보자.

## ec2.tf
resource "aws_instance" "example" {
  ami           = "ami-01123b84e2a4fba05"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleInstance"
  }
}

 

Github와 연동되어 있어 해당 코드를 commit & push 하면 자동으로 Terraform Cloud에서 Plan & Apply가 트리거 된다.

 

Terraform Cloud에서 아래 Apply 결과를 통해 aws 인스턴스가 정상적으로 생성된 걸 확인할 수 있다.

 

실제 위에서 생성한 IAM ROLE 기반으로 생성된 인스턴스인지 확인해 보자

  • AWS Console > CloudTrail > 이벤트 기록
    • 리소스 유형 : AWS::EC2::Instance

CloudTrail에서 확인해 보면 위에서 생성한 IAM ROLE 권한으로 생성된 걸 확인할 수 있다.

 

 

5. 워크스페이스 실행 권한 검증


AWS IAM ROLE의 신뢰 관계 설정 중 "app.terraform.io:sub"의 값에 설정되어 있지 않은 Terraform 워크스페이스에서 Plan & Apply 실행하여 권한이 막혀있는지 확인한다.

 

새로운 워크스페이스 생성 후 "TFC_AWS_PROVIDER_AUTH", "TFC_AWS_RUN_ROLE_ARN" 값을 동일하게 설정하고 Plan & Apply를 실행하면 아래와 같이 오류가 보인다.

자격 증명 및 AccessDenied 오류 메세지를 확인할 수 있다.

 

마치며


Terraform Cloud의 Dynamic Provider Credentials을 사용하여 AWS에서 Terraform Cloud 실행을 위한 동적 자격 증명을 생성하는 방법을 실습을 통해 확인해 보았다. 이 기능을 통해 보다 안전한 방식으로 자격 증명을 저장하여 인프라를 관리할 수 있다. 또한 정적 자격 증명을 수동으로 교체해야 하는 운영 부담을 줄일 수 있다.

반응형

댓글