本指南将引导您完成使用Spring Vault构建可从HashiCorp Vault (机密管理工具)加载机密的应用程序的过程。
你会建立什么
您将加载存储在Vault中的机密,并使用传输加密后端。
你需要什么
-
约15分钟
-
最喜欢的文本编辑器或IDE
-
JDK 1.8或更高版本
-
您还可以将代码直接导入到IDE中:
如何完成本指南
像大多数Spring 入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都可以使用工作代码。
要从头开始 ,请继续使用Gradle构建 。
要跳过基础知识 ,请执行以下操作:
-
下载并解压缩本指南的源存储库,或使用Git对其进行克隆:
git clone https://github.com/spring-guides/gs-accessing-vault.git
-
光盘进入
gs-accessing-vault/initial
完成后 ,您可以根据中的代码检查结果gs-accessing-vault/complete
。
用Gradle构建
用Gradle构建
首先,您设置一个基本的构建脚本。在使用Spring构建应用程序时,可以使用任何喜欢的构建系统,但是此处包含使用Gradle和Maven所需的代码。如果您都不熟悉,请参阅使用Gradle 构建Java项目或使用Maven构建Java项目 。
创建目录结构
在您选择的项目目录中,创建以下子目录结构;例如, mkdir -p src/main/java/hello
在* nix系统上:
└── src └── main └── java └── hello
创建一个Gradle构建文件
以下是最初的Gradle构建文件 。
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.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 Boot gradle插件提供了许多方便的功能:
-
它收集类路径上的所有jar,并构建一个可运行的单个“über-jar”,这使执行和传输服务更加方便。
-
它搜索
public static void main()
标记为可运行类的方法。 -
它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项 。您可以覆盖所需的任何版本,但是它将默认为Boot选择的一组版本。
用Maven构建
用Maven构建
创建目录结构
在您选择的项目目录中,创建以下子目录结构;例如, mkdir -p src/main/java/hello
在* nix系统上:
└── 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-accessing-vault</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>
<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 Boot Maven插件提供了许多方便的功能:
-
它收集类路径上的所有jar,并构建一个可运行的单个“über-jar”,这使执行和传输服务更加方便。
-
它搜索
public static void main()
标记为可运行类的方法。 -
它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项 。您可以覆盖所需的任何版本,但是它将默认为Boot选择的一组版本。
使用您的IDE进行构建
使用您的IDE进行构建
-
阅读如何将本指南直接导入Spring Tool Suite中 。
-
在IntelliJ IDEA中阅读如何使用本指南。
安装并启动HashiCorp Vault
完成项目设置后,您可以安装并启动HashiCorp Vault。
如果您使用的是带有自制软件的Mac,则操作非常简单:
$ brew install vault
或者,从https://www.vaultproject.io/downloads.html下载适用于您的操作系统的Vault:
$ https://releases.hashicorp.com/vault/1.2.1/vault_1.2.1_darwin_amd64.zip $ unzip vault_1.2.1_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 中
保管箱是一个机密管理系统,可让您存储敏感的数据,这些数据在静态时被加密。非常适合存储敏感的配置详细信息,例如密码,加密密钥,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/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 互动。 Vault 中的属性已映射到MyConfiguration
用于类型安全的访问。 @EnableConfigurationProperties(MyConfiguration.class)
启用配置属性映射并注册一个MyConfiguration
bean 。
Application
包括一个main()
自动关联一个实例的方法MyConfiguration
。
构建可执行的JAR
您可以使用Gradle或Maven从命令行运行该应用程序。您还可以构建一个包含所有必需的依赖项,类和资源的可执行JAR文件,然后运行该文件。构建可执行的jar使得在整个开发生命周期中,跨不同环境等等的情况下,可以轻松地将服务作为应用程序进行发布,版本化和部署。
如果您使用Gradle,则可以使用./gradlew bootRun
。或者,您可以通过使用以下命令构建JAR文件: ./gradlew build
然后运行JAR文件,如下所示:
如果使用Maven,则可以通过使用以下命令运行应用程序./mvnw spring-boot:run
。或者,您可以使用以下命令构建JAR文件: ./mvnw clean package
然后运行JAR文件,如下所示:
此处描述的步骤将创建可运行的JAR。您还可以构建经典的WAR文件 。 |
作为我们的Application
贯彻CommandLineRunner
, run
启动启动时会自动调用该方法。您应该会看到以下内容:
Value of github.oauth2.key ------------------------------- foobar ------------------------------- Encrypted value ------------------------------- vault:v1:2wgVE2PXiR9o55xbyur5KHJl8IwyGDkDU4l1SZScUq6BuqZYgTopwvc4 ------------------------------- Decrypted value ------------------------------- Secure message -------------------------------
Vault的秘密后端与使用URI标识文档的文档存储相比非常好。文档基于JSON,可以方便地映射 Vault 数据。 |
摘要
恭喜你!您设置了一个Vault服务器,并编写了一个简单的应用程序,该应用程序使用Spring Vault读取密钥并使用强密码加密数据-无需费心实现密钥管理,密码模式和填充。
是否要编写新指南或为现有指南做出贡献?查看我们的贡献准则 。
所有指南均以代码的ASLv2许可证和写作的Attribution,NoDerivatives创作共用许可证发布 。 |