このエントリは2020/08/28現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
k8sでデータベース接続情報などの機密情報を保持する場合、ハードコーディングやマニフェストへの記載は論外としても、k8sのsecretに格納する場合、Base64でエンコードしているだけでセキュアとは言えない。そのため、各クラウドベンダーが提供するManaged Kubernetes Serviceでは様々な拡張が追加されている。例えばAzure Kubernetes Service (AKS) の場合はetcdが暗号化されているので、k8sのsecretを使っても安全だとか、Azure Key Vaultと組み合わせてクラスターのライフサイクルとシークレットのライフサイクルを分離できるようになっている。このあたりの記述はMicrosoftの真壁さん ( @tmak_tw ) のブログエントリに記載がある。
Azure Kubernetes Serviceでシークレットを管理する6つの方法
https://torumakabe.github.io/post/aks_how_to_keep_secret/
上記エントリによると、AKSとAzure Key Vaultとの連携方法は3個あるが、2020/08/28現在では少々変更がある。
- FlexVolumeを使う方法はv1.15まででv1.16以後では非推奨
- v1.16以後ではCSI Driverを使う方法を推奨
- AKSは以下のリリースノートにある通り、2020/8/31で1.15.xの新規クラスターの作成はできなくなる(2020/08/28現在、AKSで新規クラスターを作成する場合、既定のバージョンは1.16.13)
Release 2020-08-17
https://github.com/Azure/AKS/releases/tag/2020-08-17
方式 | 概要 | 備考 |
---|---|---|
SDKの利用 | AKSとKey Vaultの統合機能は使わず、ごりごり書いていく | |
Pod Identityの利用 | PodのマネージドIDを利用し、Key Vaultにアクセス | |
FlexVolumeの利用 | Key Vaultをボリュームとしてマウント | オープンソース v1.15まで 以後の利用は非推奨 |
Secret Store CSI Driverの利用 | Key Vaultをボリュームとしてマウント | オープンソース v1.16以後 (Windowsクラスターの場合はv1.18以後) |
FlexVolumeとSecret Store CSI Driverは方式が違うだけで、PodにKeyVaultをボリュームとしてマウントし、各シークレットやキーをファイルとして読み出すことに変わりはない。すでにCSI Driverを使ったKey VaultとAKSの連携はチュートリアルが用意されている。Service Principalを使う方法、Managed IDを使う方法の何れでもよい。
なお、チュートリアルは2020/08/28現在英語版のほうが新しいので、最新情報は英語版を参照(日本語版もいずれ更新されるはず、知らんけど)。
チュートリアル:Kubernetes 上のシークレット ストア CSI ドライバー向けに Azure Key Vault プロバイダーを構成して実行する
Tutorial: Configure and run the Azure Key Vault provider for the Secrets Store CSI driver on Kubernetes
https://docs.microsoft.com/azure/key-vault/general/key-vault-integrate-kubernetes
注意点
AKSクラスターをAzure CLIで作成する場合、aks-previewという拡張のインストールが必要になる場合があるので、事前に追加しておくことを推奨する。
# https://docs.microsoft.com/en-us/cli/azure/extension?view=azure-cli-latest#az-extension-add
az extension add --name aks-preview
CSI Driverのインストールなどでhelmを使うため、v3以後のhelmもインストールしておく必要がある。v2系では動作しないので注意。インストールは以下のドキュメントを参照。
Installing Helm
https://helm.sh/docs/intro/install/