1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Spring BootでHashiCorp Vaultからデータを読み込むためにハマったこと

1
Last updated at Posted at 2020-05-31

それぞの公式ページを参照しながら作業したのですが、自分のやりたい条件で実現することに時間がかかってしまいました。

備忘録と参考までに投稿します。

環境

  • OS: CentOS7
  • Spring Boot: org.springframework.boot spring-boot-starter-parent 2.1.13.RELEASE、spring-cloud.version Greenwich.SR2
  • Vault: v1.4.2

やりたかったこと

ポイント

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/applicationsecret/data/<パス名>も読み込み元に追加するため、 secret/data/applicationsecret/data/<パス名>にもアクセス許可を与える必要がありました。

データの書き込み

  • vault kv put secret/<パス名>で書き込む。

secret/data/<パス名>にデータを書き込んでも読み込まれませんでした。

Spring Boot側

<プロジェクト ルートディレクトリ>/src/main/resources/bootstrap.yml

  • spring.application.namespring.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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?