Spring Vault

春の金庫

1. 概要

HashiCorp’s Vaultは、シークレットを保存および保護するためのツールです。 一般に、Vaultは、秘密の管理方法に関するソフトウェア開発のセキュリティ問題を解決します。 詳細については、our article hereを確認してください。

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

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

2. Mavenの依存関係

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


    
        org.springframework.vault
        spring-vault-core
        2.0.1.RELEASE
    

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

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を使用しましたが、他のauthentication methodsもサポートされています。

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

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

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

VaultEndpointClientAuthenticationを構成するための実装を提供する必要があります。

4.2. EnvironmentVaultConfigurationの使用

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

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

EnvironmentVaultConfigurationは、SpringのPropertySourceを使用してVaultBeanを構成します。 プロパティファイルに受け​​入れ可能なエントリを提供するだけです。

事前定義されたすべてのプロパティの詳細については、official documentationをご覧ください。

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. 秘密へのアクセス

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

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

これで秘密の価値が準備できました。

7. 結論

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

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