© 2016-2021 原作者。
| 您可以复制本文档供您自己使用或分发给其他人,前提是您不收取此类副本的任何费用,并且每份副本都包含本版权声明,无论是以印刷版还是电子版形式分发。 |
Spring Cloud Vault Config 为分布式系统中的外部化配置提供客户端支持。借助HashiCorp 的 Vault,您可以在一个中心位置来管理所有环境中应用程序的外部秘密属性。Vault 可以管理静态和动态机密,例如远程应用程序/资源的用户名/密码,并为外部服务(例如 MySQL、PostgreSQL、Apache Cassandra、Couchbase、MongoDB、Consul、AWS 等)提供凭据。
1. 新的和值得注意的
本节简要介绍最新版本中的新增内容和值得注意的内容。
1.1. Spring Cloud Vault 3.0 中的新增功能
-
将
PropertySource初始化从 Spring Cloud 的 Bootstrap Context 迁移到 Spring Boot 的ConfigData API。 -
支持Couchbase 数据库后端。
-
spring.cloud.vault.ssl.key-store-type=…通过/包括 PEM 支持配置密钥库/信任库类型spring.cloud.vault.ssl.trust-store-type=…。 -
ReactiveDiscoveryClient通过配置ReactiveVaultEndpointProvider. -
支持配置多个数据库。
2. 快速入门
先决条件
要开始使用 Vault 和本指南,您需要一个类似 *NIX 的操作系统,该操作系统提供:
-
wget,openssl和unzip -
至少 Java 8 和正确配置的
JAVA_HOME环境变量
| 本指南从 Spring Cloud Vault 角度解释了用于集成测试的 Vault 设置。您可以直接在 Vault 项目网站上找到入门指南:learn.hashicorp.com/vault |
安装保管库
$ wget https://releases.hashicorp.com/vault/${vault_version}/vault_${vault_version}_${platform}.zip
$ unzip vault_${vault_version}_${platform}.zip
这些步骤可以通过下载并运行来实现install_vault.sh。
|
为 Vault 创建 SSL 证书
接下来,您需要生成一组证书:
-
根CA
-
Vault 证书(解密密钥
work/ca/private/localhost.decrypted.key.pem和证书work/ca/certs/localhost.cert.pem)
确保将根证书导入到 Java 兼容的信任库中。
实现此目的最简单的方法是使用 OpenSSL。
create_certificates.shwork/ca在和 JKS 信任库中创建证书work/keystore.jks。如果您想使用本快速入门指南运行 Spring Cloud Vault,您需要将信任库属性配置spring.cloud.vault.ssl.trust-store为file:work/keystore.jks。
|
启动保管库服务器
接下来创建一个配置文件,内容如下:
backend "inmem" {
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "work/ca/certs/localhost.cert.pem"
tls_key_file = "work/ca/private/localhost.decrypted.key.pem"
}
disable_mlock = true
您可以在 找到示例配置文件 vault.conf。
|
$ vault server -config=vault.conf
Vault 已开始侦听0.0.0.0:8200使用inmem存储和https. Vault 是密封的,启动时未初始化。
如果您想运行测试,请保持 Vault 未初始化。测试将初始化 Vault 并创建根令牌00000000-0000-0000-0000-000000000000。
|
如果您想在您的应用程序中使用 Vault 或尝试一下,那么您需要首先对其进行初始化。
$ export VAULT_ADDR="https://localhost:8200"
$ export VAULT_SKIP_VERIFY=true # Don't do this for production
$ vault operator init
您应该看到类似以下内容:
Key 1: 7149c6a2e16b8833f6eb1e76df03e47f6113a3288b3093faf5033d44f0e70fe701
Key 2: 901c534c7988c18c20435a85213c683bdcf0efcd82e38e2893779f152978c18c02
Key 3: 03ff3948575b1165a20c20ee7c3e6edf04f4cdbe0e82dbff5be49c63f98bc03a03
Key 4: 216ae5cc3ddaf93ceb8e1d15bb9fc3176653f5b738f5f3d1ee00cd7dccbe926e04
Key 5: b2898fc8130929d569c1677ee69dc5f3be57d7c4b494a6062693ce0b1c4d93d805
Initial Root Token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
Vault initialized with 5 keys and a key threshold of 3. Please
securely distribute the above keys. When the Vault is re-sealed,
restarted, or stopped, you must provide at least 3 of these keys
to unseal it again.
Vault does not store the master key. Without at least 3 keys,
your Vault will remain permanently sealed.
Vault 将初始化并返回一组开封密钥和根令牌。选择 3 把钥匙并打开金库的封印。将 Vault 令牌存储在VAULT_TOKEN
环境变量中。
$ vault operator unseal (Key 1)
$ vault operator unseal (Key 2)
$ vault operator unseal (Key 3)
$ export VAULT_TOKEN=(Root token)
# Required to run Spring Cloud Vault tests after manual initialization
$ vault token create -id="00000000-0000-0000-0000-000000000000" -policy="root"
Spring Cloud Vault 访问不同的资源。默认情况下,启用秘密后端,通过 JSON 端点访问秘密配置设置。
HTTP 服务具有以下形式的资源:
/secret/{application}/{profile}
/secret/{application}
/secret/{defaultContext}/{profile}
/secret/{defaultContext}
其中“应用程序”被注入(spring.application.name即
SpringApplication常规 Spring Boot 应用程序中通常是“应用程序”),“配置文件”是活动配置文件(或逗号分隔的属性列表)。从 Vault 检索的属性将“按原样”使用,无需进一步添加属性名称前缀。
3. 客户端使用
要在应用程序中使用这些功能,只需将其构建为依赖的 Spring Boot 应用程序spring-cloud-vault-config(例如,请参阅测试用例)。Maven 配置示例:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- repositories also needed for snapshots and milestones -->
然后你可以创建一个标准的 Spring Boot 应用程序,就像这个简单的 HTTP 服务器:
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
8200当它运行时,如果它正在运行,它将从端口上的默认本地 Vault 服务器获取外部配置。application.properties要修改启动行为,您可以使用以下命令更改 Vault 服务器的位置:
spring.cloud.vault:
host: localhost
port: 8200
scheme: https
uri: https://localhost:8200
connection-timeout: 5000
read-timeout: 15000
config:
spring.config.import: vault://
-
host设置 Vault 主机的主机名。主机名将用于 SSL 证书验证 -
port设置 Vault 端口 -
scheme将方案设置为http将使用纯 HTTP。支持的方案有http和https。 -
uri使用 URI 配置 Vault 端点。优先于主机/端口/方案配置 -
connection-timeout设置连接超时(以毫秒为单位) -
read-timeout设置读取超时(以毫秒为单位) -
spring.config.import将 Vault 安装为PropertySource使用所有启用的秘密后端(默认启用键值)
如果应用程序导入spring-boot-starter-actuator项目,则可以通过端点获取 Vault 服务器的状态/health。
可以通过属性启用或禁用保管库运行状况指示器management.health.vault.enabled(默认为true)。
在 Spring Cloud Vault 3.0 和 Spring Boot 2.4 中,属性源的引导上下文初始化 ( bootstrap.yml、bootstrap.properties) 已被弃用。相反,Spring Cloud Vault 支持 Spring Boot 的配置数据 API,它允许从 Vault 导入配置。使用 Spring Boot 配置数据方法,您需要设置属性spring.config.import才能绑定到 Vault。您可以在配置数据位置部分阅读更多相关信息。您可以通过设置配置属性spring.cloud.bootstrap.enabled=true或包含依赖项来启用引导上下文org.springframework.cloud:spring-cloud-starter-bootstrap。
|
3.1. 验证
Spring Cloud Vault 支持多种身份验证机制来使用 Vault 对应用程序进行身份验证。
为了快速入门,请使用Vault 初始化打印的根令牌。
spring.cloud.vault:
token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
spring.config.import: vault://
| 仔细考虑您的安全要求。如果您想快速开始使用 Vault,静态令牌身份验证就很好,但静态令牌不会受到进一步的保护。任何向非预期方的披露都会允许 Vault 与关联的代币角色一起使用。 |
4. 配置数据接口
Spring Boot 从 2.4 版开始提供了 ConfigData API,它允许声明配置源并将其作为属性源导入。
Spring Cloud Vault 从版本 3.0 开始使用 ConfigData API 将 Vault 的秘密后端挂载为属性源。在以前的版本中,使用了 Bootstrap 上下文。ConfigData API 更加灵活,因为它允许指定要导入的配置系统以及导入顺序。
您可以通过设置配置属性spring.cloud.bootstrap.enabled=true或包含依赖项来启用引导上下文org.springframework.cloud:spring-cloud-starter-bootstrap。使用 boostrap 上下文应该很少需要,因此我们建议使用配置数据 API,以获得有关属性源排序的更大灵活性。
|
4.1. 配置数据位置
PropertySource您可以通过从 Vault 实现的一项或多项配置来安装 Vault 配置。Spring Cloud Vault 支持两个配置位置:
-
vault://(默认位置) -
vault:///<context-path>(上下文位置)
使用默认位置安装所有启用的Secret Backends 的属性源。无需进一步配置,Spring Cloud Vault 就会将键值后端安装在/secret/${spring.application.name}. 每个激活的配置文件都会在表单后添加另一个上下文路径/secret/${spring.application.name}/${profile}。将更多模块添加到类路径中,例如spring-cloud-config-databases,提供了额外的秘密后端配置选项,如果启用,这些选项将作为属性源安装。
如果您想要控制从 Vault 装载哪些上下文路径PropertySource,您可以使用上下文位置 ( vault:///my/context/path) 或配置VaultConfigurer.
上下文位置是单独指定和安装的。Spring Cloud Vault 将每个位置安装为唯一的PropertySource. 您可以将默认位置与上下文位置(或其他配置系统)混合以控制属性源的顺序。如果您想禁用默认键值路径计算并自己挂载每个键值后端,则此方法特别有用。
spring.config.import: vault://first/context/path, vault://other/path, vault://
Spring 中的属性名称Environment必须是唯一的以避免重影。prefix如果您在不同的上下文路径中使用相同的秘密名称,并且希望将它们公开为单独的属性,您可以通过向该位置添加查询参数来区分它们。
spring.config.import: vault://my/path?prefix=foo., vault://my/other/path?prefix=bar.
secret: ${foo.secret}
other.secret: ${bar.secret}
| 前缀按原样添加到 Vault 返回的所有属性名称中。如果您希望键名在前缀和键名之间用点分隔,请确保在前缀后添加一个点。 |
4.2. 有条件地启用/禁用 Vault 配置
在某些情况下,可能需要在没有 Vault 的情况下启动应用程序。您可以通过位置字符串表示 Vault 配置位置是可选的还是强制的(默认):
-
optional:vault://(默认位置) -
optional:vault:///<context-path>(上下文位置)
如果通过 禁用 Vault 支持,则在应用程序启动期间会跳过可选位置spring.cloud.vault.enabled=false。
| 无论配置位置是否标记为可选,都会跳过找不到的保管库上下文路径(HTTP 状态 404)。如果由于 HTTP 状态 404 而无法找到 Vault 上下文路径,则 Vault 客户端快速失败允许在启动时失败。 |
4.3. 基础设施定制
Spring Cloud Vault 需要基础设施类才能与 Vault 交互。当不使用 ConfigData API 时(意味着您没有指定spring.config.import=vault://上下文 Vault 路径),Spring Cloud Vault 通过VaultAutoConfiguration和定义其 bean VaultReactiveAutoConfiguration。Spring Boot 在 Spring Context 可用之前引导应用程序。因此VaultConfigDataLoader注册 bean 本身以便稍后将它们传播到应用程序上下文中。
您可以通过使用 API 注册自定义实例来自定义 Spring Cloud Vault 使用的基础架构Bootstrapper:
ClientHttpRequestFactoryClientOptions options = new ClientOptions();
SslConfiguration sslConfiguration = SslConfiguration.unconfigured();
HttpClientBuilder builder = HttpComponents.getHttpClientBuilder(options, sslConfiguration);
InstanceSupplier<ClientFactoryWrapper> supplier = context ->
new ClientFactoryWrapper(new HttpComponentsClientHttpRequestFactory(builder.build()));
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(ClientFactoryWrapper.class, supplier));
RestTemplateBuilderInstanceSupplier<RestTemplateBuilder> supplier = context -> {
return RestTemplateBuilder
.builder()
.requestFactory(context.get(ClientFactoryWrapper.class).getClientHttpRequestFactory())
.defaultHeader("X-Vault-Namespace", "my-namespace");
};
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(RestTemplateBuilder.class, supplier));
另请参阅自定义要公开为 PropertySource 的秘密后端VaultConfigDataLoader以及自定义挂钩的源。
5. 认证方式
不同的组织对安全和身份验证有不同的要求。Vault 通过提供多种身份验证方法来反映这一需求。Spring Cloud Vault 支持 token 和 AppId 身份验证。
5.1. 令牌认证
令牌是 Vault 内进行身份验证的核心方法。令牌身份验证需要使用配置提供静态令牌。~/.vault-token作为后备方案,还可以从Vault CLI 用于缓存令牌的默认位置检索令牌。
| 令牌身份验证是默认的身份验证方法。如果令牌被泄露,非预期方将获得对 Vault 的访问权限,并可以访问预期客户的机密。 |
spring.cloud.vault:
authentication: TOKEN
token: 00000000-0000-0000-0000-000000000000
-
authentication设置此值以TOKEN选择Token身份验证方法 -
token设置要使用的静态令牌。如果丢失或为空,则将尝试从 ~/.vault-token 检索令牌。
也可以看看:
5.2. Vault 代理身份验证
自版本 0.11.0 起,Vault 随 Vault Agent 一起提供了 sidecar 实用程序。SessionManager
Vault Agent通过其自动身份验证功能实现了 Spring Vault 的功能。应用程序可以通过依赖在localhost. Spring Vault 可以发送没有
X-Vault-Token标头的请求。禁用 Spring Vault 的身份验证基础设施以禁用客户端身份验证和会话管理。
spring.cloud.vault:
authentication: NONE
-
authentication将此值设置为NONE禁用ClientAuthentication和SessionManager。
另请参阅:Vault 文档:代理
5.3. AppId认证
Vault 支持
由两个难以猜测的令牌组成的AppId身份验证。AppId 默认为spring.application.name静态配置。第二个token是UserId,它是由应用程序决定的部分,通常与运行时环境有关。IP 地址、Mac 地址或 Docker 容器名称都是很好的例子。Spring Cloud Vault Config 支持IP 地址、Mac 地址和静态UserId(例如通过系统属性提供)。IP 和 Mac 地址表示为十六进制编码的 SHA256 哈希值。
基于 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
包含 的换行符会echo导致不同的哈希值,因此请确保包含该-n标志。
|
基于 Mac 地址的 UserId 从本地主机绑定的设备获取其网络设备。该配置还允许指定提示network-interface以选择正确的设备。的值
network-interface是可选的,可以是接口名称或接口索引(从 0 开始)。
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标志。
|
5.3.1. 自定义用户ID
UserId的生成是一个开放的机制。您可以设置
spring.cloud.vault.app-id.user-id为任何字符串,配置的值将用作静态 UserId。
更高级的方法允许您设置spring.cloud.vault.app-id.user-id类名。该类必须位于您的类路径中,并且必须实现org.springframework.cloud.vault.AppIdUserIdMechanism接口和createUserId方法。createUserIdSpring Cloud Vault每次使用 AppId 进行身份验证时都会通过调用来获取 UserId来获取令牌。
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用于机器身份验证,例如已弃用的(自 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 |
秘密ID |
角色名称 |
代币 |
提供 RoleId/SecretId |
假如 |
假如 |
||
提供没有 SecretId 的 RoleId |
假如 |
|||
提供RoleId,拉取SecretId |
假如 |
假如 |
假如 |
|
拉取 RoleId,提供 SecretId |
假如 |
假如 |
假如 |
|
全拉模式 |
假如 |
假如 |
||
包裹 |
假如 |
|||
包装好的RoleId,提供SecretId |
假如 |
假如 |
||
提供RoleId,包装SecretId |
假如 |
假如 |
角色ID |
秘密ID |
支持的 |
假如 |
假如 |
✅ |
假如 |
拉 |
✅ |
假如 |
包裹 |
✅ |
假如 |
缺席的 |
✅ |
拉 |
假如 |
✅ |
拉 |
拉 |
✅ |
拉 |
包裹 |
❌ |
拉 |
缺席的 |
❌ |
包裹 |
假如 |
✅ |
包裹 |
拉 |
❌ |
包裹 |
包裹 |
✅ |
包裹 |
缺席的 |
❌ |
您仍然可以通过AppRoleAuthentication在上下文中提供配置的 bean 来使用推/拉/包装模式的所有组合。Spring Cloud Vault 无法从配置属性派生所有可能的 AppRole 组合。
|
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设置角色 ID。 -
secret-id设置 SecretId。如果配置 AppRole 时不需要 SecretId(请参阅 参考资料bind_secret_id),则可以省略 SecretId。 -
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 身份验证默认启用随机数以遵循首次使用信任 (TOFU) 原则。任何意外获得 PKCS#7 身份元数据访问权限的一方都可以针对 Vault 进行身份验证。
在首次登录期间,Spring Cloud Vault 会生成一个随机数,该随机数与实例 ID 一起存储在身份验证后端中。重新验证需要发送相同的随机数。任何其他方没有随机数,可以在 Vault 中发出警报以进行进一步调查。
随机数保存在内存中,并在应用程序重新启动时丢失。您可以使用 来配置静态随机数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身份验证。空随机数默认为随机数生成
5.6. AWS-IAM 身份验证
aws后端为 AWS IAM 角色提供了安全的身份验证机制,允许根据正在运行的应用程序的当前 IAM 角色进行自动身份验证。与大多数 Vault 身份验证后端不同,此后端不需要首次部署或配置安全敏感凭证(令牌、用户名/密码、客户端证书等)。相反,它将 AWS 视为受信任的第三方,并使用调用者及其 IAM 凭证签名的 4 条信息来验证调用者确实正在使用该 IAM 角色。
应用程序当前运行的 IAM 角色是自动计算的。如果您在 AWS ECS 上运行应用程序,则应用程序将使用分配给正在运行的容器的 ECS 任务的 IAM 角色。如果您在 EC2 实例上裸运行应用程序,则使用的 IAM 角色将是分配给 EC2 实例的角色。
使用 AWS-IAM 身份验证时,您必须在 Vault 中创建一个角色并将其分配给您的 IAM 角色。空role默认为当前 IAM 角色的友好名称。
spring.cloud.vault:
authentication: AWS_IAM
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 用户的友好名称将用作保管库角色。 -
aws-path设置要使用的 AWS 挂载路径 -
server-name设置用于X-Vault-AWS-IAM-Server-ID标头的值,以防止某些类型的重放攻击。 -
endpoint-uri设置用于参数的 AWS STS API 的值iam_request_url。
AWS-IAM 需要 AWS Java SDK v2 依赖项 ( software.amazon.awssdk:auth),因为身份验证实施使用 AWS SDK 类型进行凭证和请求签名。
5.7. Azure MSI 身份验证
azure auth 后端为 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 服务器的资源 ID 默认为vault.hashicorp.com。要更改此设置,请进行spring.cloud.vault.azure-msi.identity-token-service相应设置。
也可以看看:
5.8. TLS 证书认证
身份cert验证后端允许使用由 CA 签名或自签名的 SSL/TLS 客户端证书进行身份验证。
要启用cert身份验证,您需要:
-
使用 SSL,请参阅Vault 客户端 SSL 配置
-
Keystore配置包含客户端证书和私钥的Java -
设置
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 身份验证使用 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 计算引擎)身份验证为服务帐户创建 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: my-service@projectid.iam.gserviceaccount.com
-
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.signJwtAPI 获取的。调用者根据 GCP IAM 进行身份验证,从而证明其身份。此 Vault 后端将 GCP 视为受信任的第三方。
IAM 凭证可以从运行时环境(特别是GOOGLE_APPLICATION_CREDENTIALS
环境变量)、Google Compute 元数据服务获取,也可以从外部提供,例如 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: my-service@projectid.iam.gserviceaccount.com
-
role设置尝试登录的角色的名称。 -
credentials.location包含 JSON 格式的 Google 凭据的凭据资源的路径。 -
credentials.encoded-keyJSON 格式的 OAuth2 帐户私钥的 base64 编码内容。 -
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-iam和com.google.auth:google-auth-library-oauth2-http),因为身份验证实现使用 Google API 进行凭据和 JWT 签名。
Google 凭据需要 OAuth 2 令牌来维护令牌生命周期。因此,所有 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设置角色。 -
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实例身份证书的路径。默认为${CF_INSTANCE_CERT}环境变量。 -
instance-key设置 PCF 实例身份密钥的路径。默认为${CF_INSTANCE_KEY}环境变量。
| PCF 身份验证要求 BouncyCastle (bcpkix-jdk15on) 位于 RSA PSS 签名的类路径上。 |
6. ACL要求
本节介绍 Spring Vault 访问哪些路径,以便您可以从所需的功能中派生策略声明。
| 能力 | 关联的 HTTP 动词 |
|---|---|
创造 |
|
读 |
|
更新 |
|
删除 |
|
列表 |
|
6.1. 验证
登录:POST auth/$authMethod/login
6.2. KeyValue 安装发现
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) 与活动配置文件结合使用。
/secret/{application}/{profile}
/secret/{application}
/secret/{default-context}/{profile}
/secret/{default-context}
应用程序名称由属性决定:
-
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 Cloud Vaultdata/根据挂载是否使用版本化键值后端在挂载路径和实际上下文路径之间添加上下文。
|
spring.cloud.vault:
kv:
enabled: true
backend: secret
profile-separator: '/'
default-context: application
application-name: my-app
profiles: local, cloud
-
enabled设置此值以false禁用秘密后端配置使用 -
backend设置要使用的秘密安装的路径 -
default-context设置所有应用程序使用的上下文名称 -
application-name覆盖在键值后端中使用的应用程序名称 -
profiles覆盖在键值后端使用的活动配置文件 -
profile-separator将配置文件名称与配置文件的属性源中的上下文分开
| 键值秘密后端可以在版本化(v2)和非版本化(v1)模式下运行。 |
也可以看看:
7.2. 领事
Spring Cloud Vault 可以获得 HashiCorp Consul 的凭据。Consul 集成需要spring-cloud-vault-config-consul
依赖。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-consul</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
spring.cloud.vault.consul.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.consul.role=…。
获得的令牌存储在中spring.cloud.consul.token
,因此使用 Spring Cloud Consul 可以获取生成的凭据,而无需进一步配置。您可以通过设置来配置属性名称spring.cloud.vault.consul.token-property。
spring.cloud.vault:
consul:
enabled: true
role: readonly
backend: consul
token-property: spring.cloud.consul.token
-
enabled设置此值以true启用 Consul 后端配置使用 -
role设置Consul角色定义的角色名称 -
backend设置要使用的 Consul 挂载路径 -
token-property设置存储 Consul ACL 令牌的属性名称
7.3. RabbitMQ
Spring Cloud Vault 可以获得 RabbitMQ 的凭据。
RabbitMQ 集成需要spring-cloud-vault-config-rabbitmq
依赖项。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-rabbitmq</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
spring.cloud.vault.rabbitmq.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.rabbitmq.role=…。
用户名和密码存储在中spring.rabbitmq.username
,spring.rabbitmq.password因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.rabbitmq.username-property您可以通过设置和
来配置属性名称spring.cloud.vault.rabbitmq.password-property。
spring.cloud.vault:
rabbitmq:
enabled: true
role: readonly
backend: rabbitmq
username-property: spring.rabbitmq.username
password-property: spring.rabbitmq.password
-
enabled设置此值以true启用 RabbitMQ 后端配置使用 -
role设置 RabbitMQ 角色定义的角色名称 -
backend设置要使用的 RabbitMQ 挂载路径 -
username-property设置存储 RabbitMQ 用户名的属性名称 -
password-property设置存储 RabbitMQ 密码的属性名称
7.4. AWS
Spring Cloud Vault 可以获得 AWS 的凭证。
AWS 集成需要spring-cloud-vault-config-aws
依赖性。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-aws</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
spring.cloud.vault.aws=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.aws.role=…。
支持的 AWS 凭证类型:
-
iam_user(默认)
-
假定角色 (STS)
-
联邦令牌(STS)
访问密钥和秘密密钥存储在cloud.aws.credentials.accessKey
和中cloud.aws.credentials.secretKey。因此,使用 Spring Cloud AWS 将获取生成的凭证,无需进一步配置。
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
spring.cloud.vault:
aws:
enabled: true
role: readonly
backend: aws
access-key-property: cloud.aws.credentials.accessKey
secret-key-property: cloud.aws.credentials.secretKey
示例:假定角色 (STS)
spring.cloud.vault:
aws:
enabled: true
role: sts-vault-role
backend: aws
credential-type: assumed_role
access-key-property: cloud.aws.credentials.accessKey
secret-key-property: cloud.aws.credentials.secretKey
session-token-key-property: cloud.aws.credentials.sessionToken
ttl: 3600s
role-arn: arn:aws:iam::${AWS_ACCOUNT}:role/sts-app-role
-
enabled设置此值以true启用 AWS 后端配置使用 -
role设置AWS角色定义的角色名称 -
backend设置要使用的 AWS 挂载路径 -
access-key-property设置存储 AWS 访问密钥的属性名称 -
secret-key-property设置存储 AWS 密钥的属性名称 -
session-token-key-property设置存储 AWS STS 安全令牌的属性名称。 -
credential-type设置用于此后端的 aws 凭证类型。默认为iam_user -
ttlassumed_role使用或时设置 STS 令牌的 ttlfederation_token。默认为保管库角色指定的 ttl。最小/最大值也仅限于 AWS 对 STS 支持的值。 -
role-arn如果在使用时为保管库角色配置了多个角色,则设置要代入的 IAM 角色assumed_role。
8. 数据库后端
Vault 支持多个数据库秘密后端,以根据配置的角色动态生成数据库凭据。这意味着需要访问数据库的服务不再需要配置凭据:它们可以从 Vault 请求凭据,并使用 Vault 的租赁机制更轻松地滚动密钥。
Spring Cloud Vault 与这些后端集成:
使用数据库秘密后端需要在配置和依赖项中启用后端spring-cloud-vault-config-databases
。
Vault 自 0.7.1 起附带一个专用的database秘密后端,允许通过插件进行数据库集成。您可以通过使用通用数据库后端来使用该特定后端。确保指定适当的后端路径,例如spring.cloud.vault.mysql.role.backend=database。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-databases</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
| 启用多个兼容 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=…。
虽然数据库后端是通用的,但spring.cloud.vault.database
专门针对 JDBC 数据库。用户名和密码可从spring.datasource.username和spring.datasource.password属性中获取,因此使用 Spring Boot 将为您获取生成的凭据,而DataSource无需进一步配置。spring.cloud.vault.database.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.database.password-property。
spring.cloud.vault:
database:
enabled: true
role: readonly
backend: database
username-property: spring.datasource.username
password-property: spring.datasource.password
8.2. 多个数据库
有时,单个数据库的凭据是不够的,因为应用程序可能连接到两个或多个同类数据库。从3.0.5版本开始,Spring Vault支持命名空间下配置多个数据库秘密后端spring.cloud.vault.databases.*。
该配置接受多个数据库后端以将凭据具体化到指定的属性中。确保配置username-property正确password-property。
spring.cloud.vault:
databases:
primary:
enabled: true
role: readwrite
backend: database
username-property: spring.primary-datasource.username
password-property: spring.primary-datasource.password
other-database:
enabled: true
role: readonly
backend: database
username-property: spring.secondary-datasource.username
password-property: spring.secondary-datasource.password
-
<name>数据库配置的描述性名称。 -
<name>.enabled设置此值以true启用数据库后端配置使用 -
<name>.role设置数据库角色定义的角色名称 -
<name>.backend设置要使用的数据库安装路径 -
<name>.username-property设置存储数据库用户名的属性名称。确保使用唯一的属性名称以避免属性遮蔽。 -
<name>.password-property设置存储数据库密码的属性名称 确保使用唯一的属性名称以避免属性遮蔽。
另请参阅:Vault 文档:数据库机密后端
DataSource当达到最大租用时间时,
Spring Cloud Vault 不支持获取新凭据并使用它们进行配置。也就是说,如果max_ttlVault 中的数据库角色设置为24h这意味着应用程序启动 24 小时后,它无法再通过数据库进行身份验证。
|
8.3. 阿帕奇卡桑德拉
Vault 0.7.1 中已弃用后端cassandra,建议使用database后端并将其安装为cassandra.
|
Spring Cloud Vault 可以获得 Apache Cassandra 的凭据。spring.cloud.vault.cassandra.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.cassandra.role=…。
用户名和密码可从spring.data.cassandra.username
和spring.data.cassandra.password属性中获取,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.cassandra.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.cassandra.password-property。
spring.cloud.vault:
cassandra:
enabled: true
role: readonly
backend: cassandra
username-property: spring.data.cassandra.username
password-property: spring.data.cassandra.password
-
enabled设置此值以true启用 Cassandra 后端配置使用 -
role设置 Cassandra 角色定义的角色名称 -
backend设置要使用的 Cassandra 挂载路径 -
username-property设置存储 Cassandra 用户名的属性名称 -
password-property设置存储 Cassandra 密码的属性名称
8.4. 沙发数据库
Spring Cloud Vault 可以获得 Couchbase 的凭据。spring.cloud.vault.couchbase.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.couchbase.role=…。
用户名和密码可从spring.couchbase.username
和spring.couchbase.password属性中获取,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.couchbase.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.couchbase.password-property。
spring.cloud.vault:
couchbase:
enabled: true
role: readonly
backend: database
username-property: spring.couchbase.username
password-property: spring.couchbase.password
-
enabled设置此值以true启用 Couchbase 后端配置使用 -
role设置 Couchbase 角色定义的角色名称 -
backend设置要使用的 Couchbase 安装路径 -
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=…。
用户名和密码可从spring.elasticsearch.rest.username
和spring.elasticsearch.rest.password属性中获取,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.elasticsearch.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.elasticsearch.password-property。
spring.cloud.vault:
elasticsearch:
enabled: true
role: readonly
backend: mongodb
username-property: spring.elasticsearch.rest.username
password-property: spring.elasticsearch.rest.password
-
enabled设置此值以true启用 Elasticsearch 数据库后端配置使用 -
role设置Elasticsearch角色定义的角色名称 -
backend设置要使用的 Elasticsearch 挂载路径 -
username-property设置存储 Elasticsearch 用户名的属性名称 -
password-property设置存储 Elasticsearch 密码的属性名称
8.6。MongoDB
Vault 0.7.1 中已弃用后端mongodb,建议使用database后端并将其安装为mongodb.
|
Spring Cloud Vault 可以获得 MongoDB 的凭据。spring.cloud.vault.mongodb.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.mongodb.role=…。
用户名和密码存储在中spring.data.mongodb.username
,spring.data.mongodb.password因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.mongodb.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.mongodb.password-property。
spring.cloud.vault:
mongodb:
enabled: true
role: readonly
backend: mongodb
username-property: spring.data.mongodb.username
password-property: spring.data.mongodb.password
-
enabled设置此值以true启用 MongodB 后端配置使用 -
role设置 MongoDB 角色定义的角色名称 -
backend设置要使用的 MongoDB 挂载路径 -
username-property设置存储 MongoDB 用户名的属性名称 -
password-property设置存储 MongoDB 密码的属性名称
8.7. MySQL
Vault 0.7.1 中已弃用后端mysql,建议使用database后端并将其安装为mysql. 的配置spring.cloud.vault.mysql将在未来版本中删除。
|
Spring Cloud Vault 可以获得 MySQL 的凭据。spring.cloud.vault.mysql.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.mysql.role=…。
用户名和密码可从spring.datasource.username
和spring.datasource.password属性中获取,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.mysql.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.mysql.password-property。
spring.cloud.vault:
mysql:
enabled: true
role: readonly
backend: mysql
username-property: spring.datasource.username
password-property: spring.datasource.password
-
enabled设置此值以true启用 MySQL 后端配置使用 -
role设置MySQL角色定义的角色名称 -
backend设置要使用的 MySQL 挂载路径 -
username-property设置存储 MySQL 用户名的属性名称 -
password-property设置存储 MySQL 密码的属性名称
8.8。PostgreSQL
Vault 0.7.1 中已弃用后端postgresql,建议使用database后端并将其安装为postgresql. 的配置spring.cloud.vault.postgresql将在未来版本中删除。
|
Spring Cloud Vault 可以获得 PostgreSQL 的凭据。spring.cloud.vault.postgresql.enabled=true可以通过设置(默认false)并提供带有 的角色名称来启用集成
spring.cloud.vault.postgresql.role=…。
用户名和密码可从spring.datasource.username
和spring.datasource.password属性中获取,因此使用 Spring Boot 将获取生成的凭据,而无需进一步配置。spring.cloud.vault.postgresql.username-property您可以通过设置和
来配置属性名称
spring.cloud.vault.postgresql.password-property。
spring.cloud.vault:
postgresql:
enabled: true
role: readonly
backend: postgresql
username-property: spring.datasource.username
password-property: spring.datasource.password
-
enabled设置此值以true启用 PostgreSQL 后端配置使用 -
role设置 PostgreSQL 角色定义的角色名称 -
backend设置要使用的 PostgreSQL 挂载路径 -
username-property设置存储 PostgreSQL 用户名的属性名称 -
password-property设置存储 PostgreSQL 密码的属性名称
9. 自定义将哪些秘密后端公开为 PropertySource
Spring Cloud Vault 使用基于属性的配置来PropertySource为键值创建并发现秘密后端。
发现的后端提供VaultSecretBackendDescriptorbean 来描述使用秘密后端的配置状态PropertySource。需要SecretBackendMetadataFactory创建一个SecretBackendMetadata包含路径、名称和属性转换配置的对象。
SecretBackendMetadata用于支持特定的PropertySource.
您可以注册一个VaultConfigurer进行定制。如果您提供VaultConfigurer. 不过,您可以使用
SecretBackendConfigurer.registerDefaultKeyValueSecretBackends()和启用默认注册SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends()。
public class CustomizationBean implements VaultConfigurer {
@Override
public void addSecretBackends(SecretBackendConfigurer configurer) {
configurer.add("secret/my-application");
configurer.registerDefaultKeyValueSecretBackends(false);
configurer.registerDefaultDiscoveredSecretBackends(true);
}
}
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapper(VaultBootstrapper.fromConfigurer(new CustomizationBean()));
10. 自定义秘密后端实现
Spring Cloud Vault 为最常见的后端集成提供秘密后端支持。您可以通过提供一个实现来与任何类型的后端集成,该实现描述如何从您想要使用的后端获取数据以及如何通过提供PropertyTransformer.
为后端添加自定义实现需要实现两个接口:
-
org.springframework.cloud.vault.config.VaultSecretBackendDescriptor -
org.springframework.cloud.vault.config.SecretBackendMetadataFactory
VaultSecretBackendDescriptor通常是保存配置数据的对象,例如VaultDatabaseProperties. Spring Cloud Vault 要求您的类型带有注释,@ConfigurationProperties以便从配置中具体化该类。
SecretBackendMetadataFactory接受VaultSecretBackendDescriptor创建实际SecretBackendMetadata对象,该对象保存 Vault 服务器内的上下文路径、解析参数化上下文路径所需的任何路径变量和PropertyTransformer.
两者VaultSecretBackendDescriptor都SecretBackendMetadataFactory必须注册,类型spring.factories是Spring提供的一种扩展机制,类似于Java的ServiceLoader。
11.服务注册中心配置
您可以使用DiscoveryClient(例如来自 Spring Cloud Consul)通过设置 spring.cloud.vault.discovery.enabled=true (默认false)来定位 Vault 服务器。最终结果是您的应用程序需要具有适当发现配置的 application.yml (或环境变量)。好处是,只要发现服务是固定点,Vault 就可以更改其坐标。默认服务 ID 是,vault但您可以在客户端上使用 进行更改
spring.cloud.vault.discovery.serviceId。
发现客户端实现都支持某种元数据映射(例如,对于 Eureka,我们有 eureka.instance.metadataMap)。服务的一些附加属性可能需要在其服务注册元数据中配置,以便客户端可以正确连接。不提供有关传输层安全性详细信息的服务注册表需要提供要scheme设置为 或https的元数据条目http。如果未配置方案且服务未公开为安全服务,则配置默认为spring.cloud.vault.scheme未https设置时的方案。
spring.cloud.vault.discovery:
enabled: true
service-id: my-vault-service
12. Vault 客户端快速失败
在某些情况下,如果服务无法连接到 Vault 服务器,则可能希望服务启动失败。如果这是所需的行为,请设置引导配置属性
spring.cloud.vault.fail-fast=true,客户端将因异常而停止。
spring.cloud.vault:
fail-fast: true
13.Vault 企业命名空间支持
Vault Enterprise 允许使用命名空间在单个 Vault 服务器上隔离多个 Vault。通过设置配置
spring.cloud.vault.namespace=…命名空间,
X-Vault-Namespace在使用 Vault
RestTemplate或WebClient.
请注意,Vault 社区版不支持此功能,并且对 Vault 操作没有影响。
spring.cloud.vault:
namespace: my-namespace
14.Vault客户端SSL配置
可以通过设置各种属性以声明方式配置 SSL。您可以设置javax.net.ssl.trustStore为配置 JVM 范围的 SSL 设置,也spring.cloud.vault.ssl.trust-store
可以仅为 Spring Cloud Vault Config 设置 SSL 设置。
spring.cloud.vault:
ssl:
trust-store: classpath:keystore.jks
trust-store-password: changeit
trust-store-type: JKS
enabled-protocols: TLSv1.2,TLSv1.3
enabled-cipher-suites: TLS_AES_128_GCM_SHA256
-
trust-store设置信任库的资源。SSL 保护的 Vault 通信将使用指定的信任存储区验证 Vault SSL 证书。 -
trust-store-password设置信任库密码 -
trust-store-type设置信任存储类型。支持的值是所有支持的KeyStore类型,包括PEM. -
enabled-protocols设置启用的 SSL/TLS 协议的列表(自 3.0.2 起)。 -
enabled-cipher-suites设置启用的 SSL/TLS 密码套件的列表(自 3.0.2 起)。
spring.cloud.vault.ssl.*请注意,只有当 Apache Http 组件或 OkHttp 客户端位于您的类路径上时,才能应用配置。
15. 租赁生命周期管理(续订和撤销)
对于每个秘密,Vault 都会创建一个租约:包含持续时间、可更新性等信息的元数据。
Vault 承诺数据在给定的持续时间或生存时间 (TTL) 内有效。一旦租约到期,Vault 可以撤销数据,并且秘密的使用者无法再确定它是否有效。
Spring Cloud Vault 维护的租赁生命周期超出了创建登录令牌和机密的范围。也就是说,与租约相关的登录令牌和机密会在租约到期之前安排续订,直至最终到期。应用程序关闭会撤销获得的登录令牌和可更新租约。
秘密服务和数据库后端(例如 MongoDB 或 MySQL)通常会生成可更新的租约,因此生成的凭据将在应用程序关闭时被禁用。
| 静态令牌不会更新或撤销。 |
默认情况下启用租约续订和撤销,可以通过设置spring.cloud.vault.config.lifecycle.enabled
为 来禁用false。不建议这样做,因为租约可能会过期,Spring Cloud Vault 无法再使用生成的凭据访问 Vault 或服务,并且有效凭据在应用程序关闭后仍保持活动状态。
spring.cloud.vault:
config.lifecycle:
enabled: true
min-renewal: 10s
expiry-threshold: 1m
lease-endpoints: Legacy
-
enabled控制是否考虑更新与秘密相关的租约以及是否轮换过期的秘密。默认启用。 -
min-renewal设置续订租约之前至少需要的持续时间。此设置可防止续订过于频繁。 -
expiry-threshold设置到期阈值。租约在到期前会按照配置的时间续订。 -
lease-endpoints设置更新和撤销的端点。0.8 之前的 Vault 版本和更高版本的 SysLeases 的旧版本。
另请参阅:Vault 文档:租赁、续订和撤销
16. 会话令牌生命周期管理(续订、重新登录和撤销)
Vault 会话令牌(也称为LoginToken)与租约非常相似,因为它具有 TTL、最大 TTL,并且可能会过期。登录令牌过期后,将无法再使用它与 Vault 进行交互。因此,Spring Vault 附带了一个SessionManager用于命令式和反应式使用的 API。
Spring Cloud Vault 默认维护会话令牌生命周期。会话令牌是延迟获取的,因此实际登录会推迟到第一次会话绑定使用 Vault 时。一旦 Spring Cloud Vault 获得会话令牌,它就会保留该令牌直至过期。下次使用会话绑定活动时,Spring Cloud Vault 会重新登录 Vault 并获取新的会话令牌。应用程序关闭时,如果令牌仍处于活动状态,Spring Cloud Vault 将撤销令牌以终止会话。
会话生命周期默认启用,可以通过设置spring.cloud.vault.session.lifecycle.enabled
为 来禁用false。不建议禁用,因为会话令牌可能会过期并且 Spring Cloud Vault 无法再访问 Vault。
spring.cloud.vault:
session.lifecycle:
enabled: true
refresh-before-expiry: 10s
expiry-threshold: 20s
-
enabled控制是否启用会话生命周期管理来更新会话令牌。默认启用。 -
refresh-before-expiry控制会话令牌更新的时间点。刷新时间是通过refresh-before-expiry从令牌到期时间中减去来计算的。默认为5 seconds. -
expiry-threshold设置到期阈值。该阈值表示将会话令牌视为有效的最小 TTL 持续时间。TTL 较短的令牌被视为已过期并且不再使用。应大于refresh-before-expiry以防止令牌过期。默认为7 seconds.
另请参阅:Vault 文档:令牌续订
附录 A:常见应用程序属性
application.properties可以在文件内、application.yml文件内或作为命令行开关指定各种属性。本附录提供了常见 Spring Cloud Vault 属性的列表以及对使用它们的底层类的引用。
| 属性贡献可以来自类路径上的其他 jar 文件,因此您不应认为这是一个详尽的列表。此外,您还可以定义自己的属性。 |
| 姓名 | 默认 | 描述 |
|---|---|---|
spring.cloud.vault.app-id.app-id-path |
|
AppId认证后端的挂载路径。 |
spring.cloud.vault.app-id.网络接口 |
“MAC_ADDRESS”UserId 机制的网络接口提示。 |
|
spring.cloud.vault.app-id.user-id |
|
UserId机制。可以是“MAC_ADDRESS”、“IP_ADDRESS”、字符串或类名。 |
spring.cloud.vault.app-role.app-role-path |
|
AppRole认证后端的挂载路径。 |
spring.cloud.vault.app-role.role |
角色名称,可选,用于拉模式。 |
|
spring.cloud.vault.app-role.role-id |
角色 ID。 |
|
spring.cloud.vault.app-role.secret-id |
秘密 ID。 |
|
spring.cloud.vault.应用程序名称 |
|
AppId认证的应用程序名称。 |
spring.cloud.vault.authentication |
||
spring.cloud.vault.aws-ec2.aws-ec2-path |
|
AWS-EC2 身份验证后端的挂载路径。 |
spring.cloud.vault.aws-ec2.identity-document |
|
AWS-EC2 PKCS7 身份文档的 URL。 |
spring.cloud.vault.aws-ec2.nonce |
用于 AWS-EC2 身份验证的随机数。空随机数默认为随机数生成。 |
|
spring.cloud.vault.aws-ec2.角色 |
角色名称,可选。 |
|
spring.cloud.vault.aws-iam.aws-path |
|
AWS身份验证后端的挂载路径。 |
spring.cloud.vault.aws-iam.endpoint-uri |
STS 服务器 URI。@自2.2起 |
|
spring.cloud.vault.aws-iam.region |
区域名称,可选。如果未设置,则由 AWS 默认值推断。@自 4.0.1 起 |
|
spring.cloud.vault.aws-iam.角色 |
角色名称,可选。如果未设置,则默认为友好的 IAM 名称。 |
|
spring.cloud.vault.aws-iam.服务器名称 |
用于在登录请求标头中设置 {@code X-Vault-AWS-IAM-Server-ID} 标头的服务器名称。 |
|
spring.cloud.vault.aws.access-key-property |
|
获取的访问密钥的目标属性。 |
spring.cloud.vault.aws.backend |
|
aws 后端路径。 |
spring.cloud.vault.aws.credential-type |
AWS 凭证类型 |
|
spring.cloud.vault.aws.启用 |
|
启用 aws 后端使用。 |
spring.cloud.vault.aws.角色 |
凭证的角色名称。 |
|
spring.cloud.vault.aws.role-arn |
如果我们有多个角色与保管库角色关联,则角色 arn 为假定的角色。@自3.0.2起 |
|
spring.cloud.vault.aws.secret-key-property |
|
获取的密钥的目标属性。 |
spring.cloud.vault.aws.session-token-key-property |
|
获取的密钥的目标属性。 |
spring.cloud.vault.aws.ttl |
|
sts 代币的 TTL。默认为 Max 的保管库角色可能具有的任何内容。还限于 AWS 支持的 STS 最大值。@自3.0.2起 |
spring.cloud.vault.azure-msi.azure-path |
|
Azure MSI 身份验证后端的装载路径。 |
spring.cloud.vault.azure-msi.identity-token-service |
身份令牌服务 URI。@自3.0起 |
|
spring.cloud.vault.azure-msi.元数据服务 |
实例元数据服务 URI。@自3.0起 |
|
spring.cloud.vault.azure-msi.role |
角色名称。 |
|
spring.cloud.vault.cassandra.backend |
|
Cassandra 后端路径。 |
spring.cloud.vault.cassandra.enabled |
|
启用 cassandra 后端使用。 |
spring.cloud.vault.cassandra.password-property |
|
获取的密码的目标属性。 |
spring.cloud.vault.cassandra.role |
凭证的角色名称。 |
|
spring.cloud.vault.cassandra.static-角色 |
|
启用静态角色使用。@自2.2起 |
spring.cloud.vault.cassandra.用户名属性 |
|
获取的用户名的目标属性。 |
spring.cloud.vault.config.lifecycle.enabled |
|
启用生命周期管理。 |
spring.cloud.vault.config.lifecycle.expiry-threshold |
到期阈值。{@link Lease} 在指定的 {@link Duration} 到期之前续订。@自2.2起 |
|
spring.cloud.vault.config.lifecycle.lease-endpoints |
设置 {@link LeaseEndpoints} 以委托续订/撤销调用。{@link LeaseEndpoints} 封装了 Vault 版本之间影响续订/撤销端点位置的差异。对于 Vault 0.8 或更高版本,可以是 {@link LeaseEndpoints#SysLeases},对于旧版本(默认)可以是 {@link LeaseEndpoints#Legacy}。@自2.2起 |
|
spring.cloud.vault.config.lifecycle.min-renewal |
续租之前至少需要的时间段。@自2.2起 |
|
spring.cloud.vault.config.order |
|
用于设置 {@link org.springframework.core.env.PropertySource} 优先级。这对于使用 Vault 作为其他属性源的覆盖非常有用。@参见 org.springframework.core.PriorityOrdered |
spring.cloud.vault.连接超时 |
|
连接超时。 |
spring.cloud.vault.consul.backend |
|
领事后端路径。 |
spring.cloud.vault.consul.enabled |
|
启用 consul 后端使用。 |
spring.cloud.vault.consul.角色 |
凭证的角色名称。 |
|
spring.cloud.vault.consul.token-property |
|
获取的令牌的目标属性。 |
spring.cloud.vault.couchbase.backend |
|
Couchbase 后端路径。 |
spring.cloud.vault.couchbase.enabled |
|
启用 couchbase 后端使用。 |
spring.cloud.vault.couchbase.password-property |
|
获取的密码的目标属性。 |
spring.cloud.vault.couchbase.role |
凭证的角色名称。 |
|
spring.cloud.vault.couchbase.静态角色 |
|
启用静态角色使用。 |
spring.cloud.vault.couchbase.username-property |
|
获取的用户名的目标属性。 |
spring.cloud.vault.database.backend |
|
数据库后端路径。 |
spring.cloud.vault.database.enabled |
|
启用数据库后端使用。 |
spring.cloud.vault.database.password-property |
|
获取的密码的目标属性。 |
spring.cloud.vault.database.role |
凭证的角色名称。 |
|
spring.cloud.vault.database.static-角色 |
|
启用静态角色使用。 |
spring.cloud.vault.database.username-property |
|
获取的用户名的目标属性。 |
spring.cloud.vault.数据库 |
||
spring.cloud.vault.discovery.enabled |
|
指示已启用 Vault 服务器发现的标志(将通过发现查找 Vault 服务器 URL)。 |
spring.cloud.vault.discovery.service-id |
|
用于定位 Vault 的服务 ID。 |
spring.cloud.vault.elasticsearch.backend |
|
数据库后端路径。 |
spring.cloud.vault.elasticsearch.enabled |
|
启用elasticsearch后端使用。 |
spring.cloud.vault.elasticsearch.password-property |
|
获取的密码的目标属性。 |
spring.cloud.vault.elasticsearch.role |
凭证的角色名称。 |
|
spring.cloud.vault.elasticsearch.static-角色 |
|
启用静态角色使用。 |
spring.cloud.vault.elasticsearch.username-property |
|
获取的用户名的目标属性。 |
spring.cloud.vault.启用 |
|
启用 Vault 配置服务器。 |
spring.cloud.vault.fail-fast |
|
如果无法从 Vault 获取数据,则快速失败。 |
spring.cloud.vault.gcp-gce.gcp-path |
|
Kubernetes认证后端的挂载路径。 |
spring.cloud.vault.gcp-gce.role |
尝试登录的角色的名称。 |
|
spring.cloud.vault.gcp-gce.service-account |
可选服务帐户 ID。如果未配置,则使用默认 ID。 |
|
spring.cloud.vault.gcp-iam.credentials.encoded-key |
JSON 格式的 OAuth2 帐户私钥的 base64 编码内容。 |
|
spring.cloud.vault.gcp-iam.credentials.location |
OAuth2 凭证私钥的位置。<p> 由于这是一个资源,私钥可以位于多个位置,例如本地文件系统、类路径、URL 等。 |
|
spring.cloud.vault.gcp-iam.gcp-path |
|
Kubernetes认证后端的挂载路径。 |
spring.cloud.vault.gcp-iam.jwt-validity |
|
JWT 令牌的有效性。 |
spring.cloud.vault.gcp-iam.project-id |
覆盖 GCP 项目 ID。 |
|
spring.cloud.vault.gcp-iam.角色 |
尝试登录的角色的名称。 |
|
spring.cloud.vault.gcp-iam.service-account-id |
覆盖 GCP 服务帐号 ID。 |
|
spring.cloud.vault.host |
|
保管库服务器主机。 |
spring.cloud.vault.kubernetes.kubernetes-path |
|
Kubernetes认证后端的挂载路径。 |
spring.cloud.vault.kubernetes.role |
尝试登录的角色的名称。 |
|
spring.cloud.vault.kubernetes.service-account-token-file |
|
服务帐户令牌文件的路径。 |
spring.cloud.vault.kv.应用程序名称 |
|
用于上下文的应用程序名称。 |
spring.cloud.vault.kv.backend |
|
默认后端的名称。 |
spring.cloud.vault.kv.backend-版本 |
|
键值后端版本。目前支持的版本有:<ul> <li>版本 1(无版本化键值后端)。</li> <li>版本 2(版本化键值后端)。</li> </ul> |
spring.cloud.vault.kv.default-context |
|
默认上下文的名称。 |
spring.cloud.vault.kv.启用 |
|
启用键值后端。 |
spring.cloud.vault.kv.profile-separator |
|
配置文件分隔符用于组合应用程序名称和配置文件。 |
spring.cloud.vault.kv.profiles |
活动配置文件列表。@自3.0起 |
|
spring.cloud.vault.mongodb.backend |
|
MongoDB 后端路径。 |
spring.cloud.vault.mongodb.enabled |
|
启用 mongodb 后端使用。 |
spring.cloud.vault.mongodb.password-property |
|
获取的密码的目标属性。 |
spring.cloud.vault.mongodb.role |
凭证的角色名称。 |
|
spring.cloud.vault.mongodb.static-角色 |
|
启用静态角色使用。@自2.2起 |
spring.cloud.vault.mongodb.用户名属性 |
|
获取的用户名的目标属性。 |
spring.cloud.vault.mysql.backend |
|
mysql后端路径。 |
spring.cloud.vault.mysql.启用 |
|
启用 mysql 后端使用。 |
spring.cloud.vault.mysql.password-property |
|
获取的用户名的目标属性。 |
spring.cloud.vault.mysql.角色 |
凭证的角色名称。 |
|
spring.cloud.vault.mysql.用户名属性 |
|
获取的用户名的目标属性。 |
spring.cloud.vault.namespace |
Vault 命名空间(需要 Vault Enterprise)。 |
|
spring.cloud.vault.pcf.实例证书 |
实例证书 (PEM) 的路径。默认为 {@code CF_INSTANCE_CERT} 环境变量。 |
|
spring.cloud.vault.pcf.instance-key |
实例密钥 (PEM) 的路径。默认为 {@code CF_INSTANCE_KEY} 环境变量。 |
|
spring.cloud.vault.pcf.pcf-路径 |
|
Kubernetes认证后端的挂载路径。 |
spring.cloud.vault.pcf.角色 |
尝试登录的角色的名称。 |
|
spring.cloud.vault.port |
|
保管库服务器端口。 |
spring.cloud.vault.postgresql.backend |
|
postgresql 后端路径。 |
spring.cloud.vault.postgresql.enabled |
|
启用 postgresql 后端使用。 |
spring.cloud.vault.postgresql.password-property |
|
获取的用户名的目标属性。 |
spring.cloud.vault.postgresql.role |
凭证的角色名称。 |
|
spring.cloud.vault.postgresql.username-property |
|
获取的用户名的目标属性。 |
spring.cloud.vault.rabbitmq.backend |
|
rabbitmq后端路径。 |
spring.cloud.vault.rabbitmq.enabled |
|
启用rabbitmq后端使用。 |
spring.cloud.vault.rabbitmq.password-property |
|
获取的密码的目标属性。 |
spring.cloud.vault.rabbitmq.角色 |
凭证的角色名称。 |
|
spring.cloud.vault.rabbitmq.用户名属性 |
|
获取的用户名的目标属性。 |
spring.cloud.vault.reactive.enabled |
|
指示已启用反应式发现的标志 |
spring.cloud.vault.read-timeout |
|
读取超时。 |
spring.cloud.vault.scheme |
|
协议方案。可以是“http”或“https”。 |
spring.cloud.vault.session.lifecycle.enabled |
|
启用会话生命周期管理。 |
spring.cloud.vault.session.lifecycle.expiry-threshold |
|
{@link LoginToken} 的过期阈值。该阈值表示将登录令牌视为有效的最小 TTL 持续时间。TTL 较短的令牌被视为已过期并且不再使用。应大于 {@code refreshBeforeExpiry} 以防止令牌过期。 |
spring.cloud.vault.session.lifecycle.refresh-before-expiry |
|
更新 {@link LoginToken} 之前至少需要的时间段。 |
spring.cloud.vault.ssl.cert-auth-path |
|
TLS 证书身份验证后端的挂载路径。 |
spring.cloud.vault.ssl.enabled-cipher-suites |
已启用的 SSL/TLS 密码套件的列表。@自3.0.2起 |
|
spring.cloud.vault.ssl.enabled-协议 |
已启用的 SSL/TLS 协议的列表。@自3.0.2起 |
|
spring.cloud.vault.ssl.key-store |
保存证书和私钥的信任存储。 |
|
spring.cloud.vault.ssl.key-store-密码 |
用于访问密钥存储的密码。 |
|
spring.cloud.vault.ssl.key-store-type |
密钥存储的类型。@自3.0起 |
|
spring.cloud.vault.ssl.trust-store |
保存 SSL 证书的信任存储。 |
|
spring.cloud.vault.ssl.trust-store-password |
用于访问信任存储的密码。 |
|
spring.cloud.vault.ssl.trust-store-type |
信任存储的类型。@自3.0起 |
|
spring.cloud.vault.token |
静态保险库令牌。如果 {@link #authentication} 是 {@code TOKEN},则为必需。 |
|
spring.cloud.vault.uri |
保管库 URI。可以设置方案、主机和端口。 |