CICD(ArgoCD)で結局secretsはどうやって保管すべきか。
問題
ArgoCD、大変便利ですよね。ただ便利な反面「K8sのsecretsってgitとかに上げても良いの?」となったりしませんか。gitにそのまま平文のAPIキーなんかを置いておくのは気が引けますよね。
公式によると多くの人は以下のようなツールやサービスを使って問題を解決してるようです。( https://argo-cd.readthedocs.io/en/latest/operator-manual/secret-management/ )
- Bitnami Sealed Secrets
- External Secrets Operator
- Hashicorp Vault
- Bank-Vaults
- Helm Secrets
- Kustomize secret generator plugins
- aws-secret-operator
- KSOPS
- argocd-vault-plugin
- argocd-vault-replacer
- Kubernetes Secrets Store CSI Driver
- Vals-Operator
- argocd-secret-replacer
今回はそれらを1つずつ見ていって「具体を知ろう」というのが主旨になってます。
追記: 結論
- 特定のクラウドベンダに依存しない
- gitに暗号化したファイルを置きたい
これらの条件に当てはまるのは「KSOPS」かな。
Bitnami Sealed Secrets
やってることを3つの要点でまとめると、、、
-
シークレットの暗号化と管理
-
SealedSecrets
を使い、Kubernetesシークレットを暗号化して安全にGitなどに保存可能。 - 暗号化されたシークレット(
SealedSecret
)は、ターゲットクラスタのコントローラ以外には復号不可能。
-
-
柔軟な利用とスコープ設定
- シークレットを名前空間限定(strict)、名前空間全体(namespace-wide)、クラスタ全体(cluster-wide)のスコープで利用可能。
- スコープ設定により、特定の利用範囲で安全に管理できる。
-
導入と運用のシンプルさ
- Helmやkubectlでコントローラをインストール。
kubeseal
ツールで暗号化操作が可能。 - シークレットの更新、パッチ適用、ローテーションなどの高度な管理機能を提供。
- Helmやkubectlでコントローラをインストール。
所感
helmと相性が良さそう。ただしあくまで helmのvaluesファイルのみを対象としてるので、例えば、K8sのsecrets yamlなんかを暗号化して展開、なんかは向いてなさそう。
External Secrets Operator
External Secrets Operatorは、AWS Secrets Manager、HashiCorp Vault、Google Secrets Manager、Azure Key Vault、IBM Cloud Secrets Manager、CyberArk Conjur、Pulumi ESCなどの外部シークレット管理システムを統合するKubernetesオペレータです。オペレーターは外部APIから情報を読み取り、その値をKubernetesシークレットに自動的に注入します。
所感
ドキュメント読んでもコレジャナイ感が強い。要は複数のSecretManagerを1つに統合するものだけど、違うよね。
Hashicorp Vault
言わずとしれは Hashicorp。今回はGit上でArgoCDと連携する目的なのでスキップ。
Bank-Vaults
Bank-Vaultsは、クラウドネイティブの秘密管理のための様々なツールを提供する包括的なプロジェクトです:
- Hashicorp Vaultの設定を簡単にするBank-Vaults CLI
- Kubernetes 上で Hashicorp Vault を簡単に操作できる Vault Operator
- Kubernetesポッドに直接シークレットを注入するためのSecrets Webhook
- GoでVaultを簡単に操作できるVault SDK
これでもない。
Helm Secrets
helm-secrets は、暗号化された Helm の値ファイルをその場で復号するための Helm プラグインです。
sops を使って値ファイルを暗号化し、git に保存します。
AWS SecretManager、Azure KeyVault、HashiCorp Vault のようなクラウドネイティブのシークレットマネージャにシークレットを保存し、値ファイルやテンプレートに注入します。
お気に入りのデプロイツールやArgoCDのようなGitOps Operatorでhelm-secretを使う。
所感
Helmに特化したもの。sopsで暗号化してgitに保存してhelmコマンドで展開する時にdecryptするもの。ただこれだとhelm valuesにしか使えないのでダメ。シンプルでいいけどね。
Kustomize secret generator plugins
これも違う。
aws-secret-operator
AWS限定なのでダメ。
KSOPS
Kustomize + SOPSを組み合わせたもの。初期のセットアップが面倒だけど1度設定すれば使い続けられそう。ありよりのあり。
argocd-vault-plugin
様々なシークレット管理ツール(HashiCorp Vault、IBM Cloud Secrets Manager、AWS Secrets Managerなど)からシークレットを取得し、Kubernetesリソースに注入するためのArgo CDプラグインです。
なぜこのプラグインを使うのか?
このプラグインは、GitOpsとArgo CDによるシークレット管理の問題を解決することを目的としています。オペレーターやカスタムリソース定義に頼ることなく、シークレット管理ツールを利用するシンプルな方法を見つけたかったのです。このプラグインはシークレットだけでなく、デプロイメントやconfigMap、その他のKubernetesリソースにも使用できます。
これも3rdPartyのsecretサービスを使うのでダメ。
argocd-vault-replacer
Hashicorp vaultありきのプラグイン。だめ。
Kubernetes Secrets Store CSI Driver
やろうとしてることはいい、けど重い。吉野家で良いのに高級料理を食べさせられる感覚。
Vals-Operator
argocd-secret-replacer
どちらも全然使われてない。ダメ