跳到主要内容
版本:4.1.0

VaultTemplate 简介

Doubao 中英对照 Introduction to VaultTemplate

类 VaultTemplate 位于包 org.springframework.vault.core 中,是 Spring Vault 支持的核心类,提供了丰富的功能集来与 Vault 交互。该模板提供了在 Vault 中读取、写入和删除数据的便捷操作,并在你的领域对象和 Vault 数据之间提供映射。

备注

一旦配置完成,VaultTemplate 就是线程安全的,可以在多个实例之间复用。

Vault 文档与领域类之间的映射通过委托给 VaultClient 完成。Spring Web 支持提供了映射基础设施。

VaultTemplate 类实现了接口 VaultOperations。在尽可能的范围内,VaultOperations 上的方法以 Vault API 上可用的方法命名,以使 API 对熟悉 API 和 CLI 的现有 Vault 开发人员熟悉。例如,你会找到 "write"、"delete"、"read" 和 "revoke" 等方法。设计目标是尽可能轻松地在 Vault API 和 VaultOperations 之间切换。两种 API 之间的一个主要区别是,VaultOperations 可以传递领域对象而不是 JSON 键值对。

VaultTemplate 中使用的路径(以及从那里可访问的接口)被视为相对于 VaultEndpoint。完全限定的 URI 路径可以在已认证的上下文中用于访问 Vault 集群成员。为防止不希望的全 URI 访问,请确保在将路径传递给 VaultTemplate 之前对其进行清理。

备注

引用 VaultTemplate 实例上的操作的首选方式是通过其接口 VaultOperations。

虽然 VaultTemplate 上有很多便捷方法可以帮助你轻松完成常见任务,但如果需要直接访问 Vault API 以访问 VaultTemplate 未明确暴露的功能,你可以使用多个执行回调方法之一来访问底层 API。执行回调将为你提供对 VaultClient 对象的引用。有关更多信息,请参阅 执行回调 部分。

现在让我们看看在 Spring 容器上下文中使用 Vault 的一些示例。

注册和配置 Spring Vault beans​

使用 Spring Vault 不需要 Spring Context。但是,在受管上下文中注册的 VaultTemplate 和 SessionManager 实例将参与 Spring IoC 容器提供的生命周期事件。这对于在应用程序关闭时释放活动的 Vault 会话很有用。你还可以受益于在你的应用程序中复用同一个 VaultTemplate 实例。

Spring Vault 附带一个支持配置类,用于在 Spring 上下文中提供 bean 定义。应用程序配置类通常继承自 AbstractVaultConfiguration,并且需要提供特定于环境的额外细节。

继承自 AbstractVaultConfiguration 需要实现 VaultEndpoint vaultEndpoint() 和 ClientAuthentication clientAuthentication() 方法。

示例 1:使用基于 Java 的 bean 元数据注册 Spring Vault 对象

@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
}
}

示例 2:注册 Spring Vault 并应用注入的属性

@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
}
}
  • VaultEndpoint 可以使用各种工厂方法构造,例如 from(URI uri) 或 VaultEndpoint.create(String host, int port)。

  • ClientAuthentication 方法的依赖可以从 AbstractVaultConfiguration 获取,也可以由你的配置提供。

备注

在某些情况下,创建自定义配置类可能很麻烦。请查看 EnvironmentVaultConfiguration,它允许使用现有属性源和 Spring Environment 中的属性进行配置。在 使用 EnvironmentVaultConfiguration 中了解更多信息。

会话管理​

Spring Vault 需要 ClientAuthentication 来登录和访问 Vault。有关认证的详细信息,请参阅 [vault.core.authentication]。Vault 登录不应在每次已认证的 Vault 交互时发生,而必须在整个会话期间复用。这一方面由 SessionManager 实现处理。SessionManager 决定多久获取一次令牌、以及吊销和续期的策略。Spring Vault 附带两个实现:

  • SimpleSessionManager:仅从提供的 ClientAuthentication 获取令牌,不进行刷新和吊销
  • LifecycleAwareSessionManager:此 SessionManager 在令牌可续期时调度令牌续期,并在处置时吊销登录令牌。续期使用 AsyncTaskExecutor 调度。如果使用 AbstractVaultConfiguration,默认配置 LifecycleAwareSessionManager。

使用 EnvironmentVaultConfiguration​

Spring Vault 包含 EnvironmentVaultConfiguration,用于从 Spring Environment 和一组预定义的属性键配置 Vault 客户端。EnvironmentVaultConfiguration 支持经常应用的配置。其他配置通过继承最合适的配置类来支持。使用 @Import(EnvironmentVaultConfiguration.class) 将 EnvironmentVaultConfiguration 包含到现有的基于 Java 的配置类中,并通过任何 Spring PropertySource 提供配置属性。

示例 3:将 EnvironmentVaultConfiguration 与属性文件一起使用

@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-store(可选)
    • 密钥库密码:vault.ssl.key-store-password(可选)
    • 密钥库类型:vault.ssl.key-store-type(可选,通常为 jks,也支持 pem)
    • 信任库资源:vault.ssl.trust-store(可选)
    • 信任库密码:vault.ssl.trust-store-password(可选)
    • 信任库类型:vault.ssl.trust-store-type(可选,通常为 jks,也支持 pem)
    • 启用的 SSL/TLS 协议:vault.ssl.enabled-protocols(自 2.3.2 起,可选,协议以逗号分隔)
    • 启用的 SSL/TLS 密码套件:vault.ssl.enabled-cipher-suites(自 2.3.2 起,可选,密码套件以逗号分隔)
  • 认证方法:vault.authentication(默认为 TOKEN,支持的认证方法有:TOKEN、APPROLE、AWS_EC2、AWS_IAM、AZURE、CERT、CUBBYHOLE、KUBERNETES)

认证特定属性键

  • Vault 令牌:vault.token
  • AppRole 路径:vault.app-role.app-role-path(默认为 approle)
  • 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)
  • 身份文档 URL:vault.aws-ec2.identity-document(默认为 [169.254.169.254/latest/dynamic/instance-identity/pkcs7](http://169.254.169.254/latest/dynamic/instance-identity/pkcs7))
  • 角色:vault.aws-iam.role
  • Azure MSI 路径:vault.azure-msi.azure-path(默认为 azure)
  • 角色:vault.azure-msi.role
  • 元数据服务 URL:vault.azure-msi.metadata-service(默认为 [169.254.169.254/metadata/instance?api-version=2017-08-01](http://169.254.169.254/metadata/instance?api-version=2017-08-01))
  • 身份 TokenService URL:vault.azure-msi.identity-token-service(默认为 [169.254.169.254/metadata/identity/oauth2/token?resource=https://vault.hashicorp.com&api-version=2018-02-01](http://169.254.169.254/metadata/identity/oauth2/token?resource=https://vault.hashicorp.com&api-version=2018-02-01))

没有配置选项。

  • 初始 Vault 令牌:vault.token
  • Kubernetes 路径:vault.kubernetes.kubernetes-path(默认为 kubernetes)
  • 角色:vault.kubernetes.role
  • 服务账户令牌文件的路径:vault.kubernetes.service-account-token-file(默认为 /var/run/secrets/kubernetes.io/serviceaccount/token)

执行回调​

所有 Spring 模板类的一个常见设计特性是,所有功能都被路由到模板的执行回调方法之一。这有助于确保可能需要的异常和任何资源管理都被一致地执行。虽然这在 JDBC 和 JMS 的情况下比在 Vault 的情况下有更大的需求,但它仍然为访问和日志记录提供了一个单一的位置。因此,使用执行回调是访问 Vault API 以执行我们未在 VaultTemplate 上暴露为方法的非常规操作的首选方式。

以下是执行回调方法的列表。

  • <T> T doWithVault (RestOperationsCallback<T> callback) 执行给定的 RestOperationsCallback,允许使用 RestOperations 与 Vault 交互,而无需会话。
  • <T> T doWithSession (RestOperationsCallback<T> callback) 执行给定的 RestOperationsCallback,允许在已认证的会话中与 Vault 交互。

下面是一个使用 ClientCallback 初始化 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();
}
});