🔥
sealed secretsをインストールしてsecretを安全に扱う
sealed secretsとは
- kubernetesでsecretリソースを暗号化することでセキュアな状態にして、Gitリポジトリでそのまま使ってもいいような形にしてくれるもの
- sealed secretsコントローラの中に、キーペアが生成されてよしなに暗号化してくれるスグレモノ
手順
kubesealコマンドをインストール
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.2/kubeseal-0.18.2-linux-arm.tar.gz
sudo mv kubeseal /usr/local/bin/
Contrllerをインストール
- ArgoCDでデプロイしている
- helm installでもOK
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sealed-secrets
namespace: argocd
spec:
project: optional
source:
repoURL: https://github.com/bitnami-labs/sealed-secrets
path: helm/sealed-secrets
helm:
releaseName: sealed-secrets
destination:
server: https://kubernetes.default.svc
namespace: sealed-secrets
syncPolicy:
automated:
prune: true
syncOptions:
- CreateNamespace=true
ignoreDifferences:
- group: ""
kind: Service
jsonPointers:
- /spec/clusterIP
デプロイ
kubectl apply -f sealed-secrets.yaml
デプロイ確認
kubectl get pod -n sealed-secrets
NAME READY STATUS RESTARTS AGE
sealed-secrets-5bdb7f75cc-8fkwt 1/1 Running 0 69s
コントローラ
kubectl get crd sealedsecrets.bitnami.com
NAME CREATED AT
sealedsecrets.bitnami.com 2022-08-29T02:48:02Z
暗号化復号化をするための鍵はSecretに格納されている
tls.crtとtls.keyがある
kubectl get secret -n sealed-secrets -l sealedsecrets.bitnami.com/sealed-secrets-key
NAME TYPE DATA AGE
sealed-secrets-keyj5qbd kubernetes.io/tls 2 4m
Secretリソース作成
マニフェストファイル作成
kubectl create secret generic test -n default --dry-run=client --from-literal password=P@ssw0rd -o yaml > test.yaml
passwordはecho "UEBzc3cwcmQ=" | base64 -d
でデコードできるのでこれをそのままGitにコミットしてしまうのは危険なので、このSecret自体を秘密鍵で暗号化するというもの
apiVersion: v1
data:
password: UEBzc3cwcmQ=
kind: Secret
metadata:
creationTimestamp: null
name: test
namespace: default
sealed-secretsで暗号化する
cat test.yaml | kubeseal --controller-name=sealed-secrets --controller-namespace=sealed-secrets --format yaml
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: test
namespace: default
spec:
encryptedData:
password: AgButcI+S/mZH55l2CPkqux1V6Sv0Q0tCqBUTBy9ItXc66OCV4RIZh/0VVmX5ZmpWtqpnJ7i0ZhixhcdV5CCuld96mkseY+GgCCo5hXOQUChsxBC/OMrDTA+R3map6Tm2xndea5Ursv7cXrBHFrwX1zcMmG98DzbiIaf1yC3EDKZgiLDUYBo6HfO+VCzdX+poIpXYwEptUcHtQ2gKtx9Ea3UGeyivB7n+Ce1VvfBotfZ8Zgfk9hviYzfCwGdh2BqwnTkT3Bzpf/wnfkI5GmFewGsdtx3tnnOidhNWLtXU0oj9yF1Zk+uYZojI/QA19PuN+DWL33u/+giW9x0P+9GidFyF+7pj0ydlkoNlpO5ego0G9LH//PVxaZbDP9Hq47P3AYkxdQQTNDQFKhUafdgQAAxM0sz4Wfge1RczHL65nGrIVEwnfcG+/xaXu5rcR9nRVaBlXDDpKo0ch/p3WJ8DK29rsUwHEsRqUtudQeXE/PO6huQYgxYx2+DTK1xJC7c7R+FizkuBYpMLBmLVtS+haXTbVJ6hGoiZaH3syUzgRJ0yGHgKReeYtd1199Zo4j1CGbmjhsphG9fqZz2ODSWitXVeOCwJQIxMEQbfixqA0P8HEd1aSxMgrSm0Pm3uPCULCeYhMfsjyT/zRdv08xq8fthaxMs1kzsnCNQnLbEBQkgihDJOFYPYePN53RWW7EbXgyOi/ftcKF4AQ==
template:
data: null
metadata:
creationTimestamp: null
name: test
namespace: default
復号
リソース展開
kubectl apply -f test-sealed-secrets.yaml
kubectl get secret test -n default -o yaml
passwordがbase64エンコードされている状態でクラスタにデプロイされている
apiVersion: v1
data:
password: UEBzc3cwcmQ=
kind: Secret
metadata:
creationTimestamp: "2022-08-29T03:09:41Z"
name: test
namespace: default
ownerReferences:
- apiVersion: bitnami.com/v1alpha1
controller: true
kind: SealedSecret
name: test
uid: f72fac2e-4c4c-4061-a3d2-9e200af6e763
resourceVersion: "4215590"
uid: 9e52632b-c37e-40db-9c8d-c953273bc67c
type: Opaque
kind:sealed-secrets
のファイルをGit管理すればよい
ワンライナーで暗号化Secretを作るコマンド
複合できないかも。。調べてないです
kubectl create secret generic db-admin-secret -n default --dry-run=client --from-literal password=testpass -o yaml | kubeseal --controller-name=sealed-secrets --controller-namespace=sealed-secrets --format yaml
参考
Discussion