Spring Cloud Vaultの紹介

Spring Cloud Vaultの紹介

1. 概要

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

We assume here some Vault knowledge and that we have a test setup already up and running。 そうでない場合は、Vault Intro tutorialを読んで、その基本を理解できるようにしましょう。

2. Spring Cloud Vault

Spring Cloud Vaultは、allows applications to access secrets stored in a Vault instance in a transparent wayという比較的最近のSpringCloudスタックへの追加です。

一般に、Vaultへの移行は非常に簡単なプロセスです。必要なライブラリを追加し、プロジェクトにいくつかの追加の構成プロパティを追加するだけで、準備完了です。 No code changes are required!

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

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

3. Spring Cloud VaultをSpring Bootプロジェクトに追加する

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

メインのstarter,の他に、動的データベース資格情報のサポートを追加するspring-vault-config-databasesも含まれます。


    org.springframework.cloud
    spring-cloud-starter-vault-config


    org.springframework.cloud
    spring-cloud-vault-config-databases

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

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を使用しているため、公開キーを含むキーストアも提供する必要があります。

Note that this configuration has no authentication data。 固定トークンを使用する最も単純なケースでは、システムプロパティspring.cloud.vault.tokenまたは環境変数を介してトークンを渡すことができます。 このアプローチは、KubernetesのConfigMapやDockerシークレットなどの標準的なクラウド構成メカニズムと連携してうまく機能します。

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

4. Generic Secretsバックエンドの使用

We use the Generic Secret backend to access unversioned secrets stored as Key-Value pairs in Vault

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

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

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

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

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

As we can see, the code itself knows nothing about Vault,これは良いことです! bootstrap.ymlで単一のプロパティを有効にするだけで、ローカルテストで固定プロパティを使用し、必要に応じてVaultに切り替えることができます。

4.1. Springプロファイルに関する注意

現在のEnvironment, Spring Cloud Vaultwill use the available profile names as a suffix appended to the specified base path where key/value pairs will be searchedで利用可能な場合。

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

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

  1. secret/fakebank_/production_ (higher priority)

  2. secret/fakebank

  3. secret/application/production

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

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

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

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

The Database backend module allows Spring applications to use dynamically generated database credentials created by Vault。 Spring Vaultは、これらの資格情報を標準のspring.datasource.usernameおよびspring.datasource.passwordプロパティの下に挿入するため、通常のDataSourcesで選択できます。

このバックエンドを使用する前に、our previous tutorialで説明されているように、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 will automatically renew the lease associated with the acquired credentials.これを行うことにより、アプリケーションが実行されている限り、資格情報は有効なままになります。

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

Connection c = datasource.getConnection();

Once again, we can see that there is no sign of Vault usage in our code。 すべての統合はEnvironmentレベルで行われるため、コードは通常どおり簡単に単体テストできます。

6. 結論

このチュートリアルでは、SpringVaultライブラリを使用してVaultをSpringBootと統合する方法を示しました。 一般的なキーと値のペアと動的データベース認証情報の2つの一般的な使用例について説明しました。

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