5. 身份验证方法
不同的组织对安全性和身份验证有不同的要求。 Vault 通过提供多种身份验证方法来反映这一需求。 Spring Cloud Vault 支持 token 和 AppId 认证。
5.1. 令牌身份验证
令牌是 Vault 中身份验证的核心方法。 令牌身份验证要求使用 Bootstrap Application Context 提供静态令牌。
Token authentication 是默认的身份验证方法。 如果令牌被泄露,则意外的一方将获得对 Vault 的访问权限,并可以访问预期客户端的密钥。 |
spring.cloud.vault:
authentication: TOKEN
token: 00000000-0000-0000-0000-000000000000
-
authentication
将此值设置为 Select the Token authentication methodTOKEN
-
token
设置要使用的静态令牌
另请参阅:Vault 文档:令牌
5.2. Vault Agent 身份验证
Vault 从 0.11.0 版本开始随 Vault Agent 一起提供 sidecar 实用程序。Vault Agent 通过其 Auto-Auth 功能实现了 Spring Vault 的功能。
应用程序可以依靠在 上运行的 Vault Agent 来重用缓存的会话凭证。
Spring Vault 可以在没有 Headers 的情况下发送请求。
禁用 Spring Vault 的身份验证基础结构以禁用客户端身份验证和会话管理。SessionManager
localhost
X-Vault-Token
spring.cloud.vault:
authentication: NONE
-
authentication
将此值设置为 Disables 和 。NONE
ClientAuthentication
SessionManager
另请参见:Vault 文档:代理
5.3. AppId 认证
Vault 支持由两个难以猜测的令牌组成的 AppId 身份验证。
AppId 默认为静态配置。
第二个令牌是 UserId,它是由应用程序确定的部分,通常与运行时环境相关。
IP 地址、Mac 地址或 Docker 容器名称就是很好的示例。
Spring Cloud Vault Config 支持 IP 地址、Mac 地址和静态 UserId(例如,通过系统属性提供)。
IP 和 Mac 地址表示为十六进制编码的 SHA256 哈希。spring.application.name
基于 IP 地址的 UserId 使用本地主机的 IP 地址。
spring.cloud.vault:
authentication: APPID
app-id:
user-id: IP_ADDRESS
-
authentication
将此值设置为选择 AppId 身份验证方法APPID
-
app-id-path
设置要使用的 AppId 挂载的路径 -
user-id
设置 UserId 方法。 可能的值包括 ,或实现自定义IP_ADDRESS
MAC_ADDRESS
AppIdUserIdMechanism
从命令行生成 IP 地址 UserId 的相应命令是:
$ echo -n 192.168.99.1 | sha256sum
包括指向不同哈希值的 lead 的换行符,因此请确保包含标志。echo -n |
基于 Mac 地址的 UserId 从 localhost 绑定设备获取其网络设备。
该配置还允许指定 hint 以选择正确的设备。
的值是可选的,可以是接口名称或接口索引(从 0 开始)。network-interface
network-interface
spring.cloud.vault:
authentication: APPID
app-id:
user-id: MAC_ADDRESS
network-interface: eth0
-
network-interface
设置网络接口以获取物理地址
从命令行生成 IP 地址 UserId 的相应命令是:
$ echo -n 0AFEDE1234AC | sha256sum
Mac 地址指定为大写,不带冒号。
包括指向不同哈希值的 lead 的换行符,因此请确保包含标志。echo -n |
5.3.1. 自定义 UserId
UserId 生成是一种开放机制。
您可以设置为任何字符串,配置的值将用作静态 UserId。spring.cloud.vault.app-id.user-id
更高级的方法允许您设置为 classname。
此类必须位于 Classpath 上,并且必须实现接口和方法。
Spring Cloud Vault 将在每次使用 AppId 进行身份验证以获取令牌时通过调用来获取 UserId。spring.cloud.vault.app-id.user-id
org.springframework.cloud.vault.AppIdUserIdMechanism
createUserId
createUserId
spring.cloud.vault:
authentication: APPID
app-id:
user-id: com.examlple.MyUserIdMechanism
public class MyUserIdMechanism implements AppIdUserIdMechanism {
@Override
public String createUserId() {
String userId = ...
return userId;
}
}
5.4. AppRole 身份验证
AppRole 用于机器身份验证,就像已弃用的(自 Vault 0.6.1 起)AppId 身份验证一样。 AppRole 身份验证由两个难以猜测的(秘密)令牌组成:RoleId 和 SecretId。
Spring Vault 支持各种AppRole场景(推/拉模式和包装)。
RoleId和可选的SecretId必须由配置提供,Spring Vault 将不会查找这些或创建自定义SecretId。
spring.cloud.vault:
authentication: APPROLE
app-role:
role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
支持以下方案以及所需的配置详细信息:
方法 |
角色 ID |
SecretId |
角色名称 |
令 牌 |
提供的 RoleId/SecretId |
提供 |
提供 |
||
提供的 RoleId,但不带 SecretId |
提供 |
|||
提供 RoleId,拉取 SecretId |
提供 |
提供 |
提供 |
提供 |
拉取 RoleId,提供的 SecretId |
提供 |
提供 |
提供 |
|
完全拉模式 |
提供 |
提供 |
||
包裹 |
提供 |
|||
包装的 RoleId,提供的 SecretId |
提供 |
提供 |
||
提供的 RoleId,包装的 SecretId |
提供 |
提供 |
角色 ID |
SecretId |
支持 |
提供 |
提供 |
✅ |
提供 |
拉 |
✅ |
提供 |
包裹 |
✅ |
提供 |
缺席 |
✅ |
拉 |
提供 |
✅ |
拉 |
拉 |
✅ |
拉 |
包裹 |
❌ |
拉 |
缺席 |
❌ |
包裹 |
提供 |
✅ |
包裹 |
拉 |
❌ |
包裹 |
包裹 |
✅ |
包裹 |
缺席 |
❌ |
通过在上下文中提供已配置的 Bean,您仍然可以使用推/拉/包装模式的所有组合。
Spring Cloud Vault 无法从配置属性中派生所有可能的AppRole组合。AppRoleAuthentication |
AppRole 身份验证仅限于使用反应式基础设施的简单拉取模式。
尚不支持完全拉取模式。
将 Spring Cloud Vault 与 Spring WebFlux 堆栈一起使用可以启用 Vault 的反应式自动配置,可以通过设置 来禁用。spring.cloud.vault.reactive.enabled=false |
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,则可以省略 SecretId(请参阅 )。bind_secret_id
-
role
:设置拉取模式的 AppRole 名称。 -
app-role-path
设置要使用的 AppRole 身份验证挂载的路径。
5.5. AWS-EC2 身份验证
aws-ec2 auth 后端为 AWS EC2 实例提供了一种安全的引入机制,允许自动检索 Vault 令牌。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感的凭证(令牌、用户名/密码、客户端证书等)。 相反,它将 AWS 视为受信任的第三方,并使用唯一表示每个 EC2 实例的加密签名动态元数据信息。
spring.cloud.vault:
authentication: AWS_EC2
AWS-EC2 身份验证默认使 nonce 遵循首次使用时信任 (TOFU) 原则。 任何获得 PKCS#7 身份元数据访问权限的意外方都可以对 Vault 进行身份验证。
在第一次登录期间, Spring Cloud Vault 会生成一个 nonce,该 nonce 存储在 auth 后端中,与实例 ID 无关。 重新身份验证需要发送相同的 nonce。 任何其他方都没有 nonce,可以在 Vault 中发出提醒以进行进一步调查。
nonce 保存在内存中,并在应用程序重启期间丢失。
您可以使用 .spring.cloud.vault.aws-ec2.nonce
AWS-EC2 身份验证角色是可选的,默认为 AMI。
您可以通过设置属性来配置身份验证角色。spring.cloud.vault.aws-ec2.role
spring.cloud.vault:
authentication: AWS_EC2
aws-ec2:
role: application-server
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 auth 后端
5.6. AWS-IAM 身份验证
aws 后端为 AWS IAM 角色提供安全的身份验证机制,允许根据正在运行的应用程序的当前 IAM 角色对 vault 进行自动身份验证。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感的凭证(令牌、用户名/密码、客户端证书等)。 相反,它将 AWS 视为受信任的第三方,并使用调用方使用其 IAM 凭证签名的 4 条信息来验证调用方是否确实在使用该 IAM 角色。
系统会自动计算应用程序正在运行的当前 IAM 角色。 如果您在 AWS ECS 上运行应用程序,则应用程序将使用分配给正在运行的容器的 ECS 任务的 IAM 角色。 如果您在 EC2 实例上裸运行应用程序,则使用的 IAM 角色将是分配给 EC2 实例的角色。
使用 AWS-IAM 身份验证时,您必须在 Vault 中创建一个角色并将其分配给您的 IAM 角色。
空默认为当前 IAM 角色的友好名称。role
spring.cloud.vault:
authentication: AWS_IAM
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 用户的友好名称将用作文件库角色。 -
aws-path
设置要使用的 AWS 挂载的路径 -
server-name
设置用于 Header 的值,以防止某些类型的重放攻击。X-Vault-AWS-IAM-Server-ID
-
endpoint-uri
设置用于参数的 AWS STS API 的值。iam_request_url
AWS-IAM 需要 AWS Java 开发工具包依赖项 (),因为身份验证实施使用 AWS 开发工具包类型进行凭证和请求签名。com.amazonaws:aws-java-sdk-core
另请参阅:文件库文档:使用 aws auth 后端
5.7. Azure MSI 身份验证
Azure 身份验证后端为 Azure VM 实例提供了一种安全的引入机制,允许自动检索 Vault 令牌。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感的凭证(令牌、用户名/密码、客户端证书等)。 相反,它将 Azure 视为受信任的第三方,并使用可绑定到 VM 实例的托管服务标识和实例元数据信息。
spring.cloud.vault:
authentication: AZURE_MSI
azure-msi:
role: my-dev-role
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 服务器的 Resource Id 默认为 。
要更改此设置,请相应地进行设置。vault.hashicorp.com
spring.cloud.vault.azure-msi.identity-token-service
另请参阅:
5.8. TLS 证书认证
身份验证后端允许使用由 CA 签名或自签名的 SSL/TLS 客户端证书进行身份验证。cert
要启用身份验证,您需要:cert
-
使用 SSL,请参见 Vault 客户端 SSL 配置
-
配置包含客户端证书和私钥的 Java
Keystore
-
将 设置为
spring.cloud.vault.authentication
CERT
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 身份验证
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
spring.cloud.vault:
authentication: CUBBYHOLE
token: 397ccb93-ff6c-b17b-9389-380b01ca2645
另请参阅:
5.10. GCP-GCE 身份验证
gcp auth 后端允许使用现有的 GCP (Google Cloud Platform) IAM 和 GCE 凭证登录 Vault。
GCP GCE (Google Compute Engine) 身份验证以 JSON Web 令牌 (JWT) 的形式为服务帐户创建签名。 Compute Engine 实例的 JWT 是使用实例标识从 GCE 元数据服务获取的。 此 API 创建可用于确认实例身份的 JSON Web 令牌。
与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感的凭证(令牌、用户名/密码、客户端证书等)。 相反,它将 GCP 视为受信任的第三方,并使用唯一表示每个 GCP 服务帐户的加密签名动态元数据信息。
spring.cloud.vault:
authentication: GCP_GCE
gcp-gce:
role: my-dev-role
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
另请参阅:
5.11. GCP-IAM 身份验证
gcp auth 后端允许使用现有的 GCP (Google Cloud Platform) IAM 和 GCE 凭证登录 Vault。
GCP IAM 身份验证以 JSON Web 令牌 (JWT) 的形式为服务帐户创建签名。
服务帐户的 JWT 是通过调用 GCP IAM 的 projects.serviceAccounts.signJwt
API 获取的。调用方对 GCP IAM 进行身份验证,从而证明其身份。
此保险柜后端将 GCP 视为受信任的第三方。
IAM 凭证可以从运行时环境(特别是 GOOGLE_APPLICATION_CREDENTIALS
环境变量)、Google Compute 元数据服务获取,也可以从 e.g. JSON 或 base64 编码的外部提供。
JSON 是首选形式,因为它包含调用 所需的项目 ID 和服务帐户标识符。projects.serviceAccounts.signJwt
spring.cloud.vault:
authentication: GCP_IAM
gcp-iam:
role: my-dev-role
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
JSON 格式的 OAuth2 帐户私钥的 base64 编码内容。 -
gcp-path
设置要使用的 GCP 挂载的路径 -
jwt-validity
配置 JWT 令牌有效性。 默认为 15 分钟。 -
project-id
允许将项目 Id 覆盖为特定值。 默认为获取的凭证中的项目 ID。 -
service-account
允许将服务帐户 ID 覆盖为特定值。 默认为从获取的凭证中的服务帐户。
GCP IAM 身份验证需要 Google Cloud Java SDK 依赖项 ( 和 ),因为身份验证实施使用 Google API 进行凭据和 JWT 签名。com.google.apis:google-api-services-iam
com.google.auth:google-auth-library-oauth2-http
Google 凭据需要 OAuth 2 令牌来维护令牌生命周期。
所有 API 都是同步的,因此不支持反应式使用所需的 API。GcpIamAuthentication AuthenticationSteps |
另请参阅:
5.12. Kubernetes 身份验证
Kubernetes 身份验证机制(自 Vault 0.8.3 起)允许使用 Kubernetes 服务帐户令牌对 Vault 进行身份验证。 身份验证是基于角色的,并且角色绑定到服务帐户名称和命名空间。
包含 Pod 服务帐户的 JWT 令牌的文件会自动挂载到 。/var/run/secrets/kubernetes.io/serviceaccount/token
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
设置 Role (角色)。 -
kubernetes-path
设置要使用的 Kubernetes 挂载的路径。 -
service-account-token-file
设置包含 Kubernetes 服务帐户令牌的文件的位置。 默认为 。/var/run/secrets/kubernetes.io/serviceaccount/token
另请参阅:
5.13. Pivotal CloudFoundry 身份验证
pcf auth 后端为在 Pivotal 的 CloudFoundry 实例中运行的应用程序提供了一种安全的引入机制,允许自动检索 Vault 令牌。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感的凭证(令牌、用户名/密码、客户端证书等),因为身份配置由 PCF 本身处理。 相反,它将 PCF 视为受信任的第三方,并使用托管实例身份。
spring.cloud.vault:
authentication: PCF
pcf:
role: my-dev-role
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 实例身份证书的路径。 默认为 env 变量。${CF_INSTANCE_CERT}
-
instance-key
设置 PCF 实例身份密钥的路径。 默认为 env 变量。${CF_INSTANCE_KEY}
PCF 身份验证要求 BouncyCastle (bcpkix-jdk15on) 位于 RSA PSS 签名的类路径上。 |