앞서 Terraform cloud를 소개하며 Workspace에서 AWS 인프라를 Apply하는 것을 알아보았다.
이 과정에서 AWS Credential을 Workspace에 변수로 두어서 적용했는데, 이렇게 장기 Credential을 발급하고 입력해두는 것은 여러 단점들을 가지고 있긴하다.
- Credential의 노출 : Credential 자체를 직접적으로 삽입해주기에 노출이 발생할 수 있다.
- 주기적인 교체작업 : 장기 Credential을 보다 안전하게 사용하기 위해서는 주기적인 Credential 교체작업이 필요하다.
이를 해결하기 위해 Terraform Cloud에서는 Dynamic Provider Credential 기능을 제공한다.
Terraform을 통해 구성할 수 있는 다양한 CSP들에 대한 Provider 별로 동적으로 Credential을 발급받는 구조로 이뤄진다.
이를 위해 Terraform Cloud workspace와 각 CSP 플랫폼에 대해 신뢰관계를 지정해주며, Terraform에서는 workload identity token을 발급해서 CSP 플랫폼에 인증하며 임시 Credential을 발급받고 리소스에 접근하는 등의 동작을 하게 된다.
AWS 환경에서 Dynamic Credential을 발급받는 것은 AWS STS 서비스를 이용해서 이뤄진다.
이번에는 Workspace와 AWS 환경에 대해 Dynamic Credential을 발급받아 동작하는 아키텍처를 구성해보도록 한다.
OIDC Identity Provider 설정
Terraform Cloud 서비스에서 AWS IAM의 Role을 사용하기 위해 Terraform Cloud의 OIDC Identity Provider를 생성해줘야한다.
IAM 서비스 콘솔에서 '자격 증명 공급자' 탭에서 OpenID Connect 유형을 선택한다.
공급자 URL에는 `https://app.terraform.io`, audience에는 `aws.workload.identity`를 지정해준다.
(workspace의 환경변수 상에 `TFC_AWS_WORKLOAD_IDENTITY_AUDIENCE`값을 별도로 지정했으면 audience에는 그 값을 입력해준다.)
Role과 신뢰관계(Trust Policy) 설정
이어서 Terraform Cloud Workspace에서 사용할 IAM Role을 생성한다.
OIDC Identity Provider를 이용해 Terraform Cloud workspace와 AWS IAM Role에 대해 신뢰관계를 설정해준다.
{
"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:ORG_NAME:project:PROJECT_NAME:workspace:WORKSPACE_NAME:run_phase:RUN_PHASE"
}
}
}
]
}
위와 같은 신뢰관계를 통해 OIDC Identity Provider가 이 Role에 부여된 권한만큼 AWS 리소스에 대해 접근권한을 가지게 된다.
Condition field를 통해 우리가 소유한 Terraform Cloud Workspace로만 제한할 수 있다.
- OIDC_PROVIDER_ARN : 앞서 생성한 OIDC Identity Provider의 ARN
- Condition
- aud : 앞서 OIDC Identity Provider를 생성했을때의 aud값 (기본 aws.workload.identity)
- sub : Workspace에 대한 내용, Organization/Project/Workspace 뿐만 아니라 run_phase(plan,apply)에 대해서도 별도 지정이 가능하다.
Terraform Cloud Workspace 설정
Terraform Cloud의 Workspace에서도 환경변수 몇 개를 설정해주어야한다. 아래 2개의 변수는 모두 필수 내용임으로 설정해주자
- TFC_AWS_PROVIDER_AUTH : AWS에 인증을 위한 필수 변수, 이게 선언되지 않으면 Role ARN이 있어도 Workspace가 AWS에 인증과정을 수행하지 않는다.
- TFC_AWS_RUN_ROLE_ARN : Workspace에서 사용할 AWS IAM Role의 ARN, 앞서 생성해준 Role의 ARN이 들어간다.
Dynamic Credential 설정과 관련된 Workspace 환경변수의 자세한 내용은 공식 Docs를 참조
코드 적용
이제 앞서 예제로 사용했던 코드에서 변수로 주었던 Access Key들을 삭제하고 적용해보도록 한다.
provider "aws" {
region = var.aws_region # 키,시크릿 미사용
}
# variables.tf에 입력받았던 키,시크릿도 삭제
Code를 repo에 push해주고 트리거가 발동, 그리고 workspace와 연결해준 Role이 사용되는 것을 확인할 수 있다.
그리고 정상적으로 Apply가 된 것도 볼 수 있다.
이렇게 AWS STS 서비스를 통해 Dynamic Credential을 발급받고 리소스를 생성하는 과정을 알아보았다.
이를 통해 아래와 같은 이점을 얻을 수 있다.
- 간단한 유지관리 : 토큰 형식의 단기 Credential을 이용하기에 더이상 Access key를 로테이팅하지 않아도 됨
- 보안성 증대 : 장기 Credential이 노출될 염려 없음, 신뢰관계의 Condition을 통해 workspace 단위의 최소 권한 유지 가능
- 유연성 증대 : workspace에 연결한 Role별로 권한을 조절해줄 수 있음
참고
Simplify and Secure Terraform Workflows on AWS with Dynamic Provider Credentials | Amazon Web Services
The HashiCorp Terraform AWS provider has surpassed more than one billion downloads, and every single Terraform apply starts with a provider credentials setup. The new dynamic provider credentials feature offers the ability to generate dynamic, short-lived
aws.amazon.com
Dynamic provider credentials in HCP Terraform | Terraform | HashiCorp Developer
Dynamic provider credentials generate temporary credentials for HCP Terraform runs. Learn how dynamic credentials for Vault, AWS, Azure, Kubernetes, and GCP can improve your security.
developer.hashicorp.com