はじめに
前回の記事で気になっていた Vault のauto-unseal
とauto-join
について、実際に試してみた記録です。今回試してみたリポジトリはこちら
https://github.com/tunamaguro/try-vault-heal-join
この例ではすぐに環境を壊しているので機密情報を含むデータを掲載していますが、実際に行われる場合は慎重に扱ってください。
また、掲載するデータには注意をしているつもりですが、もし載せてはいけない情報が書いてあった場合、Twitter の DM などでこっそり教えていただけると助かります。
auto-unseal を有効化する
とりあえず公式ドキュメントを読みます。
https://developer.hashicorp.com/vault/docs/configuration/seal
ざっくり読んだ感じ AWS や GCP,Azure の暗号化キー管理サービスを暗号化に用いることで、面倒だったunseal
を省いてくれるらしいです。
なので、事前に各サービスで鍵を生成しておく必要があります。今回は安いという理由で GCP を利用しました。
適当なプロジェクトを作成した後、GCP での unsealチュートリアルを参考に
サービスアカウントを作成します。今回は次の権限を与えて作成しました。
このサービスアカウントを利用するための鍵をcredentials.json
という名前でダウンロードしておきます
次にキーリングを作成します。GCP を全然触ったことがないのでよくわかっていませんが、暗号化に利用する鍵をまとめて管理するための何かだと思っています。
リージョンについてもここを変えると何が変わるのか分かっていませんが、チュートリアル見た感じ global で作られている風だったので揃えました
https://github.com/hashicorp/vault-guides/blob/87f2fe347b581ad46e2e0a4b8a540f227cecb4f5/operations/gcp-kms-unseal/variables.tf#L31-L33
その後鍵を作成します
ここまでで GCP での作業は終了して、kubernetes での作業に移ります。先ほどダウンロードしたcredentials.json
を Secret として作成します
こんな感じのシークレットができるはずです
その後この認証ファイルを vault がマウントして利用できるように設定ファイルを書き換えます。
ドキュメントを読む限りすべての設定値は環境変数に設定すれば良さそうなので、セキュリティを考えるなら Secret から利用したほうがよいと思います
https://developer.hashicorp.com/vault/docs/configuration/seal/gcpckms#gcpckms-parameters
作業コミット
これをargocd sync
するとポッドが作成はされますが Ready にはまだなりません。チュートリアルにも記載がありましたが、はじめのoperator init
だけは手動で行う必要があるようです
初期化を行います
状態を確認するとvault operator unseal
しないと True のままだった Sealed が、何もしなくても False になっています
auto-join を有効にする
https://developer.hashicorp.com/vault/tutorials/raft/raft-storage#retry-join
HA 化した際のストレージとして Raft を用いる場合、各ポッドでvault operator raft join
を実行しないといけませんでした。ポッドが落ちるたびにこんなことをやりたくないので、自動で Raft クラスターに接続してもらうように設定します。
ドキュメントによると、retry_join
に接続先サーバのアドレスを書けば良さそうなので設定を追加します
作業コミット
raft.enabled を true にしないとうまく動かなかったので注意。config も raft の下のものに書く必要がありました。ここでしばらく沼にはまり 30 分程度ムダにしました。皆さんは Helm の説明をよく読みましょう
これをデプロイすると下のようになります。意図通り 3 個ポッドがあり HA 用の設定になっているようです
例によって初期化はまだされていないので、vault operator init
します
vault-0
の初期化は無事完了し、auto-unseal まで行われたことが確認できます。ほかのポッドも同じようになっているか確認します
どのポッドも初期化が完了し vault クラスターが動き始めました
一応 CLI 上でも確認しておきます
後片付け
作製した kubernetes クラスターと GCP 上のリソースは忘れないうちに消しておきましょう
後書き
auto-unseal
とauto-join
を設定しておけば、簡単に秘密鍵を管理する基盤をお家 kubernetes 上に構築できそうでした。
とくに今回で一番面倒だったのは、GCP プロジェクト作成~キーリング作成あたりなので、ここら辺を Terraform を使って自動化できれば、
お家 kubernetes に簡単に導入することも夢じゃなさそうだと思います。今度はそれをやりながらお家 kubernetes の設定ファイルを公開する作業を進めたいです