认证方式

不同的组织对安全和身份验证有不同的要求。Vault 通过提供多种身份验证方法来反映这一需求。Spring Cloud Vault 支持令牌和 AppId 身份验证。

令牌身份验证

令牌是 Vault 中身份验证的核心方法。令牌身份验证需要通过配置提供静态令牌。作为备用方案,令牌也可以从 ~/.vault-token 中检索,这是 Vault CLI 用于缓存令牌的默认位置。

令牌身份验证是默认的身份验证方法。如果令牌被未经授权的方泄露,该方将获得对 Vault 的访问权限,并可以访问预期客户端的秘密。
application.yml
spring.cloud.vault:
    authentication: TOKEN
    token: 00000000-0000-0000-0000-000000000000
  • authentication 将此值设置为 TOKEN 可选择令牌身份验证方法

  • token 设置要使用的静态令牌。如果缺少或为空,则会尝试从 ~/.vault-token 中检索令牌。

另请参阅

Vault Agent 身份验证

自 0.11.0 版本以来,Vault 附带了一个 Vault Agent 边车实用程序。Vault Agent 通过其 Auto-Auth 功能实现了 Spring Vault 的 SessionManager 的功能。应用程序可以通过依赖运行在 localhost 上的 Vault Agent 来重用缓存的会话凭据。Spring Vault 可以发送不带 X-Vault-Token 头的请求。禁用 Spring Vault 的身份验证基础设施以禁用客户端身份验证和会话管理。

application.yml
spring.cloud.vault:
    authentication: NONE
  • authentication 将此值设置为 NONE 可禁用 ClientAuthenticationSessionManager

另请参阅:Vault 文档:Agent

AppId 身份验证

Vault 支持 AppId 身份验证,它由两个难以猜测的令牌组成。AppId 默认为静态配置的 spring.application.name。第二个令牌是 UserId,它是由应用程序确定的一部分,通常与运行时环境相关。IP 地址、Mac 地址或 Docker 容器名称都是很好的例子。Spring Cloud Vault Config 支持 IP 地址、Mac 地址和静态 UserId(例如,通过系统属性提供)。IP 和 Mac 地址表示为十六进制编码的 SHA256 哈希值。

基于 IP 地址的 UserId 使用本地主机的 IP 地址。

使用 SHA256 IP 地址 UserId 的 application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: IP_ADDRESS
  • authentication 将此值设置为 APPID 可选择 AppId 身份验证方法

  • app-id-path 设置要使用的 AppId 挂载路径

  • user-id 设置 UserId 方法。可能的值为 IP_ADDRESSMAC_ADDRESS 或实现自定义 AppIdUserIdMechanism 的类名

从命令行生成 IP 地址 UserId 的相应命令是

$ echo -n 192.168.99.1 | sha256sum
包含 echo 的换行符会导致不同的哈希值,因此请务必包含 -n 标志。

基于 Mac 地址的 UserId 从绑定到本地主机的网络设备获取其网络设备。配置还允许指定 network-interface 提示以选择正确的设备。network-interface 的值是可选的,可以是接口名称或接口索引(从 0 开始)。

使用 SHA256 Mac 地址 UserId 的 application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: MAC_ADDRESS
        network-interface: eth0
  • network-interface 设置获取物理地址的网络接口

从命令行生成 IP 地址 UserId 的相应命令是

$ echo -n 0AFEDE1234AC | sha256sum
Mac 地址以大写形式指定,不带冒号。包含 echo 的换行符会导致不同的哈希值,因此请务必包含 -n 标志。

自定义 UserId

UserId 生成是一个开放机制。您可以将 spring.cloud.vault.app-id.user-id 设置为任何字符串,配置的值将用作静态 UserId。

更高级的方法是,您可以将 spring.cloud.vault.app-id.user-id 设置为类名。此类必须位于您的类路径中,并且必须实现 org.springframework.cloud.vault.AppIdUserIdMechanism 接口和 createUserId 方法。每次使用 AppId 进行身份验证以获取令牌时,Spring Cloud Vault 都会通过调用 createUserId 来获取 UserId。

application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: com.examlple.MyUserIdMechanism
MyUserIdMechanism.java
public class MyUserIdMechanism implements AppIdUserIdMechanism {

  @Override
  public String createUserId() {
    String userId = ...
    return userId;
  }
}

AppRole 身份验证

AppRole 旨在用于机器身份验证,类似于已弃用的(自 Vault 0.6.1 起)AppId 身份验证。AppRole 身份验证由两个难以猜测的(秘密)令牌组成:RoleId 和 SecretId。

Spring Vault 支持各种 AppRole 场景(推/拉模式和封装)。

RoleId 和可选的 SecretId 必须通过配置提供,Spring Vault 不会查找这些或创建自定义 SecretId。

具有 AppRole 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: APPROLE
    app-role:
        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

支持以下场景以及所需的配置详细信息

表 1. 配置

方法

RoleId

SecretId

RoleName

令牌

提供 RoleId/SecretId

已提供

已提供

未提供 SecretId 的 RoleId

已提供

提供 RoleId,拉取 SecretId

已提供

已提供

已提供

拉取 RoleId,提供 SecretId

已提供

已提供

已提供

完全拉取模式

已提供

已提供

封装

已提供

封装 RoleId,提供 SecretId

已提供

已提供

提供 RoleId,封装 SecretId

已提供

已提供

表 2. 拉取/推送/封装矩阵

RoleId

SecretId

支持

已提供

已提供

已提供

拉取

已提供

封装

已提供

缺失

拉取

已提供

拉取

拉取

拉取

封装

拉取

缺失

封装

已提供

封装

拉取

封装

封装

封装

缺失

您仍然可以使用推送/拉取/封装模式的所有组合,方法是在上下文中提供一个已配置的 AppRoleAuthentication bean。Spring Cloud Vault 无法从配置属性中导出所有可能的 AppRole 组合。
AppRole 身份验证仅限于使用反应式基础设施的简单拉取模式。尚不支持完全拉取模式。将 Spring Cloud Vault 与 Spring WebFlux 堆栈一起使用会启用 Vault 的反应式自动配置,可以通过设置 spring.cloud.vault.reactive.enabled=false 来禁用。
具有所有 AppRole 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: APPROLE
    app-role:
        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
        secret-id: 1696536f-1976-73b1-b241-0b4213908d39
        role: my-role
        app-role-path: approle
  • role-id 设置 RoleId。

  • secret-id 设置 SecretId。如果 AppRole 配置为不需要 SecretId(参见 bind_secret_id),则可以省略 SecretId。

  • role:设置拉取模式的 AppRole 名称。

  • app-role-path 设置要使用的 AppRole 身份验证挂载路径。

AWS-EC2 身份验证

aws-ec2 身份验证后端为 AWS EC2 实例提供安全的引入机制,允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,此后端不需要首先部署或提供安全敏感凭据(令牌、用户名/密码、客户端证书等)。相反,它将 AWS 视为可信第三方,并使用唯一表示每个 EC2 实例的经过加密签名的动态元数据信息。

使用 AWS-EC2 身份验证的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2

AWS-EC2 身份验证默认启用 nonce,以遵循“首次使用信任”(TOFU) 原则。任何未经授权的方,只要获得了 PKCS#7 身份元数据的访问权限,就可以对 Vault 进行身份验证。

首次登录时,Spring Cloud Vault 会生成一个 nonce,该 nonce 与实例 ID 一起存储在身份验证后端中。重新身份验证需要发送相同的 nonce。任何其他方都没有该 nonce,并且可以在 Vault 中引发警报以进行进一步调查。

nonce 保存在内存中,并在应用程序重新启动时丢失。您可以使用 spring.cloud.vault.aws-ec2.nonce 配置静态 nonce。

AWS-EC2 身份验证角色是可选的,默认为 AMI。您可以通过设置 spring.cloud.vault.aws-ec2.role 属性来配置身份验证角色。

配置了角色的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2
    aws-ec2:
        role: application-server
具有所有 AWS EC2 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2
    aws-ec2:
        role: application-server
        aws-ec2-path: aws-ec2
        identity-document: http://...
        nonce: my-static-nonce
  • authentication 将此值设置为 AWS_EC2 可选择 AWS EC2 身份验证方法

  • role 设置正在尝试登录的角色的名称。

  • aws-ec2-path 设置要使用的 AWS EC2 挂载路径

  • identity-document 设置 PKCS#7 AWS EC2 身份文档的 URL

  • nonce 用于 AWS-EC2 身份验证。空 nonce 默认为 nonce 生成

AWS-IAM 身份验证

aws 后端为 AWS IAM 角色提供安全的身份验证机制,允许根据运行中应用程序的当前 IAM 角色自动对 Vault 进行身份验证。与大多数 Vault 身份验证后端不同,此后端不需要首先部署或提供安全敏感凭据(令牌、用户名/密码、客户端证书等)。相反,它将 AWS 视为可信第三方,并使用调用方使用其 IAM 凭据签名的 4 条信息来验证调用方是否确实在使用该 IAM 角色。

应用程序当前运行的 IAM 角色会自动计算。如果您的应用程序在 AWS ECS 上运行,则应用程序将使用分配给运行中容器的 ECS 任务的 IAM 角色。如果您的应用程序在 EC2 实例之上裸机运行,则使用的 IAM 角色将是分配给 EC2 实例的 IAM 角色。

使用 AWS-IAM 身份验证时,您必须在 Vault 中创建一个角色并将其分配给您的 IAM 角色。空 role 默认为当前 IAM 角色的友好名称。

具有所需 AWS-IAM 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: AWS_IAM
具有所有 AWS-IAM 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: AWS_IAM
    aws-iam:
        region: aws-global
        role: my-dev-role
        aws-path: aws
        server-name: some.server.name
        endpoint-uri: https://sts.eu-central-1.amazonaws.com
  • region 设置 AWS 区域的名称。如果未提供,则区域将由 AWS 默认值确定。

  • role 设置正在尝试登录的角色的名称。这应该绑定到您的 IAM 角色。如果未提供,则当前 IAM 用户的友好名称将用作 Vault 角色。

  • aws-path 设置要使用的 AWS 挂载路径

  • server-name 设置用于 X-Vault-AWS-IAM-Server-ID 标头的值,以防止某些类型的重放攻击。

  • endpoint-uri 设置用于 iam_request_url 参数的 AWS STS API 的值。

AWS-IAM 需要 AWS Java SDK v2 依赖项 (software.amazon.awssdk:auth),因为身份验证实现使用 AWS SDK 类型进行凭据和请求签名。

Azure MSI 身份验证

azure 身份验证后端为 Azure VM 实例提供了安全的引入机制,允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,此后端不需要首先部署或提供安全敏感凭据(令牌、用户名/密码、客户端证书等)。相反,它将 Azure 视为可信第三方,并使用可绑定到 VM 实例的托管服务身份和实例元数据信息。

具有所需 Azure 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: AZURE_MSI
    azure-msi:
        role: my-dev-role
具有所有 Azure 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: AZURE_MSI
    azure-msi:
        role: my-dev-role
        azure-path: azure
        metadata-service: http://169.254.169.254/metadata/instance…
        identity-token-service: http://169.254.169.254/metadata/identity…
  • role 设置正在尝试登录的角色的名称。

  • azure-path 设置要使用的 Azure 挂载路径

  • metadata-service 设置访问实例元数据服务的 URI

  • identity-token-service 设置访问身份令牌服务的 URI

Azure MSI 身份验证从实例元数据服务获取有关虚拟机(订阅 ID、资源组、VM 名称)的环境详细信息。Vault 服务器的资源 ID 默认为 vault.hashicorp.com。要更改此设置,请相应地设置 spring.cloud.vault.azure-msi.identity-token-service

另请参阅

TLS 证书身份验证

cert 身份验证后端允许使用由 CA 签名或自签名的 SSL/TLS 客户端证书进行身份验证。

要启用 cert 身份验证,您需要:

  1. 使用 SSL,请参见Vault 客户端 SSL 配置

  2. 配置一个包含客户端证书和私钥的 Java Keystore

  3. spring.cloud.vault.authentication 设置为 CERT

application.yml
spring.cloud.vault:
    authentication: CERT
    ssl:
        key-store: classpath:keystore.jks
        key-store-password: changeit
        key-store-type: JKS
        cert-auth-path: cert

Cubbyhole 身份验证

Cubbyhole 身份验证使用 Vault 原语提供安全的身份验证工作流。Cubbyhole 身份验证使用令牌作为主要登录方法。临时令牌用于从 Vault 的 Cubbyhole 秘密后端获取第二个登录 VaultToken。登录令牌通常寿命更长,用于与 Vault 交互。登录令牌将从存储在 /cubbyhole/response 的封装响应中检索。

创建封装令牌

令牌创建的响应封装需要 Vault 0.6.0 或更高版本。
创建和存储令牌
$ vault token-create -wrap-ttl="10m"
Key                            Value
---                            -----
wrapping_token:                397ccb93-ff6c-b17b-9389-380b01ca2645
wrapping_token_ttl:            0h10m0s
wrapping_token_creation_time:  2016-09-18 20:29:48.652957077 +0200 CEST
wrapped_accessor:              46b6aebb-187f-932a-26d7-4f3d86a68319
application.yml
spring.cloud.vault:
    authentication: CUBBYHOLE
    token: 397ccb93-ff6c-b17b-9389-380b01ca2645

另请参阅

GCP-GCE 身份验证

gcp 身份验证后端允许通过使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭据登录 Vault。

GCP GCE(Google Compute Engine)身份验证为服务帐户创建 JSON Web 令牌(JWT)形式的签名。计算引擎实例的 JWT 是通过使用实例身份识别从 GCE 元数据服务获取的。此 API 创建一个 JSON Web 令牌,可用于确认实例身份。

与大多数 Vault 身份验证后端不同,此后端不需要首先部署或提供安全敏感凭据(令牌、用户名/密码、客户端证书等)。相反,它将 GCP 视为可信第三方,并使用唯一表示每个 GCP 服务帐户的经过加密签名的动态元数据信息。

具有所需 GCP-GCE 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_GCE
    gcp-gce:
        role: my-dev-role
具有所有 GCP-GCE 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_GCE
    gcp-gce:
        gcp-path: gcp
        role: my-dev-role
        service-account: [email protected]
  • role 设置正在尝试登录的角色的名称。

  • gcp-path 设置要使用的 GCP 挂载路径

  • service-account 允许将服务帐户 ID 覆盖为特定值。默认为 default 服务帐户。

另请参阅

GCP-IAM 身份验证

gcp 身份验证后端允许通过使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭据登录 Vault。

GCP IAM 身份验证为服务帐户创建 JSON Web 令牌 (JWT) 形式的签名。服务帐户的 JWT 是通过调用 GCP IAM 的 projects.serviceAccounts.signJwt API 获取的。调用者通过对 GCP IAM 进行身份验证来证明其身份。此 Vault 后端将 GCP 视为受信任的第三方。

IAM 凭据可以从运行时环境(特别是 GOOGLE_APPLICATION_CREDENTIALS 环境变量)、Google Compute 元数据服务获取,或者作为 JSON 或 base64 编码从外部提供。JSON 是首选形式,因为它包含调用 projects.serviceAccounts.signJwt 所需的项目 ID 和服务帐户标识符。

具有所需 GCP-IAM 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_IAM
    gcp-iam:
        role: my-dev-role
具有所有 GCP-IAM 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_IAM
    gcp-iam:
        credentials:
            location: classpath:credentials.json
            encoded-key: e+KApn0=
        gcp-path: gcp
        jwt-validity: 15m
        project-id: my-project-id
        role: my-dev-role
        service-account-id: [email protected]
  • role 设置正在尝试登录的角色的名称。

  • credentials.location 包含 JSON 格式的 Google 凭据的凭据资源路径。

  • credentials.encoded-key OAuth2 帐户私钥的 base64 编码内容,为 JSON 格式。

  • gcp-path 设置要使用的 GCP 挂载路径

  • jwt-validity 配置 JWT 令牌有效期。默认为 15 分钟。

  • project-id 允许将项目 ID 覆盖为特定值。默认为从获取的凭据中获取的项目 ID。

  • service-account 允许将服务帐户 ID 覆盖为特定值。默认为从获取的凭据中获取的服务帐户。

GCP IAM 身份验证需要 Google Cloud Java SDK 依赖项(com.google.apis:google-api-services-iamcom.google.auth:google-auth-library-oauth2-http),因为身份验证实现使用 Google API 进行凭据和 JWT 签名。

Google 凭据需要 OAuth 2 令牌来维护令牌生命周期。所有 API 都是同步的,因此 GcpIamAuthentication 不支持响应式使用所需的 AuthenticationSteps

另请参阅

GitHub 身份验证

您可以通过提供个人访问令牌使用 GitHub 身份验证对 Vault 进行身份验证。作为备用方案,如果安装并验证了 GitHub CLI,则还可以从其中检索令牌。

application.yml
spring.cloud.vault:
    authentication: GITHUB
    github:
        token: gho_…
  • authentication 将此值设置为 GITHUB 可选择 GitHub 身份验证方法

  • token 设置要使用的静态令牌。如果缺少或为空,并且已安装 GitHub CLI 并进行身份验证,并且通过 spring.cloud.vault.github.allow-cli-token=true 允许访问,则会尝试从 gh auth token 中检索令牌。

  • allow-cli-token 启用回退到 GitHub CLI 以检索令牌。默认禁用以避免意外调用 GitHub CLI。

另请参阅

Kubernetes 身份验证

Kubernetes 身份验证机制(自 Vault 0.8.3 起)允许使用 Kubernetes 服务帐户令牌对 Vault 进行身份验证。身份验证基于角色,角色绑定到服务帐户名称和命名空间。

包含 Pod 服务帐户的 JWT 令牌的文件会自动挂载到 /var/run/secrets/kubernetes.io/serviceaccount/token

具有所有 Kubernetes 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: KUBERNETES
    kubernetes:
        role: my-dev-role
        kubernetes-path: kubernetes
        service-account-token-file: /var/run/secrets/kubernetes.io/serviceaccount/token
  • role 设置角色。

  • kubernetes-path 设置要使用的 Kubernetes 挂载路径。

  • service-account-token-file 设置包含 Kubernetes 服务帐户令牌的文件位置。默认为 /var/run/secrets/kubernetes.io/serviceaccount/token

另请参阅

Pivotal CloudFoundry 身份验证

pcf 身份验证后端为在 Pivotal CloudFoundry 实例中运行的应用程序提供了安全的引入机制,允许自动检索 Vault 令牌。与大多数 Vault 身份验证后端不同,此后端不需要首先部署或提供安全敏感凭据(令牌、用户名/密码、客户端证书等),因为身份提供由 PCF 本身处理。相反,它将 PCF 视为可信第三方,并使用托管实例身份。

具有所需 PCF 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: PCF
    pcf:
        role: my-dev-role
具有所有 PCF 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: PCF
    pcf:
        role: my-dev-role
        pcf-path: path
        instance-certificate: /etc/cf-instance-credentials/instance.crt
        instance-key: /etc/cf-instance-credentials/instance.key
  • role 设置正在尝试登录的角色的名称。

  • pcf-path 设置要使用的 PCF 挂载路径。

  • instance-certificate 设置 PCF 实例身份证书的路径。默认为 ${CF_INSTANCE_CERT} 环境变量。

  • instance-key 设置 PCF 实例身份密钥的路径。默认为 ${CF_INSTANCE_KEY} 环境变量。

PCF 身份验证需要 BouncyCastle (bcpkix-jdk15on) 位于类路径上才能进行 RSA PSS 签名。

ACL 要求

本节解释了 Spring Vault 访问哪些路径,以便您可以根据所需功能派生策略声明。

功能 关联的 HTTP 动词

创建

POST/PUT

读取

GET

更新

POST/PUT

delete

DELETE

列表

LIST (GET)

身份验证

登录:POST auth/$authMethod/login

键值挂载发现

GET sys/internal/ui/mounts/$mountPath

SecretLeaseContainer

SecretLeaseContainer 根据配置的租约端点使用不同的路径。

LeaseEndpoints.Legacy

  • 撤销:PUT sys/revoke

  • 续订:PUT sys/renew

LeaseEndpoints.Leases (SysLeases)

  • 撤销:PUT sys/leases/revoke

  • 续订:PUT sys/leases/renew

会话管理

  • 令牌查找:GET auth/token/lookup-self

  • 续订:POST auth/token/renew-self

  • 撤销:POST auth/token/revoke-self

© . This site is unofficial and not affiliated with VMware.