VaultTemplate 简介
该级别VaultTemplate,位于包中org.springframework.vault.core, 是 Spring Vault 支持的核心类,提供了丰富的功能集与 Vault 交互。该模板提供了便捷的作,用于读取、写入和删除 Vault 中的数据,并提供你的域对象与 Vault 数据之间的映射。
一旦配置好,VaultTemplate线程安全,且可在多个实例间重用。 |
Vault 文档与域类之间的映射通过委派至Rest模板. Spring Web 支持提供了映射基础设施。
这VaultTemplate类实现了该接口金库运营. 尽可能地,方法在金库运营以 Vault API 中可用的方法命名,使现有 Vault 开发者熟悉该 API他们习惯于 API 和 CLI。例如,你会找到诸如“write”、“delete”、“read”和“revoke”等方法。设计目标是尽可能方便地在Vault API 的使用 和 之间切换金库运营. 两个API之间的一个主要区别是两个API之间金库运营可以传递域对象,而不是JSON 键值对。
使用的路径VaultTemplate(以及从那里访问的接口)被认为是相对于VaultEndpoint. 完全限定的URI路径可以使用在认证上下文中访问Vault集群成员。为了防止不必要的完整URI访问,确保在传递给路径前对它们进行净化处理VaultTemplate.
引用 的首选作方式VaultTemplate实例 是通过其接口金库运营. |
虽然有许多便利方法,但VaultTemplate以便帮助您轻松执行常见任务,如果您需要直接访问Vault API,才能访问未被VaultTemplate你可以使用其中一种执行回调方法来访问底层API。执行回调会给你一个引用休息运营对象。 更多信息请参阅“执行回访”部分。
现在让我们看看如何在 Spring 容器的背景下使用 Vault 的示例。
注册和配置Spring Vault豆子
使用 Spring Vault 不需要 Spring 上下文。然而,以下实例VaultTemplate和会话管理器注册在受管理上下文中的将参与Spring IoC 容器提供的生命周期事件。这对于在应用关闭时处置活跃的 Vault 会话非常有用。你还能从重复使用该会话中受益VaultTemplate在你的应用中实例。
Spring Vault 自带一个支持的配置类,提供 bean 定义用于在 Spring 上下文中使用。应用配置类通常从 扩展到摘要Vault配置并且必须提供环境特定的额外细节。
从摘要Vault配置需要实现VaultEndpoint vaultEndpoint()和客户端认证 clientAuthentication()方法。
@Configuration
public class AppConfig extends AbstractVaultConfiguration {
/**
* Specify an endpoint for connecting to Vault.
*/
@Override
public VaultEndpoint vaultEndpoint() {
return new VaultEndpoint(); (1)
}
/**
* Configure a client authentication.
* Please consider a more secure authentication method
* for production use.
*/
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("…"); (2)
}
}
| 1 | 创建一个新的VaultEndpoint默认指向https://localhost:8200. |
| 2 | 此示例使用Tokens认证快速开始。详见 [vault.core.authentication] 支持的认证方法。 |
@Configuration
public class AppConfig extends AbstractVaultConfiguration {
@Value("${vault.uri}")
URI vaultUri;
/**
* Specify an endpoint that was injected as URI.
*/
@Override
public VaultEndpoint vaultEndpoint() {
return VaultEndpoint.from(vaultUri); (1)
}
/**
* Configure a Client Certificate authentication.
* {@link RestOperations} can be obtained from {@link #restOperations()}.
*/
@Override
public ClientAuthentication clientAuthentication() {
return new ClientCertificateAuthentication(restOperations()); (2)
}
}
| 1 | VaultEndpoint可以通过各种工厂方法构建,例如来自(URI uri)或VaultEndpoint.create(String host, int port). |
| 2 | 的依赖关系客户端认证方法可以通过以下方式获得摘要Vault配置或者由你的配置提供。 |
在某些情况下,创建自定义配置类可能会很麻烦。可以看看EnvironmentVaultConfiguration允许通过使用来自现有属性源和 Spring 的属性来进行配置环境. 阅读更多 在用EnvironmentVaultConfiguration. |
会话管理
春季金库需要客户端认证登录并访问Vault。有关认证的详细信息请参见[vault.core.authentication]。Vault 登录不应在每次认证后的Vault交互中进行,但必须在整个会话中重复使用。这一方面由会话管理器实现。 一个会话管理器决定其获取Tokens的频率,涉及撤销和续期。Spring Vault 包含两种实现方式:
-
SimpleSessionManager:只需从提供的客户端认证无更新和撤销 -
LifecycleAwareSessionManager:这会话管理器安排Tokens如果某个Tokens可续期,则在处理时撤销登录Tokens。续期通过异步任务执行器.LifecycleAwareSessionManager如果使用摘要Vault配置.
用EnvironmentVaultConfiguration
春季金库包括EnvironmentVaultConfiguration从 Spring 配置 Vault 客户端环境以及一组预定义的属性键。EnvironmentVaultConfiguration支持频繁应用的配置。其他配置则可从最合适的配置类别中推导出来支持。 包括EnvironmentVaultConfiguration跟@Import(EnvironmentVaultConfiguration.class)通过Spring的任何一个,现有的基于Java的配置类和供应配置属性地产来源s.
@PropertySource("vault.properties")
@Import(EnvironmentVaultConfiguration.class)
public class MyConfiguration{
}
vault.uri=https://localhost:8200
vault.token=00000000-0000-0000-0000-000000000000
属性键
-
Vault URI:
Vault.uri -
SSL 配置
-
钥匙库资源:
vault.ssl.key商店(可选) -
密钥存储密码:
vault.ssl.key-store-password(存储密码)(可选) -
密钥存储类型:
vault.ssl.key商店类型(通常是可选的开玩笑的,支持也PEM) -
Truststore资源:
vault.ssl.trust-store(可选) -
Truststore 密码:
vault.ssl.trust-store-password(可选) -
Truststore 类型:
vault.ssl.trust-store-type(通常是可选的开玩笑的,支持也PEM) -
启用SSL/TLS协议:
vault.ssl.enabled-protocols(自2.3.2起,可选协议以逗号分隔) -
启用SSL/TLS密码套件:
vault.ssl.enabled-cipher-suites(自2.3.2起,可选密码套件用逗号分隔)
-
-
认证方式:
vault.authentication(默认为Tokens支持的认证方法包括:Tokens,应用,AWS_EC2,AWS_IAM,天蓝色,证书,格子间,库贝尔内特斯)
认证专用属性密钥
-
金库Tokens:
vault.token(金库Tokens)
-
AppRole 路径:
vault.app-role.app-角色路径(默认为应用) -
RoleId:
vault.app-role.role-id -
SecretId:
vault.app-role.secret-id(可选)
-
AWS EC2 路径:
vault.aws-ec2.aws-ec2-path(默认为AWS-EC2) -
角色:
vault.aws-ec2.role -
RoleId:
vault.aws-ec2.role-id(已弃用:使用vault.aws-ec2.role代替) -
身份证明网址:
vault.aws-ec2.identity-document(默认为169.254.169.254/latest/dynamic/instance-identity/pkcs7)
-
角色:
vault.aws-iam.role
-
Azure MSI path:
vault.azure-msi.azure-path(默认为天蓝色) -
角色:
vault.azure-msi.role -
元数据服务网址:
vault.azure-msi.metadata-service(默认为169.254.169.254/metadata/instance?API-version=2017-08-01) -
身份Tokens服务网址:
vault.azure-msi.identity-token-service(默认为169.254.169.254/metadata/identity/oauth2/token?resource=https://vault.hashicorp.com&api-version=2018-02-01)
没有配置选项。
-
初始金库Tokens:
vault.token(金库Tokens)
-
Kubernetes 路径:
vault.kubernetes.kubernetes-path(默认为Kubernetes) -
角色:
vault.kubernetes.role -
服务账户Tokens文件的路径:
vault.kubernetes.service-account-token-file(默认为/var/run/secrets/kubernetes.io/serviceaccount/token)
执行回调
所有 Spring 模板类的一个共同设计特征是所有功能都被路由到某个模板执行回调方法中。
这有助于确保异常和可能需要的资源管理执行一致。
虽然JDBC和JMS在这方面的需求远大于Vault,但它仍然提供了一个单一的访问和日志记录点。
因此,使用执行回调是访问 Vault API 的首选方式
执行我们未公开的方法的罕见作VaultTemplate.
以下是执行回调方法的列表。
-
<T> TdoWithVault(RestOperationsCallback<T>回调)执行给定的休息作回调,允许通过以下方式与Vault交互。休息运营不需要进行治疗。 -
<T> TdoWithSession(RestOperationsCallback<T>回调)执行给定的休息作回调允许在认证会话中与Vault交互。
这里有一个使用以下条件的例子客户回调初始化Vault:
vaultOperations.doWithVault(new RestOperationsCallback<VaultInitializationResponse>() {
@Override
public VaultInitializationResponse doWithRestOperations(RestOperations restOperations) {
ResponseEntity<VaultInitializationResponse> exchange = restOperations
.exchange("/sys/init", HttpMethod.PUT,
new HttpEntity<Object>(request),
VaultInitializationResponse.class);
return exchange.getBody();
}
});