Spring Cloud Vault Config 为分布式系统中的外部化配置提供客户端支持。 借助HashiCorp 的 Vault,您可以在一个集中位置管理所有环境中应用程序的外部机密属性。 Vault可以管理静态和动态机密,例如远程应用程序/资源的用户名/密码,并为MySQL,PostgreSQL,Apache Cassandra,Couchbase,MongoDB,Consul,AWS等外部服务提供凭据。
1. 新的和值得注意的
本节简要介绍最新版本中新增和值得注意的项目。
1.1. 春季云库 3.0 中的新功能
- 将初始化从Spring Cloud的Bootstrap上下文迁移到Spring Boot的ConfigData API。
PropertySource
- 支持Couchbase 数据库后端。
- 通过/包括 PEM 支持配置密钥库/信任库类型。
spring.cloud.vault.ssl.key-store-type=…
spring.cloud.vault.ssl.trust-store-type=…
- 支持通过配置 a。
ReactiveDiscoveryClient
ReactiveVaultEndpointProvider
- 支持配置多个数据库。
2. 快速入门
先决条件
要开始使用 Vault 和本指南,您需要一个类似 *NIX 的操作系统,该操作系统提供:
-
wget
和openssl
unzip
- 至少是 Java 8 和正确配置的环境变量
JAVA_HOME
本指南从 Spring 云保管库的角度解释了用于集成测试的保管库设置。 您可以直接在 Vault 项目站点上找到入门指南:learn.hashicorp.com/vault |
安装保险柜
这些步骤可以通过下载并运行install_vault.sh来实现。 |
为保险柜创建 SSL 证书
接下来,您需要生成一组证书:
- 根 CA
- 保管库证书(解密的密钥和证书
work/ca/private/localhost.decrypted.key.pem
work/ca/certs/localhost.cert.pem
)
确保将根证书导入到符合 Java 标准的信任库中。
实现此目的的最简单方法是使用 OpenSSL。
create_certificates.sh在 JKS 信任库中创建证书。 如果要使用此快速入门指南运行 Spring Cloud Vault,则需要将信任库的属性配置为。 |
启动保管库服务器
接下来,按照以下行创建一个配置文件:
您可以在vault.conf 上找到一个示例配置文件。 |
保险库开始使用存储侦听。 Vault 是密封的,启动时未初始化。0.0.0.0:8200
inmem
https
如果要运行测试,请将保险柜保留为未初始化状态。 测试将初始化保管库并创建根令牌。 |
如果您想将 Vault 用于您的应用程序或尝试一下,那么您需要先对其进行初始化。
您应该看到类似以下内容:
保管库将初始化并返回一组解封密钥和根令牌。 选择 3 个密钥并解封保管库。 将保管库令牌存储在环境变量中。VAULT_TOKEN
Spring Cloud Vault 访问不同的资源。 默认情况下,启用机密后端,该后端通过 JSON 终结点访问机密配置设置。
HTTP 服务具有以下形式的资源:
其中“应用程序”被注入为the(即常规Spring Boot应用程序中通常是“应用程序”),“profile”是一个活动的配置文件(或逗号分隔的属性列表)。 从 Vault 检索到的属性将“按原样”使用,无需进一步添加属性名称前缀。spring.application.name
SpringApplication
3. 客户端使用
要在应用程序中使用这些功能,只需将其构建为依赖于的 Spring Boot 应用程序(例如,请参阅测试用例)。 示例 Maven 配置:spring-cloud-vault-config
例 1.绒球.xml
然后,您可以创建一个标准的 Spring Boot 应用程序,例如以下简单的 HTTP 服务器:
当它运行时,如果它正在运行,它将从端口上的默认本地 Vault 服务器获取外部配置。 要修改启动行为,您可以使用例如8200
application.properties
例 2.应用程序.yml
-
host
设置库主机的主机名。 主机名将用于 SSL 证书验证 -
port
设置保管库端口 -
scheme
将方案设置为将使用纯 HTTP。 支持的方案是和。http
http
https
-
uri
使用 URI 配置保管库终结点。优先于主机/端口/方案配置 -
connection-timeout
设置连接超时(以毫秒为单位) -
read-timeout
设置读取超时(以毫秒为单位) -
spring.config.import
挂载 Vault asusing 所有已启用的密钥后端(默认启用键值)PropertySource
启用进一步集成需要额外的依赖项和配置。 根据您设置保险柜的方式,您可能需要其他配置,例如SSL和身份验证。
如果应用程序导入项目,则库服务器的状态将通过端点提供。spring-boot-starter-actuator
/health
可以通过属性(默认为)启用或禁用保管库运行状况指示器。management.health.vault.enabled
true
在 Spring Cloud Vault 3.0 和 Spring Boot 2.4 中,不推荐使用属性源的引导上下文初始化 (,)。 相反,Spring Cloud Vault 偏爱 Spring Boot 的 Config Data API,该 API 允许从 Vault 导入配置。使用 Spring 引导配置数据方法,您需要设置属性才能绑定到 Vault。您可以在配置数据位置部分阅读有关它的更多信息。 您可以通过设置配置属性或包含依赖项来启用引导上下文。 |
3.1. 身份验证
保险柜需要身份验证机制来授权客户端请求。
Spring Cloud Vault支持多种身份验证机制,以使用Vault对应用程序进行身份验证。
有关快速入门,请使用保管库初始化打印的根令牌。
例 3.应用程序.yml
仔细考虑您的安全要求。 如果您想快速开始使用 Vault,则可以使用静态令牌身份验证,但静态令牌不会进一步受到保护。 向非预期方披露的任何信息都允许保险柜与关联的令牌角色一起使用。 |
4. 配置数据接口
Spring Boot 从 2.4 版开始提供了一个 ConfigData API,它允许声明配置源并将其作为属性源导入。
Spring Cloud Vault 从 3.0 版开始使用 ConfigData API 将 Vault 的秘密后端挂载为属性源。 在以前的版本中,使用了引导上下文。 ConfigData API 更加灵活,因为它允许指定要导入的配置系统以及导入顺序。
您可以通过设置配置属性或包含依赖项来启用已弃用的引导上下文。 |
4.1. 配置数据位置
您可以通过一个或多个从 Vault 具体化的内容挂载 Vault 配置。 Spring Cloud Vault支持两个配置位置:PropertySource
-
vault://
(默认位置) -
vault:///<context-path>
(上下文位置)
使用默认位置将装载所有已启用的机密后端的属性源。 无需进一步配置,Spring 云保管库将挂载键值后端。 每个激活的配置文件都会在表单后面添加另一个上下文路径。 向类路径中添加更多模块(例如)提供了额外的秘密后端配置选项,如果启用,这些选项将作为属性源进行挂载。/secret/${spring.application.name}
/secret/${spring.application.name}/${profile}
spring-cloud-config-databases
如果要控制从 Vault 挂载的上下文路径,可以使用上下文位置 () 或配置VaultConfigurer。PropertySource
vault:///my/context/path
上下文位置是单独指定和装载的。 Spring Cloud Vault 将每个位置安装为唯一位置。 您可以将默认位置与上下文位置(或其他配置系统)混合使用,以控制属性源的顺序。 如果要禁用默认键值路径计算并自行挂载每个键值后端,则此方法尤其有用。PropertySource
例 4.应用程序.yml
Spring 中的属性名称必须是唯一的,以避免阴影。 如果在不同的上下文路径中使用相同的机密名称,并且希望将这些名称公开为单独的属性,则可以通过向位置添加查询参数来区分它们。Environment
prefix
例 5.应用程序.yml
前缀将按原样添加到保险柜返回的所有媒体资源名称中。如果您希望在前缀和键名称之间用点分隔键名称,请确保在前缀中添加尾随点。 |
4.2. 有条件地启用/禁用保管库配置
在某些情况下,可能需要在没有 Vault 的情况下启动应用程序。您可以通过位置字符串来表示 Vault 配置位置是可选的还是必需的(默认):
-
optional:vault://
(默认位置) -
optional:vault:///<context-path>
(上下文位置)
如果禁用了 Vault 支持,则在应用程序启动期间会跳过可选位置。spring.cloud.vault.enabled=false
无论配置位置是否标记为可选,都跳过找不到的保管库上下文路径(HTTP 状态 404)。如果由于 HTTP 状态 404 而找不到保管库上下文路径,则保管库客户端快速故障允许在启动时失败。 |
4.3. 基础设施定制
Spring Cloud Vault 需要基础结构类才能与 Vault 交互。不使用 ConfigData API(意味着您尚未指定上下文 Vault 路径)时,Spring Cloud Vault 会通过 and 定义其 bean。 Spring 引导在 Spring 上下文可用之前引导应用程序。因此,注册 bean 本身,以便稍后将这些内容传播到应用程序上下文中。spring.config.import=vault://
VaultAutoConfiguration
VaultReactiveAutoConfiguration
VaultConfigDataLoader
您可以通过使用 API 注册自定义实例来自定义 Spring Cloud Vault 使用的基础架构:Bootstrapper
另请参阅自定义要公开为 PropertySource 的机密后端和自定义挂钩的源代码。VaultConfigDataLoader
5. 认证方法
不同的组织对安全性和身份验证有不同的要求。 保险柜通过提供多种身份验证方法来反映这一需求。 Spring Cloud Vault支持令牌和AppId身份验证。
5.1. 令牌身份验证
令牌是保管库中身份验证的核心方法。 令牌身份验证需要使用配置提供静态令牌。 作为回退,还可以检索令牌,这是 Vault CLI 用于缓存令牌的默认位置。~/.vault-token
令牌身份验证是默认的身份验证方法。 如果令牌被泄露,则意外方将获得对保管库的访问权限,并可以访问目标客户端的机密。 |
例 6.应用程序.yml
-
authentication
设置此值以选择令牌身份验证方法TOKEN
-
token
设置要使用的静态令牌。如果缺失或为空,则将尝试从 ~/.vault-token 中检索令牌。
另请参阅:
- 保管库文档:令牌
- 保管库文档:CLI 登录
- 保管库文档:CLI 默认为 ~/.vault-token
5.2. 保险柜代理身份验证
保险柜自 0.11.0 版起随保险柜代理一起提供附属工具。Vault Agent通过其自动身份验证功能实现了Spring Vault的功能。 应用程序可以通过依赖在其上运行的保管库代理来重用缓存的会话凭据。 Spring Vault 可以在没有标头的情况下发送请求。 禁用 Spring Vault 的身份验证基础结构以禁用客户端身份验证和会话管理。SessionManager
localhost
X-Vault-Token
例 7.应用程序.yml
-
authentication
将此值设置为禁用沙。NONE
ClientAuthentication
SessionManager
另请参阅:库文档:代理
5.3. 应用标识身份验证
保险柜支持由两个难以猜测的令牌组成的AppId身份验证。 AppId 默认为静态配置。 第二个令牌是 UserId,它是由应用程序确定的部分,通常与运行时环境相关。 IP 地址、Mac 地址或 Docker 容器名称就是很好的例子。 Spring Cloud Vault Config支持IP地址,Mac地址和静态UserId(例如通过系统属性提供)。 IP 和 Mac 地址表示为十六进制编码的 SHA256 哈希。spring.application.name
基于 IP 地址的用户 ID 使用本地主机的 IP 地址。
例 8.application.yml using SHA256 IP 地址用户 ID
-
authentication
设置此值以选择 AppId 身份验证方法APPID
-
app-id-path
设置要使用的 AppId 装载的路径 -
user-id
设置用户标识方法。 可能的值是,或实现自定义的类名IP_ADDRESS
MAC_ADDRESS
AppIdUserIdMechanism
从命令行生成 IP 地址 UserId 的相应命令是:
包括引线的换行符到不同的哈希值,因此请确保包含标志。 |
基于 Mac 地址的用户 ID 从本地主机绑定设备获取其网络设备。 该配置还允许指定 ahint 以选择正确的设备。 的值是可选的,可以是接口名称或接口索引(从 0 开始)。network-interface
network-interface
例 9.application.yml using SHA256 Mac-Address UserId
-
network-interface
设置网络接口获取物理地址
从命令行生成 IP 地址 UserId 的相应命令是:
Mac 地址指定为大写,不带冒号。 包括引线的换行符到不同的哈希值,因此请确保包含标志。 |
5.3.1. 自定义用户标识
UserId 生成是一种开放机制。 您可以设置为任何字符串,配置的值将用作静态 UserId。spring.cloud.vault.app-id.user-id
更高级的方法允许您设置为类名。 此类必须位于类路径上,并且必须实现接口和方法。 Spring Cloud Vault 每次使用 AppId 进行身份验证时都会通过调用来获取用户 ID,以获取令牌。spring.cloud.vault.app-id.user-id
org.springframework.cloud.vault.AppIdUserIdMechanism
createUserId
createUserId
例 10.应用程序.yml
例 11.我的用户 ID 机制.java
另请参阅:保管库文档:使用应用 ID 身份验证后端
5.4. 应用角色认证
AppRole用于计算机身份验证,例如已弃用的(自 Vault 0.6.1 起)AppId 身份验证。 AppRole 身份验证由两个难以猜测的(机密)令牌组成:RoleId 和 SecretId。
Spring Vault 支持各种 AppRole 场景(推/拉模式和包装)。
RoleId 和可选的 SecretId 必须由配置提供,Spring Vault 不会查找这些或创建自定义 SecretId。
例 12.具有应用角色身份验证属性的应用程序.yml
所需的配置详细信息支持以下方案:
Table 1. Configuration
方法 |
角色标识 |
秘密标识 |
角色名称 |
令 牌 |
提供的 RoleId/SecretId |
提供 |
提供 |
||
提供不带秘密 ID 的角色 ID |
提供 |
|||
提供的角色 ID、拉取秘密 ID |
提供 |
提供 |
提供 |
提供 |
拉取角色 ID,提供机密 ID |
提供 |
提供 |
提供 |
|
全拉模式 |
提供 |
提供 |
||
包裹 |
提供 |
|||
包装的 RoleId,提供 SecretId |
提供 |
提供 |
||
提供的 RoleId,包装的 SecretId |
提供 |
提供 |
Table 2. Pull/Push/Wrapped Matrix
角色标识 |
秘密标识 |
支持 |
提供 |
提供 |
✅ |
提供 |
拉 |
✅ |
提供 |
包裹 |
✅ |
提供 |
缺席 |
✅ |
拉 |
提供 |
✅ |
拉 |
拉 |
✅ |
拉 |
包裹 |
❌ |
拉 |
缺席 |
❌ |
包裹 |
提供 |
✅ |
包裹 |
拉 |
❌ |
包裹 |
包裹 |
✅ |
包裹 |
缺席 |
❌ |
您仍然可以通过在上下文中提供配置的 Bean 来使用推送/拉取/包装模式的所有组合。 Spring 云保管库无法从配置属性派生所有可能的 AppRole 组合。 |
AppRole 身份验证仅限于使用反应式基础结构的简单拉取模式。 尚不支持完全拉取模式。 将Spring Cloud Vault与Spring WebFlux堆栈一起使用可以实现Vault的反应式自动配置,可以通过设置将其禁用。 |
例 13.具有所有应用角色身份验证属性的应用程序.yml
-
role-id
设置角色 ID。 -
secret-id
设置机密 ID。 如果配置了不需要 SecretId 的 AppRole ,则可以省略 SecretId(请参阅)。bind_secret_id
-
role
:设置拉取模式的应用角色名称。 -
app-role-path
设置要使用的应用角色身份验证装载的路径。
另请参阅:保管库文档:使用 AppRole 身份验证后端
5.5. AWS-EC2 身份验证
aws-ec2身份验证后端为 AWS EC2 实例提供了安全的引入机制,允许自动检索文件库令牌。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或预配安全敏感凭据(令牌、用户名/密码、客户端证书等)。 相反,它将 AWS 视为受信任的第三方,并使用唯一表示每个 EC2 实例的加密签名动态元数据信息。
例 14。application.yml using AWS-EC2 身份验证
AWS-EC2 身份验证默认启用随机数以遵循首次使用时信任 (TOFU) 原则。 任何获得 PKCS#7 身份元数据访问权限的意外方都可以针对保险柜进行身份验证。
在首次登录期间,Spring 云保管库会生成一个随机数,该随机数存储在实例 ID 旁边的身份验证后端中。 重新身份验证需要发送相同的随机数。 任何其他方都没有随机数,可以在保险柜中发出警报以进行进一步调查。
随机数保留在内存中,并在应用程序重新启动期间丢失。 您可以使用配置静态随机数。spring.cloud.vault.aws-ec2.nonce
AWS-EC2 身份验证角色是可选的,默认为 AMI。 可以通过设置属性来配置身份验证角色。spring.cloud.vault.aws-ec2.role
例 15。具有已配置角色的应用程序.yml
例 16。具有所有 AWS EC2 身份验证属性的 application.yml
-
authentication
设置此值以选择 AWS EC2 身份验证方法AWS_EC2
-
role
设置尝试登录的角色的名称。 -
aws-ec2-path
设置要使用的 AWS EC2 挂载的路径 -
identity-document
设置 PKCS#7 AWS EC2 身份文档的 URL -
nonce
用于 AWS-EC2 身份验证。 空随机数默认为随机数生成
另请参阅:文件库文档:使用 AWS 身份验证后端
5.6. 亚马逊云数据库身份验证
AWS 后端为AWSIAM 角色提供安全的身份验证机制,允许根据正在运行的应用程序的当前 IAM 角色使用文件库自动进行身份验证。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或预配安全敏感凭据(令牌、用户名/密码、客户端证书等)。 相反,它将 AWS 视为受信任的第三方,并使用调用方使用其 IAM 凭证签名的 4 条信息来验证调用方是否确实在使用该 IAM 角色。
将自动计算运行应用程序的当前 IAM 角色。 如果您在 AWS ECS 上运行应用程序,则应用程序将使用分配给正在运行的容器的 ECS 任务的 IAM 角色。 如果您在 EC2 实例之上裸运行应用程序,则使用的 IAM 角色将是分配给 EC2 实例的角色。
使用 AWS-IAM 身份验证时,您必须在保险柜中创建角色并将其分配给您的 IAM 角色。 空默认为当前 IAM 角色的友好名称。role
例 17.具有必需的 AWS-IAM 身份验证属性的应用程序.yml
例 18。具有所有 AWS-IAM 身份验证属性的 application.yml
-
role
设置尝试登录的角色的名称。 这应该绑定到您的 IAM 角色。 如果未提供,则当前 IAM 用户的友好名称将用作文件库角色。 -
aws-path
设置要使用的 AWS 挂载的路径 -
server-name
设置用于防止某些类型的重播的标头的值。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 身份验证后端
5.7. Azure MSI 身份验证
Azure 身份验证后端为AzureVM 实例提供安全的引入机制,允许自动检索保管库令牌。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或预配安全敏感凭据(令牌、用户名/密码、客户端证书等)。 相反,它将 Azure 视为受信任的第三方,并使用可绑定到 VM 实例的托管服务标识和实例元数据信息。
例 19。具有所需 Azure 身份验证属性的应用程序.yml
例 20。包含所有 Azure 身份验证属性的应用程序.yml
-
role
设置尝试登录的角色的名称。 -
azure-path
设置要使用的 Azure 装载的路径 -
metadata-service
设置访问实例元数据服务的 URI -
identity-token-service
设置访问标识令牌服务的 URI
Azure MSI 身份验证从实例元数据服务获取有关虚拟机的环境详细信息(订阅 ID、资源组、VM 名称)。 库服务器的资源标识缺省值为。 要更改此设置,请相应地设置。vault.hashicorp.com
spring.cloud.vault.azure-msi.identity-token-service
另请参阅:
- 保管库文档:使用 Azure 身份验证后端
- Azure 文档:Azure 实例元数据服务
5.8. TLS 证书认证
后端允许使用由 CA 签名或自签名的 SSL/TLS 客户端证书进行身份验证。cert
要启用身份验证,您需要:cert
- 使用 SSL,请参阅保管库客户端 SSL 配置
- 配置包含客户机证书和私钥的 Java。
Keystore
- 设置对象
spring.cloud.vault.authentication
CERT
例 21.应用程序.yml
另请参阅:保管库文档:使用证书身份验证后端
5.9. 隔间孔身份验证
隔间孔身份验证使用 Vault 原语来提供安全的身份验证工作流。 隔间孔身份验证使用令牌作为主要登录方法。 临时令牌用于从Vault的Cubbyhole秘密后端获取第二个登录VaultToken。 登录令牌的生存期通常较长,用于与保险柜交互。 登录令牌将从存储在的包装响应中检索。/cubbyhole/response
创建包装的令牌
创建令牌的响应包装需要保管库 0.6.0 或更高版本。 |
例 22。创建和存储令牌
例 23.应用程序.yml
另请参阅:
- 保管库文档:令牌
- 保管库文档:隔间机密后端
- 库文档:响应包装
5.10. GCP-GCE 身份验证
gcp身份验证后端允许使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭证登录保险柜。
GCP GCE(Google Compute Engine)身份验证为服务帐户创建JSON Web Token (JWT)形式的签名。 计算引擎实例的 JWT 是使用实例标识从 GCE 元数据服务获取的。 此 API 创建一个可用于确认实例身份的 JSON Web 令牌。
与大多数 Vault 身份验证后端不同,此后端不需要首先部署或预配安全敏感凭据(令牌、用户名/密码、客户端证书等)。 相反,它将 GCP 视为受信任的第三方,并使用唯一表示每个 GCP 服务帐号的加密签名动态元数据信息。
例 24。具有必需的 GCP-GCE 身份验证属性的 application.yml
例 25。具有所有 GCP-GCE 身份验证属性的 application.yml
-
role
设置尝试登录的角色的名称。 -
gcp-path
设置要使用的 GCP 挂载的路径 -
service-account
允许将服务帐户 ID 覆盖为特定值。 默认为服务帐户。default
另请参阅:
- 保险库文档:使用 GCP 身份验证后端
- GCP 文档:验证实例的身份
5.11. GCP-IAM 身份验证
gcp身份验证后端允许使用现有的 GCP(Google Cloud Platform)IAM 和 GCE 凭证登录保险柜。
GCP IAM 身份验证为服务账户创建 JSON Web 令牌 (JWT) 形式的签名。 服务帐户的 JWT 是通过调用 GCP IAM 的projects.serviceAccounts.signJwtAPI 获得的。调用方针对 GCP IAM 进行身份验证,从而证明其身份。 此保险柜后端将 GCP 视为受信任的第三方。
IAM凭证可以从运行时环境获取,特别是GOOGLE_APPLICATION_CREDENTIALS环境变量,Google Compute元数据服务,也可以作为JSON或base64编码的外部提供。 JSON 是首选形式,因为它带有调用所需的项目 ID 和服务帐户标识符。projects.serviceAccounts.signJwt
例 26。具有必需的 GCP-IAM 身份验证属性的应用程序.yml
例 27。具有所有 GCP-IAM 身份验证属性的 application.yml
-
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 都是同步的,因此不支持反应式使用所需的。 |
另请参阅:
- 保险库文档:使用 GCP 身份验证后端
- GCP 文档:projects.serviceAccounts.signJwt
5.12. Kubernetes 身份验证
Kubernetes 身份验证机制(从 Vault 0.8.3 开始)允许使用 Kubernetes 服务帐户令牌向 Vault 进行身份验证。 身份验证基于角色,角色绑定到服务帐户名称和命名空间。
包含容器服务帐户的 JWT 令牌的文件会自动挂载到。/var/run/secrets/kubernetes.io/serviceaccount/token
例 28。application.yml 与所有 Kubernetes 身份验证属性
-
role
设置角色。 -
kubernetes-path
设置要使用的 Kubernetes 挂载路径。 -
service-account-token-file
设置包含 Kubernetes 服务帐户令牌的文件的位置。 默认为。/var/run/secrets/kubernetes.io/serviceaccount/token
另请参阅:
- Vault 文档:Kubernetes
- Kubernetes 文档:为 Pod 配置服务帐户
5.13. 关键云铸造认证
pcf身份验证后端为在 Pivotal 的 CloudFoundry 实例中运行的应用程序提供了一种安全的引入机制,允许自动检索 Vault 令牌。 与大多数 Vault 身份验证后端不同,此后端不需要首先部署或配置安全敏感凭据(令牌、用户名/密码、客户端证书等),因为身份配置由 PCF 本身处理。 相反,它将 PCF 视为受信任的第三方,并使用托管实例标识。
例 29。具有所需 PCF 身份验证属性的应用程序.yml
例 30。具有所有 PCF 身份验证属性的 application.yml
-
role
设置尝试登录的角色的名称。 -
pcf-path
设置要使用的 PCF 安装的路径。 -
instance-certificate
设置 PCF 实例身份证书的路径。 默认 toenv 变量。${CF_INSTANCE_CERT}
-
instance-key
设置 PCF 实例标识密钥的路径。 默认 toenv 变量。${CF_INSTANCE_KEY}
PCF 身份验证要求 BouncyCastle (bcpkix-jdk15on) 位于 RSA PSS 签名的类路径上。 |
另请参阅:保管库文档:使用 pcf 身份验证后端
6. ACL 要求
本节说明 Spring Vault 访问了哪些路径,以便您可以从所需的功能派生策略声明。
能力 |
关联的 HTTP 谓词 |
创造 |
|
读 |
|
更新 |
|
删除 |
|
列表 |
|
另请参阅www.vaultproject.io/guides/identity/policies。
6.1. 身份验证
登录:POST auth/$authMethod/login
6.2. 键值挂载发现
GET sys/internal/ui/mounts/$mountPath
6.3. 秘密租赁容器
SecretLeaseContainer
根据配置的租约端点使用不同的路径。
LeaseEndpoints.Legacy
- 撤销:
PUT sys/revoke
- 更新:
PUT sys/renew
LeaseEndpoints.Leases
(SysLeases
)
- 撤销:
PUT sys/leases/revoke
- 更新:
PUT sys/leases/renew
6.4. 会话管理
- 令牌查找:
GET auth/token/lookup-self
- 更新:
POST auth/token/renew-self
- 撤回:
POST auth/token/revoke-self
7. 秘密后端
7.1. 键值后端
Spring Cloud Vault 支持键值密钥后端,即版本化 (v2) 和未版本化 (v1)。 键值后端允许将任意值存储为键值存储。 单个上下文可以存储一个或多个键值元组。 上下文可以分层组织。 Spring Cloud Vault 自行确定密钥是否正在使用版本控制,并将路径映射到其相应的 URL。 Spring Cloud Vault 允许将应用程序名称和默认上下文名称 () 与活动配置文件结合使用。application
应用程序名称由以下属性确定:
-
spring.cloud.vault.kv.application-name
-
spring.cloud.vault.application-name
-
spring.application.name
配置文件由属性确定:
-
spring.cloud.vault.kv.profiles
-
spring.profiles.active
机密可以通过将其路径添加到应用程序名称(以逗号分隔)来从键值后端内的其他上下文中获取机密。 例如,给定应用程序名称,将使用这些文件夹中的每一个:usefulapp,mysql1,projectx/aws
-
/secret/usefulapp
-
/secret/mysql1
-
/secret/projectx/aws
Spring Cloud Vault 将所有活动配置文件添加到可能的上下文路径列表中。 任何活动配置文件都不会跳过访问具有配置文件名称的上下文。
属性像存储一样公开(即没有其他前缀)。
Spring 云保管库在挂载路径和实际上下文路径之间添加上下文,具体取决于挂载是否使用受版本控制的键值后端。 |
-
enabled
设置此值以禁用机密后端配置用法false
-
backend
设置要使用的密钥挂载的路径 -
default-context
设置所有应用程序使用的上下文名称 -
application-name
重写要在键值后端中使用的应用程序名称 -
profiles
覆盖在键值后端使用的活动配置文件 -
profile-separator
使用配置文件将配置文件名称与属性源中的上下文分开
键值机密后端可以在版本控制 (v2) 和非版本控制 (v1) 模式下运行。 |
另请参阅:
- 保管库文档:使用 KV 机密引擎 - 版本 1(通用机密后端)
- 保管库文档:使用 KV 机密引擎 - 版本 2(版本控制的键值后端)
7.2. 领事
Spring Cloud Vault 可以获取 HashiCorp Consul 的凭据。 领事集成需要依赖性。spring-cloud-vault-config-consul
例 31.绒球.xml
可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.consul.enabled=true
false
spring.cloud.vault.consul.role=…
获取的令牌存储在 中,因此使用 Spring Cloud Consul 可以获取生成的凭据,而无需进一步配置。 您可以通过设置来配置属性名称。spring.cloud.consul.token
spring.cloud.vault.consul.token-property
-
enabled
setting this value to enables the Consul backend config usagetrue
-
role
sets the role name of the Consul role definition -
backend
sets the path of the Consul mount to use -
token-property
sets the property name in which the Consul ACL token is stored
See also: Vault Documentation: Setting up Consul with Vault
7.3. RabbitMQ
Spring Cloud Vault 可以获取 RabbitMQ 的凭证。
RabbitMQ 集成需要依赖性。spring-cloud-vault-config-rabbitmq
例 32.绒球.xml
可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.rabbitmq.enabled=true
false
spring.cloud.vault.rabbitmq.role=…
用户名和密码存储在 并且因此使用 Spring 启动将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.rabbitmq.username
spring.rabbitmq.password
spring.cloud.vault.rabbitmq.username-property
spring.cloud.vault.rabbitmq.password-property
-
enabled
设置此值以启用 RabbitMQ 后端配置用法true
-
role
设置 RabbitMQ 角色定义的角色名称 -
backend
设置要使用的 RabbitMQ 挂载的路径 -
username-property
设置存储 RabbitMQ 用户名的属性名称 -
password-property
设置存储 RabbitMQ 密码的属性名称
另请参阅:Vault 文档:使用 Vault 设置 RabbitMQ
7.4. 亚马逊云服务器
Spring Cloud Vault 可以获取 AWS 的凭证。
AWS 集成需要依赖关系。spring-cloud-vault-config-aws
例 33.绒球.xml
可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.aws=true
false
spring.cloud.vault.aws.role=…
支持的 AWS 凭证类型:
- iam_user(默认值)
- assumed_role (STS)
- federation_token (STS)
访问密钥和私有密钥存储在 and 中。因此,使用Spring Cloud AWS将获取生成的凭据,而无需进一步配置。cloud.aws.credentials.accessKey
cloud.aws.credentials.secretKey
您可以通过设置和来配置属性名称。spring.cloud.vault.aws.access-key-property
spring.cloud.vault.aws.secret-key-property
对于 STS 安全令牌,可以通过设置来配置属性名称。安全令牌存储在(默认值)下。spring.cloud.vault.aws.session-token-key-property
cloud.aws.credentials.sessionToken
示例:iam_user
示例:assumed_role (STS)
-
enabled
设置此值以启用 AWS 后端配置用法true
-
role
设置 AWS 角色定义的角色名称 -
backend
设置要使用的 AWS 挂载的路径 -
access-key-property
设置存储 AWS 访问密钥的属性名称 -
secret-key-property
设置存储 AWS 私有密钥的属性名称 -
session-token-key-property
设置存储 AWS STS 安全令牌的属性名称。 -
credential-type
设置要用于此后端的 AWS 凭证类型。默认为iam_user
-
ttl
使用 or 时设置 STS 令牌的 ttl。默认为保管库角色指定的 ttl。最小/最大值也仅限于 AWS 对 STS 的支持。assumed_role
federation_token
-
role-arn
设置在使用时为文件库角色配置了多个 IAM 角色时要代入的角色。assumed_role
另请参阅:文件库文档:使用文件库设置 AWS
8. 数据库后端
Vault 支持多个数据库机密后端,以根据配置的角色动态生成数据库凭据。 这意味着需要访问数据库的服务不再需要配置凭据:它们可以从 Vault 请求凭据,并使用 Vault 的租赁机制更轻松地滚动密钥。
Spring Cloud Vault 与以下后端集成:
- 数据库
- 阿帕奇·卡桑德拉
- 沙发数据库
- 弹性搜索
- 蒙戈数据库
- MySQL
- PostgreSQL
使用数据库机密后端需要在配置和依赖项中启用后端。spring-cloud-vault-config-databases
Vault 从 0.7.1 开始提供专用的秘密后端,允许通过插件进行数据库集成。 可以通过使用通用数据库后端来使用该特定后端。 确保指定适当的后端路径,例如database
spring.cloud.vault.mysql.role.backend=database
例 34.绒球.xml
启用多个符合 JDBC 的数据库将生成凭证,并默认将它们存储在相同的属性键中,因此需要单独配置 JDBC 密钥的属性名称。 |
8.1. 数据库
Spring Cloud Vault 可以获取www.vaultproject.io/api/secret/databases/index.html 中列出的任何数据库的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.database.enabled=true
false
spring.cloud.vault.database.role=…
虽然数据库后端是通用的,但专门针对JDBC数据库。 用户名和密码可从和属性获得 因此,使用 Spring Boot 将为您获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.cloud.vault.database
spring.datasource.username
spring.datasource.password
DataSource
spring.cloud.vault.database.username-property
spring.cloud.vault.database.password-property
8.2. 多个数据库
有时,单个数据库的凭据是不够的,因为应用程序可能会连接到两个或多个相同类型的数据库。 从版本 3.0.5 开始,Spring Vault 支持在命名空间下配置多个数据库密钥后端。spring.cloud.vault.databases.*
该配置接受多个数据库后端,以将凭据具体化为指定的属性。确保配置和适当。username-property
password-property
-
<name>
数据库配置的描述性名称。 -
<name>.enabled
设置此值以启用数据库后端配置用法true
-
<name>.role
设置数据库角色定义的角色名称 -
<name>.backend
设置要使用的数据库装入的路径 -
<name>.username-property
设置存储数据库用户名的属性名称。请确保使用唯一的属性名称以避免属性阴影。 -
<name>.password-property
设置存储数据库密码的属性名称 请确保使用唯一的属性名称以避免属性阴影。
另请参阅:保管库文档:数据库机密后端
Spring 云保管库不支持获取新凭据并在达到最长租用时间时配置您的凭据。 也就是说,如果 Vault 中的数据库角色设置为这意味着应用程序启动 24 小时后,它无法再向数据库进行身份验证。 |
8.3. 阿帕奇·卡桑德拉
后端已在 Vault 0.7.1 中弃用,建议使用后端并将其挂载为。 |
Spring Cloud Vault 可以获取 Apache Cassandra 的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.cassandra.enabled=true
false
spring.cloud.vault.cassandra.role=…
用户名和密码可从 and 属性获得,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.data.cassandra.username
spring.data.cassandra.password
spring.cloud.vault.cassandra.username-property
spring.cloud.vault.cassandra.password-property
-
enabled
设置此值以启用 Cassandra 后端配置用法true
-
role
设置卡桑德拉角色定义的角色名称 -
backend
设置要使用的卡桑德拉坐骑的路径 -
username-property
设置存储 Cassandra 用户名的属性名称 -
password-property
设置存储 Cassandra 密码的属性名称
另请参阅:Vault 文档:使用 Vault 设置 Apache Cassandra
8.4. 沙发数据库
Spring Cloud Vault 可以获取 Couchbase 的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.couchbase.enabled=true
false
spring.cloud.vault.couchbase.role=…
用户名和密码可从 and 属性获得,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.couchbase.username
spring.couchbase.password
spring.cloud.vault.couchbase.username-property
spring.cloud.vault.couchbase.password-property
-
enabled
设置此值以启用 Couchbase 后端配置使用true
-
role
设置沙发基地角色定义的角色名称 -
backend
设置要使用的沙发底座支架的路径 -
username-property
设置存储 Couchbase 用户名的属性名称 -
password-property
设置存储 Couchbase 密码的属性名称
另请参阅:Couchbase 数据库插件文档
8.5. 弹性搜索
Spring Cloud Vault 可以从 3.0 版本开始获得 Elasticsearch 的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.elasticsearch.enabled=true
false
spring.cloud.vault.elasticsearch.role=…
用户名和密码可从 and 属性获得,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.elasticsearch.rest.username
spring.elasticsearch.rest.password
spring.cloud.vault.elasticsearch.username-property
spring.cloud.vault.elasticsearch.password-property
-
enabled
设置此值以启用 Elasticsearch 数据库后端配置使用true
-
role
设置 Elasticsearch 角色定义的角色名称 -
backend
设置要使用的 Elasticsearch 挂载的路径 -
username-property
设置存储 Elasticsearch 用户名的属性名称 -
password-property
设置存储 Elasticsearch 密码的属性名称
另请参阅:Vault 文档:使用 Vault 设置 Elasticsearch
8.6. 蒙戈数据库
后端已在 Vault 0.7.1 中弃用,建议使用后端并将其挂载为。 |
Spring Cloud Vault 可以获取 MongoDB 的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.mongodb.enabled=true
false
spring.cloud.vault.mongodb.role=…
用户名和密码存储在 并且因此使用 Spring 启动将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.data.mongodb.username
spring.data.mongodb.password
spring.cloud.vault.mongodb.username-property
spring.cloud.vault.mongodb.password-property
-
enabled
设置此值以启用 MongodB 后端配置用法true
-
role
设置 MongoDB 角色定义的角色名称 -
backend
设置要使用的 MongoDB 挂载的路径 -
username-property
设置存储 MongoDB 用户名的属性名称 -
password-property
设置存储 MongoDB 密码的属性名称
另请参阅:Vault 文档:使用 Vault 设置 MongoDB
8.7. MySQL
后端已在 Vault 0.7.1 中弃用,建议使用后端并将其挂载为。 的配置将在将来的版本中删除。 |
Spring Cloud Vault 可以获取 MySQL 的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.mysql.enabled=true
false
spring.cloud.vault.mysql.role=…
用户名和密码可从 and 属性获得,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.datasource.username
spring.datasource.password
spring.cloud.vault.mysql.username-property
spring.cloud.vault.mysql.password-property
-
enabled
设置此值以启用 MySQL 后端配置使用true
-
role
设置 MySQL 角色定义的角色名称 -
backend
设置要使用的 MySQL 挂载的路径 -
username-property
设置存储 MySQL 用户名的属性名称 -
password-property
设置存储 MySQL 密码的属性名称
另请参阅:Vault 文档:使用 Vault 设置 MySQL
8.8. PostgreSQL
后端已在 Vault 0.7.1 中弃用,建议使用后端并将其挂载为。 的配置将在将来的版本中删除。 |
Spring Cloud Vault 可以获取 PostgreSQL 的凭据。 可以通过设置(默认)和提供角色名称来启用集成。spring.cloud.vault.postgresql.enabled=true
false
spring.cloud.vault.postgresql.role=…
用户名和密码可从 and 属性获得,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。 您可以通过设置和来配置属性名称。spring.datasource.username
spring.datasource.password
spring.cloud.vault.postgresql.username-property
spring.cloud.vault.postgresql.password-property
-
enabled
设置此值以启用 PostgreSQL 后端配置用法true
-
role
设置 PostgreSQL 角色定义的角色名称 -
backend
设置要使用的 PostgreSQL 挂载的路径 -
username-property
设置存储 PostgreSQL 用户名的属性名称 -
password-property
设置存储 PostgreSQL 密码的属性名称
另请参阅:Vault 文档:使用 Vault 设置 PostgreSQL