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は次のパスに格納されているプロパティを探します。
-
_secret/
fakebank
/production_
(優先順位が高い) -
_secret/
_
fakebank -
secret/application/production
-
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]にあります。