`identity_token` 블록 참조
identity_token 블록 참조 (identity_token block reference)
identity_token 블록을 사용해 Terraform이 클라우드 프로바이더 및 기타 서비스와의 OIDC 인증을 위해 생성하는 JSON 웹 토큰(JWT)을 정의해요. 이 페이지에서는 identity_token 블록의 구성 모델, 토큰 속성, 그리고 클레임 메타데이터를 다룰게요.
출처: 문서
본문
identity_token 블록을 사용해 Terraform이 클라우드 프로바이더 및 기타 서비스와의 OIDC 인증을 위해 생성하는 JSON 웹 토큰(JWT)을 정의해요.
배경 (Background)
identity_token 블록은 주어진 배포에 대해 Terraform이 생성하는 JSON 웹 토큰(JWT)을 정의해요. 배포의 inputs에서 이 토큰을 참조하고 OpenID Connect(OIDC) 인증을 위해 프로바이더 구성에 직접 전달할 수 있어요.
ID 토큰은 장기 자격 증명을 저장하지 않고 Stack 배포를 클라우드 프로바이더와 인증하는 안전한 방법을 제공해요. OIDC를 사용해 Stack을 인증하는 방법에 대한 자세한 내용은 Stack 인증을 참고해요.
구성 모델 (Configuration model)
identity_token 블록은 다음 인자를 지원해요:
identity_token "<NAME>"블록audience문자열의 집합
완전한 구성 (Complete configuration)
사용 가능한 모든 인자는 다음 identity_token 블록에 정의돼 있어요:
identity_token "<NAME>" {
audience = ["<AUDIENCE>"]
}
사양 (Specification)
identity_token 블록은 다음 구성을 지원해요.
identity_token "<NAME>"
identity_token 키워드 뒤의 레이블은 ID 토큰의 이름이며, 같은 배포 구성 파일의 모든 ID 토큰 사이에서 고유해야 해요. 이름은 유효한 식별자라면 무엇이든 될 수 있어요.
identity_token 블록은 다음 인자를 지원해요:
| 인자 | 설명 | 타입 | 필수? |
|---|---|---|---|
audience |
이 토큰이 의도된 대상(audience)이에요. | 문자열의 집합 | 필수 |
audience
audience 인자는 ID 토큰의 의도된 대상을 지정해요. 대상은 Terraform이 토큰을 생성한 후 그 토큰을 사용하는 리소스 또는 서비스를 나타내요.
identity_token "<NAME>" {
audience = ["<AUDIENCE_VALUE>"]
}
AUDIENCE_VALUE는 프로바이더나 대상 서비스가 기대하는 대상과 일치해야 해요. 예를 들어 AWS 워크로드 ID는 일반적으로 대상 값으로 "aws.workload.identity"를 기대해요. 자세한 내용과 예시는 Stack 인증을 참고해요.
토큰 속성 (Token attributes)
정의한 후 배포 구성에서 ID 토큰의 속성을 참조할 수 있어요:
| 속성 | 설명 | 타입 |
|---|---|---|
jwt |
인증에 사용할 수 있는 생성된 JSON 웹 토큰이에요. | 문자열 |
ID 토큰 클레임 메타데이터 (Identity token claim metadata)
워크로드 ID 토큰은 페이로드에 클레임이라고 하는 다른 유용한 메타데이터를 포함해요. 클라우드 플랫폼이 HCP Terraform의 공개 키로 토큰을 검증하면, ID 토큰의 클레임을 살펴 정확한 권한과 일치시키거나 거부할 수 있어요.
전체 토큰 사양이나 각 클레임이 무엇을 의미하는지 이해할 필요는 없지만, 클레임을 사용해 신뢰 관계를 조정할 수 있어요.
워크로드 ID 토큰은 일반적으로 다음 클레임을 참조해요.
| 클레임 | 설명 |
|---|---|
jti (JWT ID) |
UUID인 각 토큰에 대한 고유 식별자예요. |
iss (발급자) |
토큰에 서명한 HCP Terraform 인스턴스의 전체 URL이에요. 예를 들어 "https://app.terraform.io"예요. |
iat (발급 시각) |
토큰이 발급된 유닉스 타임스탬프예요. 특정 신뢰 당사자가 요구할 수 있어요. |
nbf (적용 이전) |
토큰을 사용하기 시작할 수 있는 유닉스 타임스탬프예요. 목적상 iat와 같아야 하며 특정 신뢰 당사자가 요구할 수 있어요. |
aud (대상) |
토큰의 의도된 대상이에요. 예를 들어 Azure의 경우 "api://AzureADTokenExchange"예요. |
exp (만료) |
발급된 작업 단계의 시간 초과에 기반한 유닉스 타임스탬프예요. |
sub (주체) |
127자 제한이에요. Stack 배포에 대한 정규화된 경로 뒤에 작업 타입이 붙어요: organization::project::stack::deployment::operation:. 예를 들어: organization:My_Org_name:project:My_Project:stack:My_Stack:deployment:staging:operation:apply |
다음 사용자 지정 클레임을 사용해 토큰의 권한을 더 사용자 지정할 수 있어요.
| 클레임 | 설명 |
|---|---|
terraform_operation ("run phase") |
이 토큰이 발급된 Terraform 작업이에요. 예를 들어 "plan" 또는 "apply"예요. |
terraform_stack_deployment_name |
작업이 대상인 배포의 이름이에요. |
terraform_stack_id (stack ID) |
작업이 대상인 Stack의 외부 ID예요. |
terraform_stack_name (stack name) |
작업이 대상인 Stack의 이름이에요. |
terraform_project_id (project ID) |
작업이 진행되는 프로젝트의 외부 ID예요. 주어진 프로젝트의 Stack 전반에 걸쳐 같은 역할을 사용하려면 유용해요. |
terraform_project_name (project name) |
작업이 진행되는 프로젝트의 이름이에요. |
terraform_organization_id (organization ID) |
작업이 진행되는 HCP Terraform 조직의 외부 ID예요. 조직이 둘 이상 있을 수 있는 대기업이거나 조직 전체에 걸쳐 같은 역할을 사용하려면 유용해요. |
terraform_organization_name (organization name) |
작업이 진행되는 HCP Terraform 조직의 이름이에요. |
terraform_plan_id (plan ID) |
이 토큰이 생성 또는 적용에 사용되는 plan의 외부 ID예요. 토큰이 어디서 유출됐는지 추적하거나 유출된 특정 토큰을 차단하는 데 사용할 수 있어요. |
예시 (Examples)
다음 예시는 identity_token 블록의 일반적인 사용 사례를 보여줘요.
AWS OIDC 인증 (AWS OIDC authentication)
다음 예시에서 aws ID 토큰은 AWS 워크로드 ID에 대한 대상을 구성해요. production 배포는 identity_token 블록이 생성하는 토큰(identity_token.aws.jwt)을 IAM 역할 ARN과 함께 컴포넌트 구성에 전달해요:
main.tfdeploy.hcl
identity_token "aws" {
audience = ["aws.workload.identity"]
}
deployment "production" {
inputs = {
role_arn = "arn:aws:iam::123456789012:role/my-oidc-role"
aws_token = identity_token.aws.jwt
}
}
컴포넌트 구성에서 생성된 JWT 토큰을 사용해 AWS 프로바이더를 구성할 수 있어요:
main.tfcomponent.hcl
variable "aws_token" {
type = string
ephemeral = true
}
variable "role_arn" {
type = string
sensitive = true
}
provider "aws" "main" {
config {
assume_role_with_web_identity {
role_arn = var.role_arn
web_identity_token = var.aws_token
}
}
}
여러 클라우드 프로바이더 (Multiple cloud providers)
다음 예시에서 별도의 ID 토큰이 aws와 gcp 워크로드 ID에 대한 대상을 구성하고, multi_cloud 배포는 두 JWT 토큰을 각자의 역할 구성과 함께 전달해요:
identity_token "aws" {
audience = ["aws.workload.identity"]
}
identity_token "gcp" {
audience = ["gcp.workload.identity"]
}
deployment "multi_cloud" {
inputs = {
aws_token = identity_token.aws.jwt
gcp_token = identity_token.gcp.jwt
aws_role = "arn:aws:iam::123456789012:role/terraform-role"
gcp_sa = "[email protected]"
}
}