[k8s] sealed-secrets

sang yun Lee·2023년 11월 30일
0

k8s

목록 보기
14/18

나는 내 프로젝트에서 쿠버네티스의 리소스를 gitops 로 관리하고 있다. gitops 로 관리할 경우 secrets 이 외부에 유출될 수 있기에 이와 관련하여 방법을 찾아보다가 sealed-secrets 을 알게 되어 적용해보았다.

관련 개념들은 커피고래님의 블로그 에 너무 잘 나와있어서 나는 핸즈온만 간단히 작성하려 한다. (참고로 sealed-secrets 은 공개키 암호화 방식이 적용되어 있어 해당 개념을 알아두면 이해하기에 좋다.)

설치방법

// 리눅스 기준의 설치 방법입니다.
참고링크: https://github.com/bitnami-labs/sealed-secrets#linux

# kubeseal 설치
$ KUBESEAL_VERSION='0.24.4' # https://github.com/bitnami-labs/sealed-secrets/tags
$ wget "https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION:?}/kubeseal-${KUBESEAL_VERSION:?}-linux-amd64.tar.gz"
$ tar -xvzf kubeseal-${KUBESEAL_VERSION:?}-linux-amd64.tar.gz kubeseal
$ sudo install -m 755 kubeseal /usr/local/bin/kubeseal

# sealed-secrets-controller 설치
$ helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
$ helm install sealed-secrets -n kube-system --set-string fullnameOverride=sealed-secrets-controller sealed-secrets/sealed-secrets

정상 동작 확인

정상적으로 동작하는 지 테스트해보자.

  1. sealed-secret yaml 파일 생성하기
# 일반적인 시크릿 파일 생성
$ kubectl create -n test secret generic mysecret --from-literal hello=world --dry-run=client -oyaml > mysecret.yaml
# 시크릿 파일을 통해 seal-secret 파일 생성
$ cat mysecret.yaml | kubeseal -oyaml > mysealed-secret.yaml
# 생성된 seal=secret 파일 보기
$ cat mysealed-secret.yaml
# mysealed-secret.yaml
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  creationTimestamp: null
  name: mysecret
  namespace: test
spec:
  encryptedData:
    hello: AgCqv9JMiYmJtEDt8vbHfEKcXL3D3h/V/e3FdprTS52YkZHbBeh1ZenkjqvYJs5wKoRQoZ3HC3wlz+XLRYVSEpy5Xz//3Rhu6up5SpLIi0QXyLlrq6/oM+BlaxMrX/npc05MCdEC3IbQdi+cHyralEI7UBVx2h0zVju6Ko3re5zMDMBnHGuegSvewBcUtMZ6PmBs7wd0bt4ZBLXt6i3MUL9SjKA1hkUI0FzlwEprMcbxY+Npfbr05cb+uStgcsYSa9HMK9ZElFIoLosoxZ8PZaIPIIdIKNbrdAQZmaGFtAht88zzz8BKJQ/3hi+Zq/ZxUpipIkogzwNn8/xPnP6JP1mz1U1pzy7bLYYivA3I20ARfMSe1ZGqaf0++p4EBQDmTVOlrSmGL20e4a4J6Z//zGtyouqnA9wGkj49dWc4YMNOLxxIHv2tTcItUvKROTljMs7UXuwKlLy7m7yo09Dkd/78IKeqydIu6CudsCTQ8SY42BooUBbZnw4yTAW2++iJZcBJZmtsKpub9VxyH6Vb9qoln7x6bpf43JYeTYfV8LgYHF+UpwbVPL0YZH7G2Xa79fRphc7T4YOJfqaXTFT5tOTqY+Rvk9HckFR8FvB0ClVLFQRviAOQO91UwoLT4VKsIodK2sICLw4o7/ZIbc7eSPrhva4FnUZOjVgzU4ZSnojQrkjyr7fAYao8EGKeJEHlIQXQBaXY/A==
  template:
    metadata:
      creationTimestamp: null
      name: mysecret
      namespace: test
  1. sealed-secret.yaml 적용하고 확인하기
# sealed-secret 생성
$ kubectl apply -f mysealed-secret.yaml
# sealedsecret.bitnami.com/mysecret created

# 생성된 sealed-secret 확인
$ kubectl get sealedsecret
NAMESPACE   NAME       STATUS   SYNCED   AGE
test        mysecret            True     3s

# sealed-secret 이 생성되면 sealed-secret-controller 가 secret 을 자동으로 생성한다.
# 생성된 secret 확인
$ kubectl get secrets
NAME       TYPE     DATA   AGE
mysecret   Opaque   1      26m

private-key 백업/복원하기

sealed-secret 는 클러스터 내 private-key 를 통해 decrypt 되는데 만약 클러스터를 포맷할 경우 private-key 도 소실되어 sealed-secret 를 decrypt 할 수 없게 된다. 따라서 private-key 를 별도로 백업해둔 뒤 추후에 클러스터를 재구성할 때에 백업해둔 private-key 를 다시 복원하여 사용하면 sealed-secret 를 decrypt 하여 secret 을 얻을 수 있다.

private-key 백업 방법:

# main.key 로 private-key 를 백원해둔다.
$ kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > main.key

private-key 복원 방법:

# 백업했던 키를 복원한다.
$ kubectl apply -f main.key
# pod 재생성하여 pod 가 새로 업데이트된 key 값을 반영하도록 한다.
kubectl delete pod -n kube-system -l app.kubernetes.io/name=sealed-secrets

참고자료


0개의 댓글