5. 认证方式

不同的组织对安全性和认证有不同的要求。 Vault 通过提供多种认证方法来满足这一需求。 Spring Cloud Vault 支持 token 和 AppId 认证。spring-doc.cadn.net.cn

5.1. 基于Tokens的认证

Tokens是Vault中认证的核心方法。 Tokens认证需要使用 启动应用程序上下文 提供一个静态Tokens。spring-doc.cadn.net.cn

Tokens认证是默认的认证方法。 如果Tokens被泄露,未授权方将能够访问Vault,并可访问为指定客户端准备的秘密。
示例 6. application.yml
spring.cloud.vault:
    authentication: TOKEN
    token: 00000000-0000-0000-0000-000000000000

5.2. Vault Agent 认证

Vault 从 0.11.0 版本开始随 Vault Agent 附带一个 sidecar 工具。Vault Agent 通过其 Auto-Auth 功能实现了 Spring Vault 的 SessionManager 功能。 应用程序可以通过依赖于在 localhost 上运行的 Vault Agent 来重用缓存的会话凭据。 Spring Vault 可以在没有 X-Vault-Token 头部的情况下发送请求。 禁用 Spring Vault 的认证基础设施以禁用客户端认证和会话管理。spring-doc.cadn.net.cn

示例 7. application.yml
spring.cloud.vault:
    authentication: NONE
  • authentication 将此值设置为 NONE 会禁用 ClientAuthenticationSessionManagerspring-doc.cadn.net.cn

5.3. 使用AppId进行认证

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

基于IP地址的UserId使用本地主机的IP地址。spring-doc.cadn.net.cn

示例 8. application.yml 使用 SHA256 IP-Address 用户ID
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: IP_ADDRESS

生成IP地址UserId的相应命令是:spring-doc.cadn.net.cn

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

基于MAC地址的UserId会从与本地主机绑定的网络设备获取其网络设备。 The configuration also allows specifying a network-interface hint to pick the right device. The value of network-interface is optional and can be either an interface name or interface index (0-based).spring-doc.cadn.net.cn

示例 9. application.yml 使用基于 SHA256 MAC 地址的 UserId
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: MAC_ADDRESS
        network-interface: eth0

生成IP地址UserId的相应命令是:spring-doc.cadn.net.cn

$ echo -n 0AFEDE1234AC | sha256sum
MAC 地址应使用大写字母表示且不带冒号。 在 echo 中包含换行符会导致哈希值不同,因此请确保包含 -n 标志。

5.3.1. 自定义 UserId

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

一种更高级的方法是将spring.cloud.vault.app-id.user-id设置为一个类名。 该类必须在你的类路径上,并且必须实现org.springframework.cloud.vault.AppIdUserIdMechanism接口和createUserId方法。 Spring Cloud Vault 通过每次使用 AppId 进行身份验证时调用createUserId来获取 UserId,以获取Tokens。spring-doc.cadn.net.cn

例子 10。application.yml
spring.cloud.vault:
    authentication: APPID
    app-id:
        user-id: com.examlple.MyUserIdMechanism
示例 11. MyUserIdMechanism.java
public class MyUserIdMechanism implements AppIdUserIdMechanism {

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

5.4. AppRole 认证

AppRole 用于机器认证,类似于自 Vault 0.6.1 版本起已弃用的 AppId 认证。 AppRole 认证包含两个难以猜测(秘密)的Tokens:RoleId 和 SecretId。spring-doc.cadn.net.cn

Spring Vault 支持多种 AppRole 场景(推送/拉取模式和包装)。spring-doc.cadn.net.cn

RoleId 和可选的 SecretId 必须通过配置提供,Spring Vault 将不会查找这些或创建自定义的 SecretId。spring-doc.cadn.net.cn

示例 12. 包含 AppRole 认证属性的 application.yml
spring.cloud.vault:
    authentication: APPROLE
    app-role:
        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

支持以下场景,所需配置细节如下:spring-doc.cadn.net.cn

表1. 配置

方法spring-doc.cadn.net.cn

角色IDspring-doc.cadn.net.cn

密钥IDspring-doc.cadn.net.cn

角色名称spring-doc.cadn.net.cn

Tokensspring-doc.cadn.net.cn

提供 RoleId/SecretIdspring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供RoleId但未提供SecretIdspring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供 RoleId,拉取 SecretIdspring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

拉取 RoleId,使用提供的 SecretIdspring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

完整拉取模式spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

包装 RoleId,提供 SecretIdspring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供RoleId,包装SecretIdspring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

表2. 拉/推/包装矩阵

角色IDspring-doc.cadn.net.cn

密钥IDspring-doc.cadn.net.cn

支持spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

缺席spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

缺席spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

提供spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

拉动spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

包装spring-doc.cadn.net.cn

缺席spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

您可以使用推送/拉取/包装的所有组合模式,通过在上下文中提供一个已配置的AppRoleAuthentication bean。 Spring Cloud Vault 无法从配置属性中推导出所有可能的 AppRole 组合。
AppRole 认证仅支持使用响应式基础设施的简单拉取模式。 完整拉取模式目前尚未支持。 使用 Spring Cloud Vault 与 Spring WebFlux 栈启用 Vault 的响应式自动配置,可以通过设置 spring.cloud.vault.reactive.enabled=false 来禁用。
示例 13. 包含所有 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

5.5. AWS-EC2 认证

The aws-ec2 认证后端为 AWS EC2 实例提供了一种安全的引入机制,允许自动获取一个 Vault Tokens。 不同于大多数 Vault 认证后端,此后端不需要首先部署或提供安全敏感凭证(如Tokens、用户名/密码、客户端证书等)。 相反,它将 AWS 视作受信任的第三方,并使用能够唯一标识每个 EC2 实例的加密签名动态元数据信息。spring-doc.cadn.net.cn

示例 14. 使用 AWS-EC2 认证的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2

AWS-EC2 认证默认启用 nonce 以遵循首次使用信任 (TOFU) 原则。 任何意外获得 PKCS#7 身份元数据访问权限的方都可对 Vault 进行认证。spring-doc.cadn.net.cn

在首次登录时,Spring Cloud Vault 会生成一个 nonce,并将其存储在与实例 ID 相同的认证后端中。 重新认证需要发送相同的 nonce。 任何其他方如果没有该 nonce,将在 Vault 中引发警报以供进一步调查。spring-doc.cadn.net.cn

Tokens在内存中保存,应用程序重启后会丢失。 您可以使用 spring.cloud.vault.aws-ec2.nonce 配置静态Tokens。spring-doc.cadn.net.cn

AWS-EC2 认证角色是可选的,默认使用 AMI。 您可以通过设置 spring.cloud.vault.aws-ec2.role 属性来配置认证角色。spring-doc.cadn.net.cn

示例 15. 包含配置角色的 application.yml
spring.cloud.vault:
    authentication: AWS_EC2
    aws-ec2:
        role: application-server
示例 16. 包含所有 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

5.6. AWS-IAM 认证

The aws 后端提供了一种基于 AWS IAM 角色的 secure 认证机制,允许应用程序根据其正在运行的当前 IAM 角色自动认证到 vault。 Unlike most Vault 认证后端,此后端不需要首先部署或提供安全敏感的凭据(如 tokens、用户名/密码、客户端证书等)。 Instead,它将 AWS 视为受信任的第三方,并使用由调用方使用其 IAM 凭证签名的4个信息片段来验证调用方确实正在使用该 IAM 角色。spring-doc.cadn.net.cn

应用程序正在运行的当前IAM角色会自动计算。 如果您在AWS ECS上运行应用程序,那么应用程序将使用正在运行容器的ECS任务分配的IAM角色。 如果您直接在EC2实例上运行应用程序,则将使用分配给该EC2实例的IAM角色。spring-doc.cadn.net.cn

当使用 AWS-IAM 认证时,您必须在 Vault 中创建一个角色并将其分配到您的 IAM 角色。 一个空的 role 默认为当前 IAM 角色的友好名称。spring-doc.cadn.net.cn

示例 17. application.yml 中包含所需 AWS-IAM 认证属性
spring.cloud.vault:
    authentication: AWS_IAM
示例 18. 包含所有 AWS-IAM 认证属性的 application.yml
spring.cloud.vault:
    authentication: AWS_IAM
    aws-iam:
        role: my-dev-role
        aws-path: aws
        server-name: some.server.name
        endpoint-uri: https://sts.eu-central-1.amazonaws.com
  • role 设置登录尝试所针对的角色名称。 这应该绑定到您的 IAM 角色。 如果未提供,则使用当前 IAM 用户的友好名称作为 Vault 角色。spring-doc.cadn.net.cn

  • aws-path 设置要使用的 AWS 挂载路径spring-doc.cadn.net.cn

  • server-name 将其设置为用于 X-Vault-AWS-IAM-Server-ID 头部的值,以防止某些类型的重放攻击。spring-doc.cadn.net.cn

  • endpoint-uri 设置用于 iam_request_url 参数的 AWS STS API 使用的值。spring-doc.cadn.net.cn

AWS-IAM 需要 AWS Java SDK 依赖(com.amazonaws:aws-java-sdk-core)作为认证实现,其使用 AWS SDK 类型的凭证和请求签名。spring-doc.cadn.net.cn

5.7. Azure MSI 认证

The azure 认证后端为 Azure VM 实例提供安全的引入机制,允许自动获取一个 Vault Tokens。 与大多数 Vault 认证后端不同,此后端不需要首先部署或提供安全敏感凭据(Tokens、用户名/密码、客户端证书等)。 相反,它将 Azure 视为受信任的第三方,并使用可与 VM 实例绑定的受管理的服务身份和实例元数据信息。spring-doc.cadn.net.cn

示例 19. application.yml 中包含所需 Azure 认证属性
spring.cloud.vault:
    authentication: AZURE_MSI
    azure-msi:
        role: my-dev-role
示例 20. 包含所有 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…

Azure MSI 认证从实例元数据服务获取虚拟机(订阅ID,资源组,VM名称)的环境细节。 Vault 服务器的 Resource Id 默认值为 vault.hashicorp.com。 要更改此设置,请将其设置为 spring.cloud.vault.azure-msi.identity-token-servicespring-doc.cadn.net.cn

5.8. TLS 证书认证

The cert 认证后端允许使用通过CA签名或自签名的SSL/TLS客户端证书进行认证。spring-doc.cadn.net.cn

To enable cert 认证您需要:spring-doc.cadn.net.cn

  1. 使用 SSL,参见 Vault 客户端 SSL 配置spring-doc.cadn.net.cn

  2. 配置一个包含客户端证书和私钥的Java Keystorespring-doc.cadn.net.cn

  3. 设置 spring.cloud.vault.authenticationCERTspring-doc.cadn.net.cn

示例 21。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

5.9. 劣洞盒认证

Cubbyhole 认证使用 Vault 原始组件来提供一个安全的认证流程。 Cubbyhole 认证使用Tokens作为主要的登录方法。 使用一个临时Tokens来从 Vault 的 Cubbyhole 秘密后端获取第二个登录 VaultToken。 登录Tokens通常生命周期更长,用于与 Vault 交互。 登录Tokens将从存储在 /cubbyhole/response 的包装响应中获取。spring-doc.cadn.net.cn

创建一个包装的Tokensspring-doc.cadn.net.cn

创建Tokens的响应包装需要 Vault 0.6.0 或更高版本。
示例 22. 创建和存储Tokens
$ 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
示例 23. application.yml
spring.cloud.vault:
    authentication: CUBBYHOLE
    token: 397ccb93-ff6c-b17b-9389-380b01ca2645

5.10. GCP-GCE 认证

The gcp auth backend allows Vault login by using existing GCP (Google Cloud Platform) IAM and GCE credentials.spring-doc.cadn.net.cn

GCP GCE (Google Compute Engine) 认证会为服务账户生成一种 JSON Web Token (JWT) 签ature。 通过使用 实例标识 从 GCE 元数据服务获取 Compute Engine 实例的 JWT。 此 API 会创建可用于确认实例身份的 JSON Web Token。spring-doc.cadn.net.cn

不同于大多数 Vault 认证后端,此后端不需要首先部署或提供安全敏感凭证(如 tokens、用户名/密码、客户端证书等)。 相反,它将 GCP 视为受信任的第三方,并使用能够唯一标识每个 GCP 服务账户的加密签名动态元数据信息。spring-doc.cadn.net.cn

示例 24. 包含所需 GCP-GCE 认证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_GCE
    gcp-gce:
        role: my-dev-role
示例 25. 包含所有 GCP-GCE 认证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_GCE
    gcp-gce:
        gcp-path: gcp
        role: my-dev-role
        service-account: [email protected]

5.11. GCP-IAM 认证

The gcp auth backend allows Vault login by using existing GCP (Google Cloud Platform) IAM and GCE credentials.spring-doc.cadn.net.cn

GCP IAM 身份验证会为服务帐户创建一个 JSON Web Tokens(JWT)签名。通过调用 GCP IAM 的 projects.serviceAccounts.signJwt API 获取服务帐户的 JWT。调用方对 GCP IAM 进行身份验证,并证明其身份。此 Vault 后端将 GCP 视为可信第三方。spring-doc.cadn.net.cn

身份验证凭据可从运行时环境获取,具体为GOOGLE_APPLICATION_CREDENTIALS环境变量、Google 计算元数据服务或作为外部提供(例如JSON或base64编码)。
推荐使用JSON格式,因为它包含了调用projects.serviceAccounts.signJwt所需的项目ID和服务帐户标识符。spring-doc.cadn.net.cn

示例 26。包含必需的 GCP-IAM 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: GCP_IAM
    gcp-iam:
        role: my-dev-role
示例 27. 包含所有 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]

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

Google凭据需要维护Tokens生命周期的OAuth 2Tokens。

spring-doc.cadn.net.cn

所有API都是同步的,因此GcpIamAuthentication不支持AuthenticationSteps,而后者是响应式使用所必需的。spring-doc.cadn.net.cn

5.12. Kubernetes 认证

Kubernetes 认证机制(自 Vault 0.8.3 版本起)允许使用 Kubernetes 服务账户Tokens对 Vault 进行认证。该认证是基于角色的,角色与服务账户名称和命名空间相关联。spring-doc.cadn.net.cn

包含Pod服务账户的JWTTokens的文件会自动挂载到/var/run/secrets/kubernetes.io/serviceaccount/tokenspring-doc.cadn.net.cn

示例28. 包含所有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

5.13. Pivotal CloudFoundry 认证

pcf认证后端为运行在Pivotal CloudFoundry实例内的应用程序提供了一种安全的引入机制,允许自动获取VaultTokens。
与大多数Vault认证后端不同的是,此后端不需要先部署或配置安全性敏感的凭据(如Tokens、用户名/密码、客户端证书等),因为身份配置由PCF自身处理。
相反,它将PCF视为可信第三方,并使用托管实例身份。spring-doc.cadn.net.cn

示例 29. 包含必需的 PCF 身份验证属性的 application.yml
spring.cloud.vault:
    authentication: PCF
    pcf:
        role: my-dev-role
示例 30. 包含所有 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
PCF身份验证需要将BouncyCastle(bcpkix-jdk15on)放在类路径中,以便进行RSA PSS签名。