└── src
└── main
└── java
└── helloVault へのアクセス
このガイドでは、Spring Vault を使用して、秘密管理ツールである HashiCorp Vault (英語) から秘密をロードするアプリケーションを構築するプロセスを順を追って説明します。
構築するもの
Vault に保存されているシークレットを読み込み、転送暗号化バックエンドを使用します。
必要なもの
約 15 分
Eclipse STS や IntelliJ IDEA のような任意の IDE または VSCode のようなテキストエディター
Java 17 以降
コードを直接 IDE にインポートすることもできます。
本ガイドの完成までの流れ
ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。
最初から始めるには、Gradle でビルドするに進みます。
基本をスキップするには、次の手順を実行します。
このガイドのソースリポジトリをダウンロードして解凍するか、Git を使用してクローンを作成してください:
git clone https://github.com/spring-guides/gs-accessing-vault.gitgs-accessing-vault/initialに cdHashiCorp Vault をインストールして起動するにジャンプしてください。
完了したときは、gs-accessing-vault/complete のコードに対して結果を確認できます。
Gradle でビルドする
Gradle でビルドする
最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Gradle (英語) および Maven (英語) を操作するために必要なコードはここに含まれています。どちらにも詳しくない場合は、Gradle で Java プロジェクトの構築または Maven で Java プロジェクトの構築を参照してください。
ディレクトリ構造を作成する
選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:
Gradle ビルドファイルを作成する
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '4.0.5'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'gs-accessing-vault'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2025.1.1")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-vault-config'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-testcontainers'
testImplementation 'org.testcontainers:testcontainers-junit-jupiter'
testImplementation 'org.testcontainers:testcontainers-vault'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}Spring Boot gradle プラグインは多くの便利な機能を提供します。
クラスパス上のすべての jar を収集し、単一の実行可能な「ü ber-jar」を構築します。これにより、サービスの実行とトランスポートがより便利になります。
public static void main()メソッドを検索して、実行可能なクラスとしてフラグを立てます。Spring Boot の依存関係 [GitHub] (英語) と一致するようにバージョン番号を設定する組み込みの依存関係リゾルバーを提供します。任意のバージョンをオーバーライドできますが、デフォルトで Boot の選択されたバージョンのセットになります。
Maven でビルドする
Maven でビルドする
最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Maven (英語) で作業するために必要なコードはここに含まれています。Maven に詳しくない場合は、Maven で Java プロジェクトの構築を参照してください。
ディレクトリ構造を作成する
選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:
└── src
└── main
└── java
└── hellopom.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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.5</version>
</parent>
<groupId>com.example</groupId>
<artifactId>gs-accessing-vault</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring-cloud.version>2025.1.1</spring-cloud.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-vault</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 の依存関係 [GitHub] (英語) と一致するようにバージョン番号を設定する組み込みの依存関係リゾルバーを提供します。任意のバージョンをオーバーライドできますが、デフォルトで Boot の選択されたバージョンのセットになります。
IDE でビルドする
IDE でビルドする
このガイドを Eclipse Spring Tool Suite に直接インポートする方法を参照してください。
IntelliJ IDEA でこのガイドの使用方法を参照してください。
HashiCorp Vault をインストールして起動する
: インストールリンク: https://developer.hashicorp.com/vault/tutorials/get-started/install-binary
プロジェクトをセットアップしたら、{install-link}[ インストール ] して HashiCorp Vault を起動できます。
自作で Mac を使用している場合、これは次のように簡単です。
$ brew tap hashicorp/tap $ brew install hashicorp/tap/vault
Redhat、Ubuntu、Debian、CentOS、Windows など、パッケージ管理を備えた他のシステムについては、{install-link}[ 公式の手順 ] を参照してください。
Vault をインストールしたら、コンソールウィンドウで起動します。このコマンドは、サーバープロセスも起動します。
$ vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000"
最後の出力行の 1 つとして、次が表示されるはずです。
[INFO ] core: post-unseal setup complete
| 上記のコマンドは、トランスポート暗号化なしでメモリ内ストレージを使用して、Vault を開発モードで開始します。これは、Vault をローカルで評価するのに適しています。運用で使用する場合は、適切な SSL 証明書と信頼できるストレージバックエンドを使用してください。詳細については、Vault の本番硬化ガイド (英語) を参照してください。 |
Vault にシークレットを保存する
Vault は、保管中に暗号化される機密データを保存できる秘密管理システムです。パスワード、暗号化キー、API キーなどの重要な設定の詳細を保存することが理想的です。
別のコンソールウィンドウを起動して、Vault コマンドラインを使用して、Vault にアプリケーション構成を保存します。
最初に、Vault CLI が Vault エンドポイントを指すように 2 つの環境変数を設定し、認証トークンを提供する必要があります。
$ 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
アプリケーションを構成する
ここでは、application.properties を使用してアプリケーションを構成します。Spring Cloud Vault は、ブートストラップコンテキストで構成されます。
src/main/resources/application.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.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
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 {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
ApplicationRunner runner(VaultTemplate vaultTemplate) {
return args -> {
// You usually would not print a secret to stdout
VaultResponse response = vaultTemplate
.opsForKeyValue("secret", KeyValueBackend.KV_2).get("github");
if (response == null) {
throw new IllegalStateException("No data found in secret/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 には、MyConfiguration のインスタンスをオートワイヤーする main() メソッドが含まれています。
実行可能 JAR を構築する
コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、リソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、デプロイできます。
Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。
Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。
Application は ApplicationRunner Bean を公開しているため、Spring Boot の起動時に自動的に呼び出されます。次のような画面が表示されます。
Value of github.oauth2.key ------------------------------- foobar ------------------------------- Encrypted value ------------------------------- vault:v1:2wgVE2PXiR9o55xbyur5KHJl8IwyGDkDU4l1SZScUq6BuqZYgTopwvc4 ------------------------------- Decrypted value ------------------------------- Secure message -------------------------------
| Vault の秘密のバックエンドは、URI を使用してドキュメントを識別するドキュメントストアと比較できます。ドキュメントは JSON ベースであり、Vault データの便利なオブジェクトマッピングが可能です。 |
要約
おめでとう! Vault サーバーをセットアップし、Spring Vault を使用して強力な暗号でシークレットを読み取り、データを暗号化するシンプルなアプリケーションを作成しました。すべて、キー管理、暗号モード、パディングを実装するという煩わしさはありません。
新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください [GitHub] (英語) 。
| すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の帰属表示、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。 |