10.5. Zero Trust Workload Identity Manager OIDC 联邦


Zero Trust Workload Identity Manager 通过允许 SPIRE 服务器充当 OIDC 供应商来与 OpenID Connect (OIDC) 集成。这可让工作负载从本地 SPIRE 代理请求和接收可验证的 JSON Web Tokens - SPIFFE Verable Identity Documents (JWT-SVID)。然后,外部系统(如云供应商)可以使用 SPIRE 服务器公开的 OIDC 发现端点来检索公钥。

重要

Red Hat OpenShift 的 Zero Trust Workload Identity Manager 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

验证以下供应商以用于 SPIRE OIDC 联邦:

  • Vault
  • Azure Entra ID

10.5.1. 关于 Entra ID OpenID Connect

Entra ID 是一个基于云的身份和访问管理服务,可集中管理和访问控制。Entra ID 充当标识提供程序,验证用户身份以及向应用发布和 ID 令牌。此令牌包括基本的用户信息,允许应用在无需管理用户的凭据的情况下确认用户的身份。

将 Entra ID OpenID Connect (OIDC) 与 SPIRE 集成,提供具有自动、短期加密身份的工作负载。SPIRE 发布的身份被发送到 Entra ID,以在没有静态 secret 的情况下安全地验证服务。

受管路由使用外部 Route 证书功能,将 tls.externalCertificate 字段设置为外部管理的传输层安全 (TLS) secret 名称。

先决条件

  • 已安装 Zero Trust Workload Identity Manager 0.2.0 或更高版本。
  • 您已在集群中部署了 SPIRE Server、SPIRE Agent、SPIFFEE CSI Driver 和 SPIRE OIDC Discovery Provider operands。
  • 您已为 Red Hat OpenShift 安装了 cert-manager Operator。如需更多信息,请参阅为 Red Hat OpenShift 卸载 cert-manager Operator
  • 您已创建了使用一个公共可信 CA 服务配置的 ClusterIssuerIssuer。例如,使用 "Let's Encrypt ACME" 服务的自动证书管理环境 (ACME) 类型 Issuer。如需更多信息,请参阅配置 ACME 签发者

流程

  1. 使用以下命令,创建一个 Role 来提供路由器服务帐户权限来读取引用的 secret:

    $ oc create role secret-reader \
      --verb=get,list,watch \
      --resource=secrets \
      --resource-name=$TLS_SECRET_NAME \
      -n zero-trust-workload-identity-manager
    Copy to Clipboard Toggle word wrap
  2. 使用以下命令,创建一个 RoleBinding 资源,将 router 服务帐户与新创建的 Role 资源绑定:

    $ oc create rolebinding secret-reader-binding \
      --role=secret-reader \
      --serviceaccount=openshift-ingress:router \
      -n zero-trust-workload-identity-manager
    Copy to Clipboard Toggle word wrap
  3. 配置 SpireOIDCDIscoveryProvider 自定义资源(CR) 对象,以引用上一步中生成的 Secret。

    $ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
    spec:
      externalSecretRef: ${TLS_SECRET_NAME}
    '
    Copy to Clipboard Toggle word wrap

验证

  1. SpireOIDCDiscoveryProvider CR 中,检查 ManageRouteReady 条件是否设置为 True

    $ oc wait --for=jsonpath='{.status.conditions[?(@.type=="ManagedRouteReady")].status}'=True SpireOIDCDiscoveryProvider/cluster --timeout=120s
    Copy to Clipboard Toggle word wrap
  2. 验证 OIDC 端点可以通过 HTTPS 安全地访问。

    $ curl https://$JWT_ISSUER_ENDPOINT/.well-known/openid-configuration
    
    {
      "issuer": "https://$JWT_ISSUER_ENDPOINT",
      "jwks_uri": "https://$JWT_ISSUER_ENDPOINT/keys",
      "authorization_endpoint": "",
      "response_types_supported": [
        "id_token"
      ],
      "subject_types_supported": [],
      "id_token_signing_alg_values_supported": [
        "RS256",
        "ES256",
        "ES384"
      ]
    }%
    Copy to Clipboard Toggle word wrap

10.5.2.1. 禁用受管路由

如果要完全控制公开 OIDC Discovery Provider 服务的行为,您可以根据您的要求禁用受管路由。

流程

  • 要手动配置 OIDC Discovery 提供程序,请将 managedRoute 设置为 false

    $ oc patch SpireOIDCDiscoveryProvider cluster --type=merge -p='
    spec:
      managedRoute: "false"
    Copy to Clipboard Toggle word wrap

10.5.3. 在 Microsoft Azure 中使用 Entra ID

完成 Entra ID 配置后,您可以设置 Entra ID 来使用 Azure。

先决条件

  • 您已将 SPIRE OIDC Discovery Provider Route 配置为从公开的 CA 提供 TLS 证书。

10.5.3.1. 配置 Azure 帐户

流程

  1. 运行以下命令来登录到 Azure:

    $ az login
    Copy to Clipboard Toggle word wrap
  2. 为 Azure 订阅和租户配置变量:

    $ export SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv) 
    1
    
    $ export TENANT_ID=$(az account list --query "[?isDefault].tenantId" -o tsv) 
    2
    
    $ export LOCATION=centralus 
    3
    Copy to Clipboard Toggle word wrap
    1
    您的唯一订阅标识符。
    2
    Azure Active Directory 实例的 ID。
    3
    创建资源的 Azure 区域。
  3. 定义资源变量名称。

    $ export NAME=ztwim 
    1
    
    $ export RESOURCE_GROUP="${NAME}-rg" 
    2
    
    $ export STORAGE_ACCOUNT="${NAME}storage" 
    3
    
    $ export STORAGE_CONTAINER="${NAME}storagecontainer" 
    4
    
    $ export USER_ASSIGNED_IDENTITY_NAME="${NAME}-identity" 
    5
    Copy to Clipboard Toggle word wrap
    1
    所有资源的基础名称。
    2
    资源组的名称。
    3
    存储帐户的名称。
    4
    存储容器的名称。
    5
    受管身份的名称。
  4. 创建资源组。

    $ az group create \
      --name "${RESOURCE_GROUP}" \
      --location "${LOCATION}"
    Copy to Clipboard Toggle word wrap

10.5.3.2. 配置 Azure blob 存储

流程

  1. 创建用于存储内容的新存储帐户。

    $ az storage account create \
      --name ${STORAGE_ACCOUNT} \
      --resource-group ${RESOURCE_GROUP} \
      --location ${LOCATION} \
      --encryption-services blob
    Copy to Clipboard Toggle word wrap
  2. 获取新创建的存储帐户的存储 ID。

    $ export STORAGE_ACCOUNT_ID=$(az storage account show -n ${STORAGE_ACCOUNT} -g ${RESOURCE_GROUP} --query id --out tsv)
    Copy to Clipboard Toggle word wrap
  3. 在新创建的存储帐户中创建存储容器,以提供支持 Blob 存储的位置。

    $ az storage container create \
      --account-name ${STORAGE_ACCOUNT} \
      --name ${STORAGE_CONTAINER} \
      --auth-mode login
    Copy to Clipboard Toggle word wrap

10.5.3.3. 配置 Azure 用户管理的身份

流程

  1. 创建一个新的用户管理身份,然后获取与 User Managed Identity 关联的相关服务主体的客户端 ID。

    $ az identity create \
      --name ${USER_ASSIGNED_IDENTITY_NAME} \
      --resource-group ${RESOURCE_GROUP}
    
    $ export IDENTITY_CLIENT_ID=$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)
    Copy to Clipboard Toggle word wrap
  2. 将角色与 User Managed Identity 关联的 Service Principal 关联。

    $ az role assignment create \
      --role "Storage Blob Data Contributor" \
      --assignee "${IDENTITY_CLIENT_ID}" \
      --scope ${STORAGE_ACCOUNT_ID}
    Copy to Clipboard Toggle word wrap

10.5.3.4. 创建演示应用程序

流程

  1. 设置应用程序名称和命名空间。

    $ export APP_NAME=workload-app
    $ export APP_NAMESPACE=demo
    Copy to Clipboard Toggle word wrap
  2. 创建命名空间。

    $ oc create namespace $APP_NAMESPACE
    Copy to Clipboard Toggle word wrap
  3. 创建应用程序 Secret。

    $ oc apply -f - << EOF
    apiVersion: v1
    kind: Secret
    metadata:
      name: $APP_NAME
      namespace: $APP_NAMESPACE
    stringData:
      AAD_AUTHORITY: https://login.microsoftonline.com/
      AZURE_AUDIENCE: "api://AzureADTokenExchange"
      AZURE_TENANT_ID: "${TENANT_ID}"
      AZURE_CLIENT_ID: "${IDENTITY_CLIENT_ID}"
      BLOB_STORE_ACCOUNT: "${STORAGE_ACCOUNT}"
      BLOB_STORE_CONTAINER: "${STORAGE_CONTAINER}"
    EOF
    Copy to Clipboard Toggle word wrap

10.5.3.5. 部署工作负载应用程序

流程

  1. 要部署应用,请复制提供的整个命令块,并将它直接粘贴到终端中。按 Enter 键。

    $ oc apply -f - << EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: $APP_NAME
      namespace: $APP_NAMESPACE
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: $APP_NAME
      namespace: $APP_NAMESPACE
    spec:
      selector:
        matchLabels:
          app: $APP_NAME
      template:
        metadata:
          labels:
            app: $APP_NAME
            deployment: $APP_NAME
        spec:
          serviceAccountName: $APP_NAME
          containers:
            - name: $APP_NAME
              image: "registry.redhat.io/ubi9/python-311:latest"
              command:
                - /bin/bash
                - "-c"
                - |
                  #!/bin/bash
                  pip install spiffe azure-cli
    
                  cat << EOF > /opt/app-root/src/get-spiffe-token.py
                  #!/opt/app-root/bin/python
                  from spiffe import JwtSource
                  import argparse
                  parser = argparse.ArgumentParser(description='Retrieve SPIFFE Token.')
                  parser.add_argument("-a", "--audience", help="The audience to include in the token", required=True)
                  args = parser.parse_args()
                  with JwtSource() as source:
                    jwt_svid = source.fetch_svid(audience={args.audience})
                    print(jwt_svid.token)
                  EOF
    
                  chmod +x /opt/app-root/src/get-spiffe-token.py
                  while true; do sleep 10; done
              envFrom:
              - secretRef:
                  name: $APP_NAME
              env:
                - name: SPIFFE_ENDPOINT_SOCKET
                  value: unix:///run/spire/sockets/spire-agent.sock
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop:
                    - ALL
                readOnlyRootFilesystem: false
                runAsNonRoot: true
                seccompProfile:
                  type: RuntimeDefault
              ports:
                - containerPort: 8080
                  protocol: TCP
              volumeMounts:
                - name: spiffe-workload-api
                  mountPath: /run/spire/sockets
                  readOnly: true
          volumes:
            - name: spiffe-workload-api
              csi:
                driver: csi.spiffe.io
                readOnly: true
    EOF
    Copy to Clipboard Toggle word wrap

验证

  1. 确保 workload-app pod 成功运行。

    $ oc get pods -n $APP_NAMESPACE
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                             READY     STATUS      RESTARTS      AGE
    workload-app-5f8b9d685b-abcde    1/1       Running     0             60s
    Copy to Clipboard Toggle word wrap

  2. 检索 SPIFFE JWT 令牌 (SVID-JWT)

    # Get the pod name dynamically
    $ POD_NAME=$(oc get pods -n $APP_NAMESPACE -l app=$APP_NAME -o jsonpath='{.items[0].metadata.name}')
    
    # Execute the script inside the pod
    $ oc exec -it $POD_NAME -n $APP_NAMESPACE -- \
      /opt/app-root/src/get-spiffe-token.py -a "api://AzureADTokenExchange"
    Copy to Clipboard Toggle word wrap

10.5.3.6. 使用 SPIFFE 身份联邦配置 Azure

流程

  • 整合与工作负载应用程序关联的 User Managed Identity 和 SPIFFE 身份之间的身份。

    $ az identity federated-credential create \
      --name ${NAME} \
      --identity-name ${USER_ASSIGNED_IDENTITY_NAME} \
      --resource-group ${RESOURCE_GROUP} \
      --issuer https://$JWT_ISSUER_ENDPOINT \
      --subject spiffe://$APP_DOMAIN/ns/$APP_NAMESPACE/sa/$APP_NAME \
      --audience api://AzureADTokenExchange
    Copy to Clipboard Toggle word wrap

流程

  1. 从 SPIFFE Workload API 检索 JWT 令牌,并登录到 pod 中包含的 Azure CLI。

    $ oc rsh -n $APP_NAMESPACE deployment/$APP_NAME
    
    $ export TOKEN=$(/opt/app-root/src/get-spiffe-token.py --audience=$AZURE_AUDIENCE)
    $ az login --service-principal \
      -t ${AZURE_TENANT_ID} \
      -u ${AZURE_CLIENT_ID} \
      --federated-token ${TOKEN}
    Copy to Clipboard Toggle word wrap
  2. 使用应用程序工作负载 pod 创建一个新文件,并将该文件上传到 Blob 存储。

    $ echo “Hello from OpenShift” > openshift-spire-federated-identities.txt
    $ az storage blob upload \
      --account-name ${BLOB_STORE_ACCOUNT} \
      --container-name ${BLOB_STORE_CONTAINER} \
      --name openshift-spire-federated-identities.txt \
      --file openshift-spire-federated-identities.txt \
      --auth-mode login
    Copy to Clipboard Toggle word wrap

验证

  • 通过列出包含的文件,确认文件上传成功。

    $ az storage blob list \
      --account-name ${BLOB_STORE_ACCOUNT} \
      --container-name ${BLOB_STORE_CONTAINER} \
      --auth-mode login \
      -o table
    Copy to Clipboard Toggle word wrap

10.5.4. 关于 Vault OpenID Connect

带有 SPIRE 的 vault OpenID Connect (OIDC)会创建一个安全验证方法,其中 Vault 使用 SPIRE 作为可信 OIDC 供应商。工作负载从其本地 SPIRE 代理请求 JWT-SVID,该代理具有唯一的 SPIFFE ID。然后,工作负载向 Vault 提供此令牌,Vault 根据 SPIRE 服务器上的公钥进行验证。如果满足所有条件,Vault 会向工作负载发出简短的 Vault 令牌,可供工作负载用于访问 secret,并在 Vault 中执行操作。

10.5.5. 安装 Vault

在 Vault 用作 OIDC 之前,您需要安装 Vault。

先决条件

  • 配置路由。如需更多信息,请参阅路由配置
  • 已安装 Helm。
  • 用于轻松读取 Vault API 输出的命令行 JSON 处理器。
  • 添加了 HashiCorp Helm 仓库。

流程

  1. 创建 vault-helm-value.yaml 文件。

    global:
      enabled: true
      openshift: true 
    1
    
      tlsDisable: true 
    2
    
    injector:
      enabled: false
    server:
      ui:
        enabled: true
      image:
        repository: docker.io/hashicorp/vault
        tag: "1.19.0"
      dataStorage:
        enabled: true 
    3
    
        size: 1Gi
      standalone:
        enabled: true 
    4
    
        config: |
          listener "tcp" {
            tls_disable = 1 
    5
    
            address = "[::]:8200"
            cluster_address = "[::]:8201"
          }
          storage "file" {
            path = "/vault/data"
          }
      extraEnvironmentVars: {}
    Copy to Clipboard Toggle word wrap
    1
    针对特定于 OpenShift 的安全上下文优化部署。
    2
    为由 chart 创建的 Kubernetes 对象禁用 TLS。
    3
    创建一个 1Gi 持久性卷来存储 Vault 数据。
    4
    部署单个 Vault pod。
    5
    告知 Vault 服务器不使用 TLS。
  2. 运行 helm install 命令:

    $ helm install vault hashicorp/vault \
      --create-namespace -n vault \
      --values ./vault-helm-value.yaml
    Copy to Clipboard Toggle word wrap
  3. 公开 Vault 服务。

    $ oc expose service vault -n vault
    Copy to Clipboard Toggle word wrap
  4. 设置 VAULT_ADDR 环境变量,以从新路由检索主机名,然后导出主机名。

    $ export VAULT_ADDR="http://$(oc get route vault -n vault -o jsonpath='{.spec.host}')"
    Copy to Clipboard Toggle word wrap
    注意

    带有 http:// 前缀,因为 TLS 被禁用。

验证

  • 要确保您的 Vault 实例正在运行,请运行以下命令:

    $ curl -s $VAULT_ADDR/v1/sys/health | jq
    Copy to Clipboard Toggle word wrap

    输出示例

    {
      "initialized": true,
      "sealed": true,
      "standby": true,
      "performance_standby": false,
      "replication_performance_mode": "disabled",
      "replication_dr_mode": "disabled",
      "server_time_utc": 1663786574,
      "version": "1.19.0",
      "cluster_name": "vault-cluster-a1b2c3d4",
      "cluster_id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b"
    }
    Copy to Clipboard Toggle word wrap

10.5.6. 初始化 Vault

新安装的 Vault 已密封。这意味着主加密密钥(保护所有其他加密密钥)不会在启动时加载到服务器内存。您需要初始化 Vault 来取消它。

初始化 Vault 服务器的步骤包括:

  1. 初始化和取消密封 Vault
  2. 启用键值(KV) secret 引擎并存储测试 secret
  3. 使用 SPIRE 配置 JSON Web 令牌(JWT)身份验证
  4. 部署演示应用程序
  5. 验证并检索 secret

先决条件

  • 确保 Vault 正在运行。
  • 确保 Vault 没有初始化。您只能初始化 Vault 服务器一次。

10.5.6.1. 初始化和取消密封 Vault

流程

  1. 打开到 vault pod 的远程 shell:

    $ oc rsh -n vault statefulset/vault
    Copy to Clipboard Toggle word wrap
  2. 初始化 Vault 以获取您的取消密封密钥和 root 令牌:

    $ vault operator init -key-shares=1 -key-threshold=1 -format=json
    Copy to Clipboard Toggle word wrap
  3. 导出之前命令收到的取消密封密钥和 root 令牌:

    $ export UNSEAL_KEY=<Your-Unseal-Key>
    $ export ROOT_TOKEN=<Your-Root-Token>
    Copy to Clipboard Toggle word wrap
  4. 使用您的取消密封密钥取消密封 Vault:

    $ vault operator unseal -format=json $UNSEAL_KEY
    Copy to Clipboard Toggle word wrap
  5. 输入 Exit 退出 pod。

验证

  • 要验证 Vault pod 是否已就绪,请运行以下命令:

    $ oc get pod -n vault
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME        READY        STATUS      RESTARTS     AGE
    vault-0     1/1          Running     0            65d
    Copy to Clipboard Toggle word wrap

10.5.6.2. 启用键值 secret 引擎并存储测试 secret

流程

  1. Vault pod 中打开另一个 shell 会话。

    $ oc rsh -n vault statefulset/vault
    Copy to Clipboard Toggle word wrap
  2. 在此新会话中再次导出 root 令牌并登录:

    $ export ROOT_TOKEN=<Your-Root-Token>
    $ vault login "${ROOT_TOKEN}"
    Copy to Clipboard Toggle word wrap
  3. secret/ 路径中启用 KV secret 引擎并创建测试 secret:

    $ export NAME=ztwim
    $ vault secrets enable -path=secret kv
    $ vault kv put secret/$NAME version=v0.1.0
    Copy to Clipboard Toggle word wrap

验证

  • 要验证 secret 是否已正确存储,请运行以下命令:

    $ vault kv get secret/$NAME
    Copy to Clipboard Toggle word wrap

10.5.6.3. 使用 SPIRE 配置 JSON Web 令牌身份验证

您需要设置 JSON Web Token (JWT)身份验证,以便应用程序可以使用 SPIFFE 身份安全地登录到 Vault。

流程

  1. 在本地机器上,检索 SPIRE 证书颁发机构(CA)捆绑包并将其保存到文件中:

    $ oc get cm -n zero-trust-workload-identity-manager spire-bundle -o jsonpath='{ .data.bundle\.crt }' > oidc_provider_ca.pem
    Copy to Clipboard Toggle word wrap
  2. 返回到 Vault pod shell,创建一个临时文件,并将 oidc_provider_ca.pem 的内容粘贴到其中:

    $ cat << EOF > /tmp/oidc_provider_ca.pem
    -----BEGIN CERTIFICATE-----
    <Paste-Your-Certificate-Content-Here>
    -----END CERTIFICATE-----
    EOF
    Copy to Clipboard Toggle word wrap
  3. 为 JWT 配置设置必要的环境变量:

    $ export APP_DOMAIN=<Your-App-Domain>
    $ export JWT_ISSUER_ENDPOINT="oidc-discovery.$APP_DOMAIN"
    $ export OIDC_URL="https://$JWT_ISSUER_ENDPOINT"
    $ export OIDC_CA_PEM="$(cat /tmp/oidc_provider_ca.pem)"
    Copy to Clipboard Toggle word wrap
  4. 启用 JWT 验证方法并使用您的 OIDC 供应商详情进行配置:

    $ export ROLE="${NAME}-role"
    $ vault auth enable jwt
    $ vault write auth/jwt/config \
      oidc_discovery_url=$OIDC_URL \
      oidc_discovery_ca_pem="$OIDC_CA_PEM" \
      default_role=$ROLE
    Copy to Clipboard Toggle word wrap
  5. 创建名为 ztwim-policy 的策略,其授予对之前创建的 secret 的读取访问权限:

    $ export POLICY="${NAME}-policy"
    $ vault policy write $POLICY -<<EOF
    path "secret/$NAME" {
        capabilities = ["read"]
    }
    EOF
    Copy to Clipboard Toggle word wrap
  6. 创建一个 JWT 角色,将策略绑定到带有特定 SPIFFE ID 的工作负载:

    $ export APP_NAME=client
    $ export APP_NAMESPACE=demo
    $ export AUDIENCE=$APP_NAME
    $ vault write auth/jwt/role/$ROLE -<<EOF
    {
      "role_type": "jwt",
      "user_claim": "sub",
      "bound_audiences": "$AUDIENCE",
      "bound_claims_type": "glob",
      "bound_claims": {
        "sub": "spiffe://$APP_DOMAIN/ns/$APP_NAMESPACE/sa/$APP_NAME"
      },
      "token_ttl": "24h",
      "token_policies": "$POLICY"
    }
    EOF
    Copy to Clipboard Toggle word wrap

10.5.6.4. 部署演示应用程序

这会创建一个简单的客户端应用程序,它使用其 SPIFFE 身份通过 Vault 进行身份验证。

流程

  1. 在本地机器上,为您的应用程序设置环境变量:

    $ export APP_NAME=client
    $ export APP_NAMESPACE=demo
    $ export AUDIENCE=$APP_NAME
    Copy to Clipboard Toggle word wrap
  2. 应用 Kubernetes 清单,为 demo 应用创建命名空间、服务帐户和部署。这个部署挂载 SPIFFE CSI 驱动程序套接字。

    $ oc apply -f - <<EOF
    # ... (paste the full YAML from your provided code here) ...
    EOF
    Copy to Clipboard Toggle word wrap

验证

  • 运行以下命令验证客户端部署是否已就绪:

    $ oc get deploy -n $APP_NAMESPACE
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME             READY        UP-TO-DATE      AVAILABLE     AGE
    frontend-app     2/2          2               2             120d
    backend-api      3/3          3               3             120d
    Copy to Clipboard Toggle word wrap

10.5.6.5. 进行验证并检索 secret

您可以使用 demo app 从 SPIFFE Workload API 获取 JWT 令牌,并使用它来登录 Vault 并检索该 secret。

流程

  1. 在运行的客户端 pod 中运行命令以获取 JWT-SVID:

    $ oc -n $APP_NAMESPACE exec -it $(oc get pod -o=jsonpath='{.items[*].metadata.name}' -l app=$APP_NAME -n $APP_NAMESPACE) \
      -- /opt/spire/bin/spire-agent api fetch jwt \
      -socketPath /run/spire/sockets/spire-agent.sock \
      -audience $AUDIENCE
    Copy to Clipboard Toggle word wrap
  2. 从输出中复制令牌,并将其导出为本地机器中的环境变量:

    $ export IDENTITY_TOKEN=<Your-JWT-Token>
    Copy to Clipboard Toggle word wrap
  3. 使用 curl 将 JWT 令牌发送到 Vault 登录端点,以获取 Vault 客户端令牌:

    $ export ROLE="${NAME}-role"
    $ VAULT_TOKEN=$(curl -s --request POST --data '{ "jwt": "'"${IDENTITY_TOKEN}"'", "role": "'"${ROLE}"'"}' "${VAULT_ADDR}"/v1/auth/jwt/login | jq -r '.auth.client_token')
    Copy to Clipboard Toggle word wrap

验证

  • 使用新获取的 Vault 令牌从 KV 存储读取 secret:

    $ curl -s -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/secret/$NAME | jq
    Copy to Clipboard Toggle word wrap

    您应该在输出中看到 secret 的内容 ("version": "v0.1.0"),确认整个工作流成功

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat