SealedSecrets
https://api.civo.com/k3s-marketplace/sealed-secrets.png
Sealed Secretsは、宣言型のKubernetes Secret Managementを安全な方法で提供します。Sealed Secretsは暗号化されているため、コードリポジトリに安全に保存することができます。これにより、OSSコミュニティの間で非常に人気のあるGitOpsフローを簡単に実装することができます。 components
controller / operator
k8s クラスターにインストール
Sealed Secrets そのもの
kubeseal
クライアントにインストール
Secret から SealedSecret リソースを作成する
Install
Helm チャートをインストールした後の Secret リソース code: (bash)
❯ kubectl get secrets -n sealed-secrets
NAME TYPE DATA AGE
default-token-jqzj9 kubernetes.io/service-account-token 3 12h
sealed-secrets-keydcdkt kubernetes.io/tls 2 12h
sealed-secrets-token-plgnb kubernetes.io/service-account-token 3 12h
sh.helm.release.v1.sealed-secrets.v1 helm.sh/release.v1 1 12h
sealed-secrets-keydcdkt にランダムな証明書と秘密鍵のペアが格納された Secret が生成されている。
tls.crt と tls.key をキーに base64 形式でエンコードされた値で格納されている。
sealedsecrets.bitnami.com/sealed-secrets-key=active ラベルがついているものが利用可能な鍵である。
code: (bash)
❯ kubectl get secrets -n sealed-secrets -l "sealedsecrets.bitnami.com/sealed-secrets-key=active" -o yaml
apiVersion: v1
items:
- apiVersion: v1
data:
tls.crt: !mask
tls.key: !mask
kind: Secret
metadata:
generateName: sealed-secrets-key
labels:
sealedsecrets.bitnami.com/sealed-secrets-key: active
name: sealed-secrets-keydcdkt
namespace: sealed-secrets
type: kubernetes.io/tls
kind: List
metadata:
resourceVersion: ""
selfLink: ""
別途作成した kubernetes.io/tls タイプの Secret も利用できる。
compromised にすれば利用不可になる。
データを暗号化するためには、tls.crt が必要なのでローカルに保存する必要がある。
code: (bash)
# kubeseal から証明書を取得(最新のものが取得される)
kubeseal --fetch-cert \
--controller-namespace=sealed-secrets \
--controller-name=sealed-secrets \
cert.pem
# Secret リソースから SealedSecret を作成する
kubeseal --cert=cert.pem --format=yaml < secret.yaml
# 証明書のリストを取得
kubectl get secret -l 'sealedsecrets.bitnami.com/sealed-secrets-key=active' -o json | jq -r '.items[].data"tls.crt"' | base64 -d # 秘密鍵のリストを取得
kubectl get secret -l 'sealedsecrets.bitnami.com/sealed-secrets-key=active' -o json | jq -r '.items[].data"tls.key"' | base64 -d Usage
SealedSecret リソースのマニフェスト作成時に設定するスコープ
kubeseal コマンドでシールする時に、アンシールできるスコープを決める必要がある --scope オプションで設定する
Secret と SealedSecret はデフォルトで同じ name, namespace でなければいけないが、scope で変更できる
kubeseal コマンドのオプションで名前と名前空間を指定できる
--name
--namespace
table: スコープ
scope 説明 annotation
strict(default) 同じ名前と名前空間でのみ利用可能
namespace-wide 同じ名前空間でのみ利用可能 sealedsecrets.bitnami.com/namespace-wide: "true"
cluster-wide 任意の namespace で参照可能 sealedsecrets.bitnami.com/cluster-wide: "true"
ex) namespace: default で作ったが、namespace: testで利用したい -> cluster-wide
鍵ペアである Secret リソースに設定されるラベル
sealedsecrets.bitnami.com/sealed-secrets-key: active
このラベルを持つものは、コントローラーで利用される証明書と秘密鍵の対象になる
値が compromised は非対象
このラベルを付ければ、任意の鍵ペアも利用可能になる
SealedSecret リソースに設定できるアノテーション
sealedsecrets.bitnami.com/managed: "true"
SealedSecret と Secret を完全同期する(SealedSecret だけを管理する)
変更
削除
sealedsecrets.bitnami.com/patch: "true"
SealedSecret でキー(data.key)を持たないものを削除せずに残す
sealedsecrets.bitnami.com/skip-set-owner-references: "true"
SealedSecret を削除しても Secret は削除されない
Secret Rotation
デフォルトで 30d 毎に自動更新
コントローラーのオプション --key-renew-period=<鍵の自動更新間隔: 720h30m> で指定する
0 は更新しない
古い鍵も利用可能
自動的に削除されない
最新の証明書で再暗号化する
code: (bash)
kubeseal --re-encrypt \
--controller-namespace=kube-system \
--controller-name=sealed-secrets \
-f sealed-secrets.yaml
Reference