本指南将引导您完成使用Spring Cloud Vault构建从Hashicorp Vault检索其配置属性的应用程序的过程。您将启动Vault,在Vault中存储配置属性,构建一个Spring应用程序并将其与Vault连接。
程序结构
└── src
└── main
└── java
└── hello
要快速启动,以下是服务器和客户端应用程序的完整配置:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-vault-config</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<!-- Vault Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Spring Boot将会你做如下的事:
- 将 classpath 里面所有用到的jar包构建成一个可执行的 JAR 文件,方便执行你的程序
- 搜索public static void main()方法并且将它当作可执行类
- 根据springboot版本,去查找相应的依赖类版本,当然你可以定义其它版本。
安装并运行HashiCorp Vault
如果使用Mac,如下安装:
$ brew install vault
或者,从这里下载https://www.vaultproject.io/downloads.html
:
$ https://releases.hashicorp.com/vault/0.8.3/vault_0.8.3_darwin_amd64.zip
$ unzip vault_0.8.3_darwin_amd64.zip
对于其他具有包管理的系统,如RedHat、Ubuntu、Debian、CentOS和Windows,请参阅https://www.vaultproject.io/docs/install/index.html上的说明。
安装Vault后,在控制台窗口中启动它。此命令还启动服务器进程。
$ vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000"
你将看到如下输出:
[INFO ] core: post-unseal setup complete
上面的命令在开发模式下使用内存存储启动Vault ,而不使用传输加密。这对于本地评估Vault 很好。确保使用适当的SSL证书和可靠的存储后端以供生产使用。有关更多详细信息,请参阅Vault的《生产硬性指南》。
在Vault存储配置信息
Vault是一个机密管理系统,允许您存储静态加密的敏感数据。它非常适合存储敏感的配置信息,如密码、加密密钥、API密钥。
你可以启动另一个控制台窗口,使用Vault 命令行将应用程序配置存储在vault中。
首先,需要设置两个环境变量,将Vault CLI 指向vault端点并提供身份验证令牌。
$ export export VAULT_TOKEN="00000000-0000-0000-0000-000000000000"
$ export VAULT_ADDR="http://127.0.0.1:8200"
现在,您可以在Vault中存储配置键值对:
$ vault write secret/gs-vault-config example.username=demouser example.password=demopassword
$ vault write secret/gs-vault-config/cloud example.username=clouduser example.password=cloudpassword
现在,您已经在vault中存了secret/gs-vault-config
和secret/gs-vault-config/cloud
这两个条目。
定义你的配置类
src/main/java/hello/MyConfiguration.java
package hello;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author Mark Paluch
*/
@ConfigurationProperties("example")
public class MyConfiguration {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
配置你的应用程序
在这里,您使用bootstrap.properties
配置应用程序。引导上下文配置了Spring Cloud Vault,,以最初获取配置属性,以便它可以将这些属性提供给自动配置和你的应用程序本身。
src/main/resources/bootstrap.properties
spring.application.name=gs-vault-config
spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true
创建一个Application类
在这里,您创建一个包含所有组件的应用程序类。
src/main/java/hello/Application.java
package hello;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties(MyConfiguration.class)
public class Application implements CommandLineRunner {
private final MyConfiguration configuration;
public Application(MyConfiguration configuration) {
this.configuration = configuration;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
Logger logger = LoggerFactory.getLogger(Application.class);
logger.info("----------------------------------------");
logger.info("Configuration properties");
logger.info(" example.username is {}", configuration.getUsername());
logger.info(" example.password is {}", configuration.getPassword());
logger.info("----------------------------------------");
}
}
Spring Cloud Vault使用VaultOperations与Vault交互。对于类型安全访问,将vault中的属性映射到MyConfiguration。@EnableConfigurationProperties(MyConfiguration.class) 启用配置属性映射并注册MyConfiguration bean。
应用程序包含一个main()方法,该方法自动连接MyConfiguration的实例。
运行并测试程序
当我们的应用程序实现CommandLineRunner时,启动时会自动调用run方法。你应该看到这样的东西:
----------------------------------------
Configuration properties
example.username is demouser
example.password is demopassword
----------------------------------------
现在,在激活 cloud配置文件的情况下启动应用程序。你应该看到这样的东西:
----------------------------------------
Configuration properties
example.username is clouduser
example.password is cloudpassword
----------------------------------------
配置属性根据激活的配置文件绑定。Spring Cloud Vault 从spring.application.name(即gs-vault)构造一个vault上下文路径,并附加概要文件名(cloud),因此启用云概要文件,将从secret/gs-vault-config/cloud
获取额外的配置属性。
祝贺你!您设置了一个Vault 服务器,并编写了一个简单的应用程序,该应用程序使用Spring Vault强大的密码-来读取机密和加密数据,所有这些都不需要你非常麻烦地实现密钥管理、密码模式和填充。