vault-agent-injectorに関する調査記録
Kubernetesを使う上でPodに渡す秘匿情報をどう管理するか、という点は課題の一つです。Kubernetesの機能であるSecretを使うこともできますが、Hashicorp Vaultを利用している場合Vaultに秘匿情報を格納し、Pod起動時にVaultから取得できればいいなと思ったりもします。
この課題に対応するため、hashicorp/vault-k8sというツールをHashicorpが公開しています。Vaultに格納された秘匿情報を、サイドカー経由でPodに渡すことができるようです。このvault-k8sについてあれこれ調べたことについて紹介します。
まず、これがどのように動くのかについては、以下の記事が詳しいためそちらを参照してもらえるといいのかなと思います。
- Injecting Vault Secrets Into Kubernetes Pods via a Sidecar
- vault-k8s を使って Vault に格納されたシークレットを自動で Pod に渡す
さて、vault-k8sは秘匿情報をファイルシステムパスで渡しているのですが、この方法だとこれまで秘匿情報をKubernetesのSecretと環境変数でアプリケーションに渡していた場合、そのままでは使えません。環境変数で渡すことはできないのかな?と思い調べてみたところ、https://github.com/hashicorp/vault-k8s/issues/14 というissueが見つかりました。このissueによると、以下の課題を解決できれば対応する可能性がある、という状況のようでした。
- Podメタデータ内のSectetを公開しない
- インジェクターはPodのSecretsを取得しない – アプリケーションになりすますサービスを持つことは、セキュリティ上の懸念である
- ボリュームのマウントを越えたPodの変更をしない
issueにも書かれているように、envrcファイルを生成してそれを読むという手はあると思うのですが、対応が少し手間ではありますね。
次に、vault-agent-injectorはHelmでインストールすることができるのですが、2020年1月10日時点ではVault本体も同時にインストールされてしまいます。VaultがKubernetesの外にある場合、Kubernetes内にVaultはインストールせず、vault-agent-injectorだけをインストールしたいわけです。これについては https://github.com/hashicorp/vault-k8s/issues/15 があります。そもそもvault-agent-injectorを外部のVaultと連携させる方法について、ホリデーが終わったら文書化されるようです。いずれhelmでもvault-agent-injectorのみをインストールするための設定が追加されるのではないかと思います。