Spring Cloud Vaultの紹介

1.概要

このチュートリアルでは、Spring BootアプリケーションでHashicorpのVaultを使用して機密の設定データを保護する方法を説明します。

  • ここではVaultについてある程度の知識があり、テストセットアップがすでに実行されていることを前提としています。そうでない場合は、https://www.baeldung.com/vault[Vault Intro tutorial]を読んで、基本について理解してください。

2. Spring Cloud Vault

Spring Cloud VaultはSpring Cloudスタックに比較的最近追加されたもので、これによりアプリケーションはVaultインスタンスに格納されている秘密に透過的な方法でアクセスできます。

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

これは現在の環境に登録されている優先順位の高いプロパティソースとして機能するため可能です。

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

3. Spring BootプロジェクトへのSpring Cloud Vaultの追加

MavenベースのSpring Bootプロジェクトに spring-cloud-vault ライブラリを含めるには、必要なすべての依存関係を取得する、関連付けられた starter アーティファクトを使用します。

メインの 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スターター はMaven Centralからダウンロードできます。

3.1. 基本構成

Spring Cloud Vaultが正しく機能するためには、Vaultサーバへのアクセス先とそれに対する認証方法を決定する方法が必要です。

これを行うには、必要な情報を bootstrap.yml または bootstrap.properties に指定します。

# bootstrap.yml
spring:
  cloud:
    vault:
      uri: https://localhost:8200
      ssl:
        trust-store: classpath:/vault.jks
        trust-store-password: changeit

spring.cloud.vault.uri プロパティは、VaultのAPIアドレスを指しています。

私たちのテスト環境は自己署名証明書でHTTPSを使っているので、私たちはその公開鍵を含むキーストアも提供する必要があります。

  • この設定には認証データがありません** 。最も単純な場合、固定トークンを使用する場合は、システムプロパティ spring.cloud.vault.token または環境変数を介して渡すことができます。

このアプローチは、KubernetesのConfigMapsやDockerの秘密などの標準的なクラウド設定メカニズムと連携してうまく機能します。

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

4.一般的な秘密バックエンドの使用

  • Vaultにキーと値のペアとして格納されている version 秘密にアクセスするためにGeneric Secretバックエンドを使用します。

classpath spring-cloud-starter-vault-config 依存関係が既にあると仮定すると、あとはアプリケーションの bootstrap.yml 設定ファイルにいくつかのプロパティを追加するだけです。

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

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

secret/fakebank に格納されているすべてのキー/値ペアを他の Environment プロパティ __. として使用できます。次のスニペットは、このパスに格納されている foo__キーの値を読み取る方法を示しています。

@Autowired Environment env;
public String getFoo() {
    return env.getProperty("foo");
}
  • ご覧のとおり、コード自体はVaultについては何も認識していません** 。これは良いことです。 bootstrap.yml で単一のプロパティを有効にするだけで、ローカルテストで固定プロパティを使用してVaultに切り替えることができます。

4.1. 春のプロフィール

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

また、設定可能なデフォルトのアプリケーションパス(プロファイルサフィックスの有無にかかわらず)の下でプロパティを検索するため、単一の場所で共有秘密を保持できます。この機能は慎重に使用してください。

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

  1. _secret/ fakebank /production_ (優先順位が高い)

  2. _secret/ _ fakebank

  3. secret/application/production

  4. secret/application (優先度の低い方)

上記のリストで、 application は、Springが秘密のデフォルトの追加の場所として使用する名前です。 spring.cloud.vault.generic.default-context プロパティを使ってそれを修正することができます。

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

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

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

このバックエンドを使用する前に、https://www.baeldung.com/vault[以前のチュートリアル]で説明されているように、Vaultでデータベース構成とロールを作成する必要があります。

私たちのSpringアプリケーションでVaultが生成したデータベース認証情報を使うためには、 spring-cloud-vault-config-databases が対応するJDBCドライバと共にプロジェクトのクラスパスに存在しなければなりません。

__bootstrap.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の使用状況の兆候は見られません。すべての統合は Environment レベルで行われるので、私たちのコードはいつものように簡単にユニットテストすることができます。

6.まとめ

このチュートリアルでは、Spring Vaultライブラリを使用してVaultとSpring Bootを統合する方法を説明しました。一般的な2つのユースケースについて説明しました。

一般的なキーと値のペア、および動的データベースの資格情報。

必要なすべての依存関係、統合テスト、およびボールト設定スクリプトを含むサンプルプロジェクトは、https://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-vault[over on GitHub]にあります。