1. 概要

このチュートリアルでは、Spring BootアプリケーションでHashicorpのVaultを使用して、機密性の高い構成データを保護する方法を示します。

ここでは、Vaultに関する知識があり、テストセットアップがすでに稼働していることを前提としています。 そうでない場合は、 Vault Introチュートリアルを読んで、その基本を理解してください。

2. Spring Cloud Vault

Spring Cloud Vaultは、Spring Cloudスタックに比較的最近追加されたもので、アプリケーションがVaultインスタンスに保存されているシークレットに透過的にアクセスできるようにします

一般に、Vaultへの移行は非常に単純なプロセスです。必要なライブラリを追加し、プロジェクトにいくつかの構成プロパティを追加するだけで、準備が整います。 コードの変更は必要ありません!

これが可能なのは、現在の環境に登録されている優先度の高いPropertySourceとして機能するためです。

そのため、Springはプロパティが必要な場合はいつでもそれを使用します。 例としては、 DataSource プロパティ、 ConfigurationProperties、などがあります。

3. SpringCloudVaultをSpringBootプロジェクトに追加する

spring-cloud-vaultライブラリをMavenベースのSpringBootプロジェクトに含めるために、関連する starter アーティファクトを使用します。これにより、必要なすべての依存関係がプルされます。

メインのスターターに加えて、には spring -vault-config-databases も含まれます。これにより、動的データベース資格のサポートが追加されます。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-vault-config-databases</artifactId>
</dependency>

Spring Cloud Vaultスターターの最新バージョンは、MavenCentralからダウンロードできます。

3.1. 基本構成

Spring Cloud Vaultが正しく機能するためには、Vaultサーバーに接続する場所と、Vaultサーバーに対して自身を認証する方法を決定する方法が必要です。

これを行うには、application.ymlまたはapplication.propertiesで必要な情報を提供します。

spring:
  cloud:
    vault:
      uri: https://localhost:8200
      ssl:
        trust-store: classpath:/vault.jks
        trust-store-password: changeit
  config:
    import: vault:// 

spring .cloud.vault.uri プロパティは、VaultのAPIアドレスを指します。 テスト環境では自己署名証明書を使用してHTTPSを使用するため、公開鍵を含むキーストアも提供する必要があります。

この構成には認証データがないことに注意してください。 固定トークンを使用する最も単純なケースでは、システムプロパティspring.cloud.vault.tokenまたは環境変数を介してトークンを渡すことができます。 このアプローチは、KubernetesのConfigMapsやDockerシークレットなどの標準のクラウド構成メカニズムと組み合わせて使用するとうまく機能します。

Spring Vaultでは、アプリケーションで使用するシークレットのタイプごとに追加の構成も必要です。 次のセクションでは、キー/値とデータベースクレデンシャルという2つの一般的なシークレットタイプにサポートを追加する方法について説明します。

4. GenericSecretsバックエンドの使用

Generic Secretバックエンドを使用して、Vaultにキーと値のペアとして保存されているバージョン管理されていないシークレットにアクセスします。

クラスパスspring-cloud-starter-vault-config依存関係がすでにあると仮定すると、application.ymlにいくつかのプロパティを追加するだけです。 ファイル:

spring:
  cloud:
    vault:
      # other vault properties omitted ...
      generic:
        enabled: true
        application-name: fakebank

この場合、プロパティapplication-nameはオプションです。 指定しない場合、Springは代わりに標準のspring.application.nameの値を想定します。

これで、に保存されているすべてのキーと値のペアを使用できます。 シークレット/フェイクバンク他のように環境財産次のスニペットは、の値を読み取る方法を示しています foo このパスの下に保存されているキー:

@Autowired Environment env;
public String getFoo() {
    return env.getProperty("foo");
}

ご覧のとおり、コード自体はVaultについて何も知りません。これは良いことです。 アプリケーション.ymlで単一のプロパティを有効にするだけで、ローカルテストで固定プロパティを使用し、Vaultに切り替えることができます。

4.1. 春のプロファイルに関する注記

現在の環境で利用可能な場合、 Spring Cloud Vault は、キーと値のペアが検索される指定されたベースパスに追加されるサフィックスとして利用可能なプロファイル名を使用します

また、構成可能なデフォルトのアプリケーションパス(プロファイルサフィックスがある場合とない場合)でプロパティを検索するため、単一の場所でシークレットを共有できます。 この機能は注意して使用してください。

要約すると、out fakebankアプリケーションのproductionプロファイルがアクティブな場合、SpringVaultは次のパスに格納されているプロパティを検索します。

  1. シークレット/フェイクバンク/プロダクション(優先度が高い)
  2. シークレット/フェイクバンク
  3. シークレット/アプリケーション/プロダクション
  4. シークレット/アプリケーション(優先度が低い)

上記のリストで、 application は、Springがシークレットのデフォルトの追加の場所として使用する名前です。 spring.cloud.vault.generic.default-contextプロパティを使用して変更できます。

最も具体的なパスの下に保存されているプロパティは、他のプロパティよりも優先されます。 たとえば、同じプロパティ foo が上記のパスで使用できる場合、優先順位は次のようになります。

5. データベースシークレットバックエンドの使用

データベースバックエンドモジュールを使用すると、SpringアプリケーションはVaultによって作成された動的に生成されたデータベースクレデンシャルを使用できます。 Spring Vaultは、これらのクレデンシャルを標準のspring.datasource.usernameおよびspring.datasource.passwordプロパティで挿入するため、通常のDataSourceで選択できます。

このバックエンドを使用する前に、前のチュートリアルで説明されているように、Vaultでデータベース構成とロールを作成する必要があることに注意してください。

Vaultで生成されたデータベースクレデンシャルをSpringアプリケーションで使用するには、 spring -cloud-vault-config-databases が、対応するJDBCドライバーとともにプロジェクトのクラスパスに存在する必要があります。

また、 application.yml:にいくつかのプロパティを追加して、アプリケーションでの使用を有効にする必要があります。

spring:
  cloud:
    vault:
      # ... other properties omitted
      database:
        enabled: true
        role: fakebank-accounts-rw

ここで最も重要なプロパティはroleプロパティであり、Vaultに格納されているデータベースロール名を保持します。 起動時に、SpringはVaultに連絡し、対応する権限を持つ新しいクレデンシャルを作成するように要求します。

ボールトは、デフォルトで、構成された存続可能時間の後に、これらのクレデンシャルに関連付けられた特権を取り消します。

幸い、 Spring Vaultは、取得したクレデンシャルに関連付けられたリースを自動的に更新します。これにより、アプリケーションが実行されている限り、クレデンシャルは有効なままになります。

それでは、この統合の実際を見てみましょう。 次のスニペットは、Springが管理するDataSourceから新しいデータベース接続を取得します。

Connection c = datasource.getConnection();

もう一度、コードにVaultの使用の兆候がないことがわかります。 すべての統合は環境レベルで行われるため、コードは通常どおり簡単に単体テストできます。

6. 結論

このチュートリアルでは、SpringVaultライブラリを使用してVaultをSpring Bootと統合する方法を示しました。 一般的なキーと値のペアと動的データベースクレデンシャルの2つの一般的なユースケースについて説明しました。

必要なすべての依存関係、統合テスト、およびボールトセットアップスクリプトを含むサンプルプロジェクトは、GitHub利用できます。