VaultTemplate 简介
类VaultTemplate
,位于包装中org.springframework.vault.core
,
是 Spring 的 Vault 支持的中心类,它提供了丰富的功能集
与 Vault 交互。该模板提供了方便的读取、写入和
删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。
配置完成后,VaultTemplate 是线程安全的,并且可以在
多个实例。 |
Vault 文档和域类之间的映射是通过委托给RestTemplate
.Spring Web 支持提供了映射基础结构。
这VaultTemplate
类实现接口VaultOperations
.
尽可能地使用VaultOperations
以方法
在 Vault API 上提供,以使现有 Vault 开发人员熟悉 API
他们习惯了 API 和 CLI。例如,您将找到诸如
“write”、“delete”、“read” 和 “revoke”。
设计目标是尽可能轻松地在
使用 Vault API 和VaultOperations
.两者之间的主要区别
这两个 API 是VaultOperations
可以传递域对象而不是
JSON 键值对。
引用VaultTemplate 实例
通过其接口VaultOperations . |
虽然 上有许多方便的方法VaultTemplate
轻松帮助您
如果您需要直接访问 Vault API 以访问
未由VaultTemplate
您可以使用以下
多个 execute 回调方法以访问底层 API。执行回调
将为您提供对RestOperations
对象。
有关更多信息,请参阅 执行回调 部分。
现在让我们看看如何在 Spring 容器的上下文中使用 Vault 的示例。
注册和配置 Spring Vault bean
使用 Spring Vault 不需要 Spring Context。但是,VaultTemplate
和SessionManager
在 Managed Context 中注册将参与
在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处理活动的 Vault 会话非常有用
应用程序关闭。您还可以从重复使用中受益VaultTemplate
实例。
Spring Vault 附带了一个支持 bean 定义的配置类
在 Spring 上下文中使用。应用程序配置
类通常从AbstractVaultConfiguration
并且需要
提供特定于环境的其他详细信息。
扩展自AbstractVaultConfiguration
需要实现VaultEndpoint vaultEndpoint()
和ClientAuthentication 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 | 此示例使用TokenAuthentication 以快速入门。
有关支持的身份验证方法的详细信息,请参阅 [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 可以使用各种工厂方法构建,例如from(URI uri) 或VaultEndpoint.create(String host, int port) . |
2 | 的依赖项ClientAuthentication 方法可以从AbstractVaultConfiguration 或由您的配置提供。 |
在某些情况下,创建自定义配置类可能会很麻烦。
查看EnvironmentVaultConfiguration 允许使用
来自现有属性源的 properties 和 Spring 的Environment .阅读更多
在用EnvironmentVaultConfiguration . |
会话管理
Spring Vault 需要一个ClientAuthentication
以登录和访问 Vault。
有关身份验证的详细信息,请参阅 [vault.core.authentication]。
Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但
必须在整个会话中重复使用。这方面由SessionManager
实现。一个SessionManager
决定它的频率
获取 Token,关于 Revocation 和 Renewal。Spring Vault 带有两个实现:
-
SimpleSessionManager
:仅从提供的ClientAuthentication
无刷新和吊销 -
LifecycleAwareSessionManager
:这SessionManager
schedules 令牌 如果令牌可续订,则续订,并在处置时撤销登录令牌。 续订计划使用AsyncTaskExecutor
.LifecycleAwareSessionManager
如果使用AbstractVaultConfiguration
.
用EnvironmentVaultConfiguration
Spring Vault 包括EnvironmentVaultConfiguration
从 Spring 的Environment
和一组预定义的
属性键。EnvironmentVaultConfiguration
支持经常应用的配置。通过从最合适的配置类派生来支持其他配置。
包括EnvironmentVaultConfiguration
跟@Import(EnvironmentVaultConfiguration.class)
到现有
基于 Java 的配置类,并通过 Spring 的任何PropertySource
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-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
,APPID
,APPROLE
,AWS_EC2
,AWS_IAM
,AZURE
,CERT
,CUBBYHOLE
,KUBERNETES
)
特定于身份验证的属性键
-
Vault 代币:
vault.token
-
AppId 路径:
vault.app-id.app-id-path
(默认为app-id
) -
AppId 中:
vault.app-id.app-id
-
用户 ID (UserId):
vault.app-id.user-id
.MAC_ADDRESS
和IP_ADDRESS
用MacAddressUserId
各自IpAddressUserId
用户 ID 机制。 任何其他值与StaticUserId
.
-
AppRole 路径:
vault.app-role.app-role-path
(默认为approle
) -
RoleId 中:
vault.app-role.role-id
-
SecretId 的 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
)
-
角色:
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
) -
Identity 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
)
无配置选项。
-
初始 Vault Token:
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 中的需求要大得多,但它仍然提供了一个访问和日志记录的单一位置。
因此,使用 execute 回调是访问 Vault API 的首选方式
执行我们尚未作为方法公开的不常见作VaultTemplate
.
以下是 execute 回调方法的列表。
-
<T> T
doWithVault(RestOperationsCallback<T> callback)
执行给定的RestOperationsCallback
,允许使用RestOperations
而无需会话。 -
<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();
}
});