1. 概要

HashiCorpのVaultは、シークレットを保存および保護するためのツールです。 一般に、Vaultは、シークレットの管理方法に関するソフトウェア開発のセキュリティ問題を解決します。 詳細については、こちらの記事をご覧ください。

Spring Vault は、HashiCorpのVaultにSpringの抽象化を提供します。

このチュートリアルでは、Vaultからシークレットを保存および取得する方法の例について説明します。

2. Mavenの依存関係

まず、SpringVaultでの作業を開始するために必要な依存関係を見てみましょう。

<dependencies>
    <dependency>
        <groupId>org.springframework.vault</groupId>
        <artifactId>spring-vault-core</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
</dependencies>

spring-vault-core の最新バージョンは、 MavenCentralにあります。

3. Vaultの構成

次に、Vaultを構成するために必要な手順を実行してみましょう。

3.1. VaultTemplateの作成

シークレットを保護するには、VaultEndpointおよびTokenAuthenticationインスタンスが必要なVaultTemplateをインスタンス化する必要があります。

VaultTemplate vaultTemplate = new VaultTemplate(new VaultEndpoint(), 
  new TokenAuthentication("00000000-0000-0000-0000-000000000000"));

3.2. VaultEndpointの作成

VaultEndpointをインスタンス化する方法はいくつかあります。 それらのいくつかを見てみましょう。

1つ目は、デフォルトのコンストラクターを使用してインスタンス化するだけです。これにより、 http:// localhost:8200:を指すデフォルトのエンドポイントが作成されます。

VaultEndpoint endpoint = new VaultEndpoint();

もう1つの方法は、Vaultのホストとポートを指定してVaultEndpointを作成することです。

VaultEndpoint endpoint = VaultEndpoint.create("host", port);

そして最後に、VaultのURLから作成することもできます。

VaultEndpoint endpoint = VaultEndpoint.from(new URI("vault uri"));

ここで注意すべき点がいくつかあります。Vaultは、このアプリケーションを実行するために00000000-0000-0000-0000-000000000000のルートトークンで構成されます。

この例では、 TokenAuthentication を使用しましたが、他の認証方法もサポートされています。

4. Springを使用したVaultBeanの構成

Springを使用すると、いくつかの方法でVaultを構成できます。 1つはAbstractVaultConfiguration、を拡張する方法で、もう1つはSpringの環境プロパティを利用するEnvironmentVaultConfigurationを使用する方法です。

ここで、両方の方法について説明します。

4.1. AbstractVaultConfigurationを使用する

AbstractVaultConfiguration、を拡張してSpringVaultを構成するクラスを作成しましょう。

@Configuration
public class VaultConfig extends AbstractVaultConfiguration {

    @Override
    public ClientAuthentication clientAuthentication() {
        return new TokenAuthentication("00000000-0000-0000-0000-000000000000");
    }

    @Override
    public VaultEndpoint vaultEndpoint() {
        return VaultEndpoint.create("host", 8020);
    }
}

このアプローチは、前のセクションで見たものと似ています。 違いは、Spring Vaultを使用して、抽象クラスAbstractVaultConfiguration。を拡張することでVaultBeanを構成したことです。

VaultEndpointおよびClientAuthenticationを構成するための実装を提供する必要があります。

4.2. EnvironmentVaultConfigurationを使用する

EnvironmentVaultConfigurationを使用してSpringVaultを構成することもできます。

@Configuration
@PropertySource(value = { "vault-config.properties" })
@Import(value = EnvironmentVaultConfiguration.class)
public class VaultEnvironmentConfig {
}

EnvironmentVaultConfiguration は、SpringのPropertySourceを使用してVaultBeanを構成します。 プロパティファイルにいくつかの受け入れ可能なエントリを提供する必要があります。

事前定義されたすべてのプロパティの詳細については、公式ドキュメントを参照してください。

Vaultを構成するには、少なくとも2つのプロパティが必要です。

vault.uri=https://localhost:8200
vault.token=00000000-0000-0000-0000-000000000000

5. 秘密を守る

ユーザー名とパスワードにマップする単純なCredentialsクラスを作成します。

public class Credentials {

    private String username;
    private String password;
    
    // standard constructors, getters, setters
}

それでは、 VaultTemplate:を使用してCredentialsオブジェクトを保護する方法を見てみましょう。

Credentials credentials = new Credentials("username", "password");
vaultTemplate.write("secret/myapp", credentials);

これらの行が完了すると、シークレットが保存されます。

次に、それらにアクセスする方法を見ていきます。

6. 秘密へのアクセス

VaultTemplateのread()メソッドを使用して、保護されたシークレットにアクセスできます。は、応答としてVaultResponseSupportを返します。

VaultResponseSupport<Credentials> response = vaultTemplate
  .read("secret/myapp", Credentials.class);
String username = response.getData().getUsername();
String password = response.getData().getPassword();

私たちの秘密の価値観はこれで準備ができています。

7. 結論

この記事では、Spring Vaultの基本について学び、Vaultが一般的なシナリオでどのように機能するかを示す例を示します。

いつものように、ここに示されているソースコードはGitHubにあります。