You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP环境下Vault CSI Provider登录错误求助及Terraform配置疑问

问题分析

错误核心是Vault无法获取GCP服务账号的公钥以验证JWT凭证,导致登录请求失败。常见诱因包括:

  • 用于验证JWT的Vault关联GCP服务账号,缺少获取目标服务账号公钥的权限
  • Vault的GCP Auth后端配置与GCP项目、服务账号信息不匹配
  • 目标服务账号(system:serviceaccount:vault:service-web-app)的IAM权限或身份配置异常
Terraform配置解决方案

以下是覆盖GCP权限配置、Vault GCP Auth后端设置、CSI Provider配置的完整代码示例:

1. 配置GCP服务账号与IAM权限

确保Vault使用的GCP服务账号拥有获取目标服务账号公钥的必要权限:

# 定义Pod使用的目标服务账号
resource "google_service_account" "web_app" {
  account_id   = "service-web-app"
  display_name = "Web App Service Account"
  project      = var.gcp_project_id
}

# 创建自定义IAM角色,包含获取服务账号公钥的权限
resource "google_project_iam_custom_role" "vault_gcp_auth" {
  role_id     = "VaultGcpAuthRole"
  title       = "Vault GCP Auth Role"
  description = "Permits Vault to fetch service account public keys for JWT verification"
  permissions = [
    "iam.serviceAccounts.getPublicKey",
  ]
  project     = var.gcp_project_id
}

# 将自定义角色绑定到Vault使用的GCP服务账号
resource "google_project_iam_member" "vault_auth_binding" {
  project = var.gcp_project_id
  role    = google_project_iam_custom_role.vault_gcp_auth.id
  member  = "serviceAccount:${var.vault_service_account_email}"
}

2. 配置Vault GCP Auth后端

启用GCP Auth后端并创建允许目标服务账号登录的Vault角色:

# 启用Vault GCP Auth后端
resource "vault_auth_backend" "gcp" {
  type = "gcp"
  path = "auth/gcp"
}

# 配置GCP Auth后端的项目与凭证信息
resource "vault_gcp_auth_backend_config" "default" {
  backend         = vault_auth_backend.gcp.path
  credentials     = file(var.gcp_service_account_key_path) # Vault关联的GCP服务账号密钥路径
  project         = var.gcp_project_id
}

# 创建允许web app服务账号登录的Vault角色
resource "vault_gcp_auth_backend_role" "web_app" {
  backend               = vault_auth_backend.gcp.path
  role                  = "web-app-role"
  type                  = "iam"
  bound_service_accounts = [
    google_service_account.web_app.email,
  ]
  token_policies        = ["web-app-secrets-policy"] # 替换为你的密钥访问策略名
}

3. 配置Vault CSI Provider的SecretProviderClass

确保CSI Provider的配置与Vault GCP Auth角色匹配:

resource "kubernetes_manifest" "secret_provider_class" {
  manifest = {
    apiVersion = "secrets-store.csi.x-k8s.io/v1"
    kind       = "SecretProviderClass"
    metadata = {
      name      = "vault-secrets"
      namespace = "vault"
    }
    spec = {
      provider = "vault"
      parameters = {
        vaultAddress          = "https://vault.craft-code.com"
        vaultNamespace        = "vault"
        roleName              = "web-app-role" # 与上述Vault角色名一致
        authType              = "gcp"
        gcpServiceAccountName = "service-web-app" # 目标服务账号名
      }
      secretObjects = [
        {
          secretName = "app-secrets"
          type       = "Opaque"
          data = [
            {
              objectName = "db-password"
              key        = "DB_PASSWORD"
            }
          ]
        }
      ]
    }
  }
}
验证步骤
  1. 应用配置后检查Vault Auth后端状态:
    vault auth list
    vault read auth/gcp/config
    
  2. 手动测试服务账号登录流程:
    # 获取目标服务账号的JWT凭证
    gcloud auth print-identity-token --audiences="vault" --impersonate-service-account=${google_service_account.web_app.email}
    # 使用JWT登录Vault
    vault write auth/gcp/login role=web-app-role jwt=<生成的JWT_TOKEN>
    

内容的提问来源于stack exchange,提问作者wipcrep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:55:17