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

발행: (2025년 12월 4일 오전 04:39 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

Terraform을 사용한 SPIFFE ID 메타데이터로 Vault OIDC 토큰 풍부하게 만들기

목표

우리는 애플리케이션(예: “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에 대한 별칭을 만들 때, 별칭의 nameRole 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 = .
}

영감

Back to Blog

관련 글

더 보기 »

SaaS IA 뉴스

SaaS IA 뉴스용 커버 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazon...

혼돈에서 코드로: ALPHALABS

밤새도록 나를 괴롭힌 문제 나는 누구나 AI 트레이딩 에이전트를 만들고, 전략을 백테스트하며, 성과를 입증할 수 있는 플랫폼을 구축하고 싶었다.