Terraform을 사용해 Vault OIDC 토큰에 SPIFFE 아이덴티티 메타데이터 추가
Source: Dev.to

목표
우리는 애플리케이션(예: “ChatBot”)이 다음을 수행하도록 하고 싶습니다.
- AppRole 방식을 사용해 Vault에 인증한다.
- OIDC 토큰을 요청한다.
spiffe_id,business_unit,environment와 같은 사용자 정의 클레임을 포함한 토큰을 받는다.
1단계: Identity Entity 정의
먼저 “누구인지”를 정의합니다. Vault에서 Entity는 고유한 정체성을 나타내며, 나중에 토큰에 삽입될 메타데이터를 저장합니다.
# identities.tf
resource "vault_identity_entity" "application" {
for_each = local.application_identities_map
name = each.key
# 이 메타데이터가 나중에 토큰에 삽입될 내용입니다
metadata = {
environment = each.value.identity.environment
business_unit = each.value.identity.business_unit
spiffe_id = "spiffe://vault/application/${each.value.identity.environment}/${each.value.identity.business_unit}/${each.value.identity.name}"
}
}
2단계: AppRole 인증 구성
다음으로 AppRole 인증 백엔드를 구성합니다—머신이 인증하는 표준 방법입니다.
# approle.tf
resource "vault_approle_auth_backend_role" "applications" {
for_each = local.application_identities_map
backend = vault_auth_backend.approle.path
role_name = each.key
token_ttl = 3600
bind_secret_id = true
}
“비밀 양념”: AppRole을 Entity에 바인딩하기
기본적으로 AppRole로 로그인하면 해당 역할에 대한 일반 엔터티가 생성됩니다. 1단계에서 정의한 사용자 정의 메타데이터를 사용하려면 Entity Alias를 통해 AppRole을 특정 Entity에 명시적으로 바인딩해야 합니다.
중요한 주의점: AppRole에 대한 별칭을 만들 때, 별칭의 name은 Role ID여야 하며, Role Name이 아닙니다.
# approle.tf
resource "vault_identity_entity_alias" "approle_applications" {
for_each = local.application_identities_map
# 핵심: role_name이 아니라 role_id를 사용
name = vault_approle_auth_backend_role.applications[each.key].role_id
mount_accessor = vault_auth_backend.approle.accessor
canonical_id = vault_identity_entity.application[each.key].id
}
Entity의 속성을 AppRole이 상속하도록 일반 엔드포인트를 구성합니다:
resource "vault_generic_endpoint" "approle_entity_inherit" {
for_each = local.application_identities_map
depends_on = [vault_approle_auth_backend_role.applications]
path = "auth/approle/role/${each.key}"
data_json = jsonencode({
entity_alias_sole_inherit = true
})
}
3단계: OIDC 템플릿 구성
마지막으로 OIDC 제공자와 역할을 설정합니다. template 필드는 Vault의 템플릿 구문을 사용해 메타데이터를 토큰 페이로드에 삽입합니다.
# identity_tokens.tf
resource "vault_identity_oidc_role" "application_identity" {
name = "application_identity"
key = vault_identity_oidc_key.application_identity.name
client_id = "spiffe://vault.darkedges.au/gateway"
ttl = 86400
# 템플릿: 메타데이터를 JSON 페이로드에 삽입
template = .
}