🔥

sealed secretsをインストールしてsecretを安全に扱う

2022/08/29に公開

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

参考

https://developer.mamezou-tech.com/blogs/2022/06/05/introduce-sealedsecrets/
https://github.com/bitnami-labs/sealed-secrets/tree/main/helm/sealed-secrets

Discussion