使用 Terraform 为 Vault OIDC 令牌添加 SPIFFE 身份元数据
Source: Dev.to

目标
我们希望一个应用(例如 “ChatBot”)能够:
- 使用 AppRole 方法对 Vault 进行身份验证。
- 请求一个 OIDC token。
- 获得包含自定义声明(如
spiffe_id、business_unit、environment)的令牌。
第一步:定义身份实体
首先,定义 “谁”。在 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 = .
}