Sealed Secrets for Kubernetes
Sealed Secretsは2つの部分で構成されています:
- クラスタ側のコントローラ
kubesealと呼ばれるクライアント側のCLI
コントローラが起動すると、クラスタ全体のプライベート/パブリックキーペアを探し、見つからない場合は新しい4096ビットのRSAキーペアを生成します。プライベートキーはコントローラと同じ名前空間(デフォルトではkube-system)のSecretオブジェクトに永続化されます。このパブリックキー部分は、このクラスタでSealedSecretsを使用したい人なら誰でも公開されています。
暗号化の際には、元のSecretの各値がランダムに生成されたセッションキーを使用してAES-256で対称的に暗号化されます。その後、セッションキーはコントローラのパブリックキーを使用してSHA256と元のSecretの名前空間/名前を入力パラメータとして非対称的に暗号化されます。暗号化プロセスの出力は、次のように構築された文字列です: 暗号化されたセッションキーの長さ(2バイト)+ 暗号化されたセッションキー + 暗号化されたSecret
SealedSecretカスタムリソースがKubernetesクラスタにデプロイされると、コントローラがそれを検出し、プライベートキーを使用して暗号を解除し、Secretリソースを作成します。復号化の際には、SealedSecretの名前空間/名前が再び入力パラメータとして使用されます。これにより、SealedSecretとSecretが厳密に同じ名前空間と名前に結びつけられます。
コンパニオンCLIツールであるkubesealは、公開鍵を使用してSecretリソース定義からSealedSecretカスタムリソース定義(CRD)を作成するために使用されます。kubesealはKubernetes APIサーバーを介してコントローラと通信し、実行時にSecretを暗号化するために必要な公開鍵を取得できます。公開鍵はコントローラからダウンロードしてローカルに保存し、オフラインで使用することもできます。
SealedSecretsは以下の3つのスコープを持つことができます:
- strict(デフォルト):正確に同じ名前と名前空間でシールする必要があります。これらの属性は暗号化されたデータの一部となるため、名前や名前空間を変更すると「復号化エラー」が発生します。
- namespace-wide:指定された名前空間内であれば、シールされたシークレットの名前を自由に変更できます。
- cluster-wide:任意の名前空間で暗号を解除でき、任意の名前を付けることができます。