使用 Terraform 为 Vault OIDC 令牌添加 SPIFFE 身份元数据

发布: (2025年12月4日 GMT+8 03:39)
3 min read
原文: Dev.to

Source: Dev.to

Cover image for Enriching Vault OIDC Tokens with SPIFFE Identity Metadata using Terraform

目标

我们希望一个应用(例如 “ChatBot”)能够:

  • 使用 AppRole 方法对 Vault 进行身份验证。
  • 请求一个 OIDC token
  • 获得包含自定义声明(如 spiffe_idbusiness_unitenvironment)的令牌。

第一步:定义身份实体

首先,定义 “谁”。在 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}"
  }
}

第二步:配置 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 绑定到实体

默认情况下,使用 AppRole 登录会为该角色创建一个通用实体。要使用第一步中定义的自定义元数据,需要通过 Entity Alias 将 AppRole 明确绑定到特定实体。

重要提示: 为 AppRole 创建别名时,别名的 name 必须是 Role ID,而不是 Role Name。

# approle.tf

resource "vault_identity_entity_alias" "approle_applications" {
  for_each = local.application_identities_map

  # 关键:使用 role_id,而不是 role_name
  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
}

通过配置通用端点,确保 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
  })
}

第三步:配置 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 trading agents、backtest strategies,并证明其 performance……