나는 내 프로젝트에서 쿠버네티스의 리소스를 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
정상적으로 동작하는 지 테스트해보자.
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
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
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