【シールドシークレッツ】

Sealed Secrets とは?

最終更新:
💡 秘密の値を暗号化して、Gitで管理する

BitnamiのKubernetes向けシークレット管理ツール。kubesealで値を暗号化したSealedSecretをGitで管理し、対応する秘密鍵を持つコントローラーが復号してSecretを生成する。

📌 このページのポイント
値を暗号化してGitで管理する 手元で値を暗号化 → Gitへ保存 Secret 元の値 kubeseal 公開鍵で暗号化 SealedSecret Gitで管理 GitOpsなどでクラスターへ適用 SealedSecret 暗号化された値 コントローラー 秘密鍵で復号 Secretを生成 Secret 権限を持つ Pod等が利用 対応する秘密鍵が必要 / 鍵の保護は別に必要 strictでは名前とnamespaceも一致させる
上段は手元で暗号化してGitに保存する流れ、下段はクラスター側で復号してSecretを生成する流れ。矢印はデータの変換・適用の順序。青は通常のSecret、緑は暗号化された値、橙は鍵を使う処理。対応する鍵を復元・共有した別クラスターでも復号し得る。生成後のSecretのアクセス権と保存時の保護は別に必要。
ひよこ ひよこ
KubernetesのSecretをそのままGitに入れてもいいの?
ペンギン先生 ペンギン先生
Secretのdataはbase64表現で、これ自体は暗号化ではないよ。ファイルを読める人は値を戻せる。クラスター側で保存時の暗号化を有効にしていても、Git上のSecretファイルまで守られるわけではないんだ。
ひよこ ひよこ
Sealed Secretsなら何が変わるの?
ペンギン先生 ペンギン先生
公開鍵で値を暗号化したSealedSecretをGitで管理できるよ。対応する秘密鍵を持つコントローラーが復号して、通常のSecretを生成する。生成したSecretの読み取り権限や保存時の暗号化、秘密鍵の保護は別に必要なんだ。
ひよこ ひよこ
どうやって暗号化するの?
ペンギン先生 ペンギン先生
kubesealというCLIでSecretをSealedSecretに変換するよ。正しい対象の公開鍵証明書を使うことが大切。証明書を取得しておけばオフラインでも暗号化できる。元の平文ファイルや秘密鍵のバックアップを、暗号化したYAMLと一緒に公開しないようにするんだ。
ひよこ ひよこ
別のクラスターへコピーしたらどうなる?
ペンギン先生 ペンギン先生
対応する秘密鍵がなければ復号できないよ。ただし、その鍵をバックアップから復元したり共有したりしたクラスターでは復号できる場合がある。既定のstrictスコープでは名前とnamespaceも一致させる必要があるんだ。namespace-wideやcluster-wideは、この名前・namespaceの制約を変える設定で、どのクラスターでも使えるという意味ではないよ。
ひよこ ひよこ
ArgoCDなどと一緒に使えるの?
ペンギン先生 ペンギン先生
GitOpsでSealedSecretをクラスターへ適用し、インストール済みのコントローラーにSecretを生成させる流れにできるよ。暗号化した値の管理と、生成したSecretや鍵へのアクセス制御を分けて考えると分かりやすいね。
ひよこ ひよこ
鍵が更新されたらパスワードも変わるの?
ペンギン先生 ペンギン先生
別の処理だよ。既定では暗号化鍵を定期的に追加し、古い鍵も保持するので過去のデータを復号できる。kubeseal --re-encryptは新しい鍵で暗号化し直す機能で、パスワード自体の変更ではないんだ。Gitの過去版も残るので、漏えいした秘密値は利用先で失効・変更し、鍵のバックアップも安全に管理する必要があるよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Sealed Secrets」って出てきたら「GitOps対応の暗号化Kubernetesシークレット」と思えればだいたいOK!
📖 おまけ:英語の意味
「Sealed Secrets」 = 封印されたシークレット
💬 Sealedは封印された、Secretsは秘密という意味。暗号化した値を、対応する秘密鍵で開く封筒に例えると分かりやすいよ。

参考資料

← 用語集にもどる