本指南将引导您完成使用Spring Vault构建可从HashiCorp Vault(机密管理工具)加载机密的应用程序的过程。

你会建立什么

您将加载存储在Vault中的机密,并使用传输加密后端。

你需要什么

如何完成本指南

像大多数Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都可以使用代码。

从头开始,请继续使用Gradle构建

跳过基础知识,请执行以下操作:

完成后,您可以根据中的代码检查结果gs-accessing-vault/complete

用Gradle构建

用Gradle构建

首先,您设置一个基本的构建脚本。在使用Spring构建应用程序时,可以使用任何喜欢的构建系统,但是此处包含使用GradleMaven所需的代码。如果您都不熟悉,请参阅使用Gradle构建Java项目使用Maven构建Java项目

创建目录结构

在您选择的项目目录中,创建以下子目录结构;例如,mkdir -p src/main/java/hello在* nix系统上:

└──src
    main──主要
        └──java
            └──你好

创建一个Gradle构建文件

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.2.1.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-accessing-vault'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

ext {
    springCloudVersion = 'Greenwich.SR2'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-vault-config')
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

Spring的Gradle启动插件提供了许多便捷的功能:

  • 它收集类路径上的所有jar,并构建一个可运行的单个“über-jar”,这使执行和传输服务更加方便。

  • 它搜索public static void main()要标记为可运行类的方法。

  • 它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项。您可以覆盖所需的任何版本,但是它将默认为Boot选择的一组版本。

用Maven编译

用Maven编译

首先,您设置一个基本的构建脚本。使用Spring构建应用程序时,可以使用任何喜欢的构建系统,但是此处包含了使用Maven所需的代码。如果您不熟悉Maven,请参阅使用Maven构建Java项目

创建目录结构

在您选择的项目目录中,创建以下子目录结构;例如,mkdir -p src/main/java/hello在* nix系统上:

└──src
    main──主要
        └──java
            └──你好

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-accessing-vault</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Spring启动Maven插件提供了许多便捷的功能:

  • 它收集类路径上的所有jar,并构建一个可运行的单个“über-jar”,这使执行和传输服务更加方便。

  • 它搜索public static void main()要标记为可运行类的方法。

  • 它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项。您可以覆盖所需的任何版本,但是它将默认为Boot选择的一组版本。

使用您的IDE进行构建

使用您的IDE进行构建

安装并启动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的生产强化指南

将机密存储在保险柜中

保险柜是一个秘密管理系统,可让您存储敏感数据,这些数据在静止状态下会被加密。非常适合存储敏感的配置详细信息,例如密码,加密密钥,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中存储配置键值对:

$金库kv放秘密/ github github.oauth2.key = foobar

配置您的应用程序

在这里,您可以使用配置您的应用程序bootstrap.properties。Spring Cloud Vault使用引导上下文配置。

src/main/resources/bootstrap.properties

spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http

创建一个应用程序类

在这里,您将创建一个具有所有组件的Application类。

src/main/java/hello/Application.java

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.vault.core.VaultKeyValueOperationsSupport.KeyValueBackend;
import org.springframework.vault.core.VaultSysOperations;
import org.springframework.vault.core.VaultTemplate;
import org.springframework.vault.core.VaultTransitOperations;
import org.springframework.vault.support.VaultMount;
import org.springframework.vault.support.VaultResponse;

@SpringBootApplication
public class Application implements CommandLineRunner {

  @Autowired
  private VaultTemplate vaultTemplate;

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(String... strings) throws Exception {

    // You usually would not print a secret to stdout
    VaultResponse response = vaultTemplate
        .opsForKeyValue("secret", KeyValueBackend.KV_2).get("github");
    System.out.println("Value of github.oauth2.key");
    System.out.println("-------------------------------");
    System.out.println(response.getData().get("github.oauth2.key"));
    System.out.println("-------------------------------");
    System.out.println();

    // Let's encrypt some data using the Transit backend.
    VaultTransitOperations transitOperations = vaultTemplate.opsForTransit();

    // We need to setup transit first (assuming you didn't set up it yet).
    VaultSysOperations sysOperations = vaultTemplate.opsForSys();

    if (!sysOperations.getMounts().containsKey("transit/")) {

      sysOperations.mount("transit", VaultMount.create("transit"));

      transitOperations.createKey("foo-key");
    }

    // Encrypt a plain-text value
    String ciphertext = transitOperations.encrypt("foo-key", "Secure message");

    System.out.println("Encrypted value");
    System.out.println("-------------------------------");
    System.out.println(ciphertext);
    System.out.println("-------------------------------");
    System.out.println();

    // Decrypt

    String plaintext = transitOperations.decrypt("foo-key", ciphertext);

    System.out.println("Decrypted value");
    System.out.println("-------------------------------");
    System.out.println(plaintext);
    System.out.println("-------------------------------");
    System.out.println();
  }
}

Spring Cloud Vault用于VaultOperations与Vault进行交互。保险柜中的属性已映射到MyConfiguration类型安全访问。@EnableConfigurationProperties(MyConfiguration.class)启用配置属性映射并注册MyConfigurationBean。

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

建立可执行的JAR

您可以使用Gradle或Maven从命令行运行该应用程序。您还可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,然后运行该文件。生成可执行jar使得在整个开发生命周期中,跨不同环境等等的情况下,都可以轻松地将服务作为应用程序进行发布,版本控制和部署。

如果您使用Gradle,则可以使用来运行该应用程序./gradlew bootRun。或者,您可以使用来构建JAR文件./gradlew build,然后运行JAR文件,如下所示:

java -jar build / libs / gs-accessing-vault-0.1.0.jar

如果您使用Maven,则可以使用来运行该应用程序./mvnw spring-boot:run。或者,您可以使用来构建JAR文件,./mvnw clean package然后运行JAR文件,如下所示:

java -jar target / gs-accessing-vault-0.1.0.jar
此处描述的步骤将创建可运行的JAR。您还可以构建经典的WAR文件

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

github.oauth2.key的值
-------------------------------
foob​​ar
-------------------------------

加密值
-------------------------------
保险库:v1:2wgVE2PXiR9o55xbyur5KHJl8IwyGDkDU4l1SZScUq6BuqZYgTopwvc4
-------------------------------

解密值
-------------------------------
安全信息
-------------------------------
Vault的秘密后端与使用URI标识文档的文档存储相比非常好。文档基于JSON,可方便地对Vault数据进行对象映射。

概括

恭喜你!您设置了一个Vault服务器,并编写了一个简单的应用程序,该应用程序使用Spring Vault来读取机密信息并使用强大的密码对数据进行加密-无需费心实现密钥管理,密码模式和填充。

是否要编写新指南或为现有指南做出贡献?查看我们的贡献准则

所有指南均以代码的ASLv2许可证和写作的Attribution,NoDerivatives创用CC许可证发布。