Vault へのアクセス

このガイドでは、Spring Vault を使用して、秘密管理ツールである HashiCorp Vault (英語) から秘密をロードするアプリケーションを構築するプロセスを順を追って説明します。

構築するもの

Vault に保存されているシークレットを読み込み、転送暗号化バックエンドを使用します。

必要なもの

本ガイドの完成までの流れ

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Gradle でビルドするに進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-accessing-vault/complete のコードに対して結果を確認できます。

Gradle でビルドする

Gradle でビルドする

最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Gradle (英語) および Maven (英語) を操作するために必要なコードはここに含まれています。どちらにも詳しくない場合は、Gradle で Java プロジェクトの構築または Maven で Java プロジェクトの構築を参照してください。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

└── 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
            └── 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>
	<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 でビルドする

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 ファイルを実行できます。

java -jar build/libs/gs-accessing-vault-0.0.1-SNAPSHOT.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-accessing-vault-0.0.1-SNAPSHOT.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 クリエイティブコモンズライセンス (英語) でリリースされています。

コードを入手する