本指南将引导您完成使用Spring Cloud Vault构建可从HashiCorp Vault检索其配置属性的应用程序的过程。

你会建立什么

您将启动Vault,将配置属性存储在Vault中,构建一个Spring应用程序并将其与Vault连接。

你需要什么

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/prereq_editor_jdk_buildtools.adoc []

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/how_to_complete_this_guide.adoc []

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/hide-show-gradle.adoc []

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/hide-show-maven.adoc []

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/hide-show-sts.adoc []

安装并启动HashiCorp Vault

完成项目设置后,您可以安装并启动HashiCorp Vault。

如果您使用的是带有自制软件的Mac,则操作非常简单:

$ brew安装库

或者,从https://www.vaultproject.io/downloads.html下载适用于您操作系统的Vault :

$ https://releases.hashicorp.com/vault/1.2.1/vault_1.2.1_darwin_amd64.zip
$解压缩vault_1.2.1_darwin_amd64.zip

对于其他具有软件包管理的系统,例如Redhat,Ubuntu,Debian,CentOS和Windows,请参阅https://www.vaultproject.io/docs/install/index.html上的说明。

安装Vault后,请在控制台窗口中启动它。此命令还会启动服务器进程。

$ Vault服务器--dev --dev-root-token-id =“ 00000000-0000-0000-0000-000000000000”

您应该将以下内容作为最后的输出行之一:

[INFO]核心:解封后的安装完成
上面的命令在不使用传输加密的情况下使用内存存储以开发模式启动Vault。这适合在本地评估Vault。确保使用适当的SSL证书和可靠的存储后端供生产使用。有关更多详细信息,请查阅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 kv put secret / gs-vault-config example.username = demouser example.password = demopassword
$ vault kv put secret / gs-vault-config / cloud example.username = clouduser example.password = cloudpassword

现在,您已经在Vaultsecret/gs-vault-config和中写入了两个条目secret/gs-vault-config/cloud

定义您的配置类

为您的Spring应用程序创建一个简单的配置:

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进行交互。保险柜中的属性已映射到MyConfiguration类型安全访问。@EnableConfigurationProperties(MyConfiguration.class)启用配置属性映射并注册MyConfigurationBean。

Application包括一种main()自动关联实例的方法MyConfiguration

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/build_an_executable_jar_mainhead.adoc [] /raw.githubusercontent.com/spring-guides/getting-started-macros/main/build_an_executable_jar_with_both.adoc []

作为我们的Application实现CommandLineRunner,该run方法在启动启动时自动调用。您应该会看到类似以下内容的内容:

----------------------------------------
配置属性
        example.username是demouser
        example.password是demopassword
----------------------------------------

现在,在cloud激活配置文件的情况下启动您的应用程序。您应该会看到类似以下内容的内容:

----------------------------------------
配置属性
        example.username是clouduser
        example.password是cloudpassword
----------------------------------------

配置属性根据激活的配置文件进行绑定。Spring Cloud Vault构造一个Vault上下文路径,spring.application.name并从中gs-vault添加配置文件名称(cloud),因此启用cloud配置文件将另外从中获取配置属性secret/gs-vault-config/cloud

概括

恭喜你!您设置了一个Vault服务器,并编写了一个简单的应用程序,该应用程序使用Spring Vault将秘密读取到配置属性中,并使用强密码加密数据-无需费心实现密钥管理,密码模式和填充。

<stdin>中未解决的指令-包括:: https://raw.githubusercontent.com/spring-guides/getting-started-macros/main/footer.adoc []