Spring Vault

1概要

  • HashiCorp’s Vault ** は秘密を保存して保護するためのツールです。 Vaultは、一般的に、秘密の管理方法に関するソフトウェア開発のセキュリティ問題を解決します。詳細については、https://www.baeldung.com/vaultを参照してください。

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

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

2 Mavenの依存関係

まず始めに、Spring Vaultを使い始めるために必要な依存関係を見てみましょう。

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

spring-vault-core の最新版はhttps://search.maven.org/search?q=g:org.springframework.vault%20AND%20a:spring-vault-coreにあります

** 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 を使用しましたが、他にもhttps://docs.spring.io/spring-vault/docs/current/reference/html/index.html#vault.core.authentication[認証方法]があります。同様にサポートされています。

4 Spring を使用したVault Beansの設定

Springでは、Vaultをいくつかの方法で設定できます。 1つは AbstractVaultConfigurationを拡張することによるもので、もう1つはSpringの環境プロパティを利用する __EnvironmentVaultConfigurationを使うことによるものです。

私たちは今、両方の方法を見ていきます。

4.1. AbstractVaultConfiguration を使用する

Spring Vaultを設定するために__AbstractVaultConfigurationを拡張するクラスを作成しましょう。

@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);
    }
}

このアプローチは前のセクションで見たものと似ています。

違いは、抽象クラス AbstractVaultConfiguration. を拡張することによって、Spring Vaultを使用してVault Beanを設定したことです。

VaultEndpoint ClientAuthentication を設定するための実装を提供するだけです。

4.2. EnvironmentVaultConfiguration を使用する

EnviromentVaultConfiguration を使ってSpring Vaultを設定することもできます。

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

EnvironmentVaultConfiguration は、Springの PropertySource を使用してVault Beanを構成します。プロパティファイルに適切なエントリをいくつか指定する必要があります。

すべての定義済みプロパティの詳細については、https://docs.spring.io/spring-vault/docs/current/reference/html/index.html#vault.core.environment-vault-configuration[officialにあります。ドキュメンテーション]。

Vaultを設定するには、少なくともいくつかのプロパティが必要です。

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<Credentials> response = vaultTemplate
  .read("secret/myapp", Credentials.class);
String username = response.getData().getUsername();
String password = response.getData().getPassword();

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

7. 結論

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

いつものように、ここに提示されているソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-vault[over on GitHub]にあります。