それぞの公式ページを参照しながら作業したのですが、自分のやりたい条件で実現することに時間がかかってしまいました。
備忘録と参考までに投稿します。
環境
- OS: CentOS7
- Spring Boot: org.springframework.boot spring-boot-starter-parent 2.1.13.RELEASE、spring-cloud.version Greenwich.SR2
- Vault: v1.4.2
やりたかったこと
- ローカルでサービスとして動いているVaultからデータを読み込む。
- Vaultのバックエンド ストレージはファイルシステム(Filesystem Storage Backend)。
-
シークレット エンジン(Secrets Engines)は
kv(バージョン1)
ポイント
HashiCorp Vault側
/etc/vault.d/vault.hcl
- ストレージを
fileにする。
例
storage "file" {
path = "/var/vault/data"
}
pathは任意のディレクトリ
アプリケーション用ポリシーの設定
以下のように設定する。
path "secret/application" {
capabilities = ["read"]
}
path "secret/<パス名>" {
capabilities = ["read"]
}
path "secret/data/application" {
capabilities = ["read"]
}
path "secret/data/<パス名>" {
capabilities = ["read"]
}
Springはデフォルトでsecret/applicationのパスも読み込もうとしているようで、secret/<パス名>のみを読み取り可能にするとエラーになりました。また、Spring Cloud Vaultの公式ページによると、Spring Cloud Vaultが自動でsecret/data/applicationとsecret/data/<パス名>も読み込み元に追加するため、 secret/data/applicationとsecret/data/<パス名>にもアクセス許可を与える必要がありました。
データの書き込み
-
vault kv put secret/<パス名>で書き込む。
secret/data/<パス名>にデータを書き込んでも読み込まれませんでした。
Spring Boot側
<プロジェクト ルートディレクトリ>/src/main/resources/bootstrap.yml
-
spring.application.nameかspring.cloud.vault.application-nameの設定が必要。
当方環境では、spring.cloud.vault.kv.application-nameのみを設定しても、エラーになり値を読み込むことができませんでした。
当方環境で機能した設定
spring.cloud.vault:
application-name: <アプリケーション名>
scheme: http
token: ${VAULT_TOKEN}
kv:
enabled: true
<アプリケーション名>は、Vault側でvault kv put secret/<パス名>によりデータを書き込む際の<パス名>と一致している必要があります。
spring.cloud.vault.tokenは、Vault側でvault token create 〜でアプリケーション用に読み取り専用のトークンを作成する関係で環境ごとに変わるため、環境変数VAULT_TOKENに設定します。
Javaのソース
@Value("${<Vaultに書き込んだキー>}")により、値を取得できます。
vault kv put secret/testapp aaa.bbb.ccc=hogehogeでデータを書き込んでいた場合、
// (前略)
@Value("${aaa.bbb.ccc}")
private String testVar;
// (中略)
@PostConstruct
private void testMethod() {
System.out.println(testVar);
}
// (後略)
で、testVarの値が「hogehoge」として出力されます。
その他
Vaultの設定についてはAnsibleのPlaybookを作成したので、よろしければ自由に改変してお使いください。
誤りのご指摘、ご質問など、何でもフィードバックをいただけると嬉しいです。
参照サイト
https://spring.io/guides/gs/vault-config/
https://docs.spring.io/spring-vault/docs/2.2.2.RELEASE/reference/html/
https://cloud.spring.io/spring-cloud-vault/reference/html/
https://www.baeldung.com/spring-cloud-vault
https://learn.hashicorp.com/vault
https://www.vaultproject.io/docs