Search

Kubernetes 에서 Secret 을 안전하게 보호하기 위한 Sealed Secrets 구성 방법

생성일
2025/04/05 04:54
Category
Kubernetes
태그

Kubernetes 에서 Secret 을 안전하게 보호하기 위한 Sealed Secrets 구성 방법

Secret

Secret 은 Kubernetes 환경에서 민감한 값을 보호하기 위해 사용되는 요소이다.
여기에는 DB 패스워드나, Host, API 키 등 민감한 정보가 들어가게 되는데 이런 값들이 평문으로 들어가서 Github Repository 에 올라가게 된다면 보안적으로 좋지 않다.
Secret 에는 평문으로 넣지 않고, Base64 로 인코딩해서 넣긴 하지만 Base64 는 너무 쉽게 디코딩 할 수 있기 때문에 안전하다고 할 수는 없다.
이런 경우에 외부 Secret 도구들을 도입하여 사용할 수 있다.

외부 Secret 도구

HashiCorp Valut, AWS 클라우드를 사용한다면 AWS Secret Store CSI Driver 같은 도구가 있고,
Helm Secrets, Selaed Secrets 같은 도구도 있다.
Kubernetes 환경에서의 CD 배포 도구는 이제는 거의 베이직으로 자리잡은 ArgoCD 를 많이 사용하기 때문에 ArgoCD 와의 궁합이 잘 맞는지를 먼저 확인해봐야 한다.
호환성 여부는 ArgoCD 공식 문서에 잘 나와있다.
AWS Secret Store CSI Driver 의 경우 값을 AWS SecretsManager 에 넣고, Pod 에 Volume 을 탑재하는 방식으로 사용하게 된다.
방식이 간단하지만 사용해본 결과 커스텀 애플리케이션 Helm Chart 에서 더 잘 맞는 것으로 보이고, 이미 존재하는 외부 서비스 Helm Chart 의 경우에는 호환성이나, Template 에서 지원이 되느냐에 따라 사용 유무가 정해졌다.
호환성이나 지원 유무때문에 이슈 문의를 한적도 있었다.
Helm Secrets 의 경우 Pod 에 Volume 을 탑재하는 방식이 아닌, Helm Chart 의 Values 파일에 선언된 값을 암호화해주는 도구이다.
Helm Chart 를 사용한다면 Values 파일의 원하는 값들을 암호화 할 수 있기때문에 개인적으로 정말 좋은 도구라고 생각됐었다.
다만, AWS Secret Store CSI Driver 과 비교했을때 사용방식이 복잡하다.

Selaed Secrets

Selaed Secrets 은 Bitnami 에서 개발한 Secret 의 값을 암호화해주는 도구이다.
또한 Star 8.1k 로 이미 검증되었다.
원본 Secret 파일을 Selaed Secrets 파일로 암호화하고, Selaed Secrets 파일을 배포하면 Secret 파일이 생성되는 구조이다.
자체 인증서를 사용하여 암호화&복호화 하게 되고, 이미 암호화가 된 파일만 Github Repository 에 업로드하면 되기에 보안적으로도 굉장히 좋다.
이미 Helm Secrets 를 사용해봤었고 유사한 방식이기에 큰 어려움은 없었다.
ArgoCD 의 Application, ApplicationSet 등의 종류에 따른 호환성을 타지 않기에 이 부분도 큰 장점이라고 생각된다.

Selaed Secrets 구성

Controller 구성

아래와 같이 구성할 수 있다.
당연히 프로덕션 환경에서는 Helm CLI 를 사용하지 않고 배포 도구를 사용해야한다.
Helm Chart Install 버전:
sealed-secrets 헬름 저장소를 추가한다.
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
Go
복사
헬름 저장소를 업데이트한다.
helm repo update
Go
복사
sealed-secrets 의 기본 네임스페이스는 kube-system 을 권장한다. 다른 네임스페이스를 사용할 수도 있지만, 권장 사항을 준수한다.
helm install sealed-secrets-controller sealed-secrets/sealed-secrets -n kube-system
Go
복사

인증서 업데이트

sealed-secrets 은 RSA 인증서로 암호화하게 된다.
인증서를 자동으로 생성해주지만, Self 인증서를 만들어서 적용할 수도 있다.
여기서 해당 방법에 대한 내용은 생략하겠다.

kubeseal 구성

sealed-secrets 을 사용하여 암호화하려면 클라이언트 도구인 kubeseal 을 설치해야 한다.
MacOS 에서도 brew 로 설치가 가능하지만, 리눅스 서버에서만 EKS Cluster 에 접근할 수 있도록 해두었기 때문에 해당 버전으로 설치를 해줬다.
KUBESEAL_VERSION='0.29.0' curl -OL "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
Go
복사

암호화

이제 sealed-secrets 를 사용할 준비가 완료되었다.
암호화를 할때는 kubeseal 도구가 설치된 환경에서 해야한다.
아래와 같이 기본 Secret yaml 파일을 작성하고, 배포한다.
apiVersion: v1 kind: Secret metadata: name: foobar-secret namespace: foobar type: Opaque data: KEY: foobar-sealed-secrets-key-test
Go
복사
그리고 아래와 같이 kubeseal 을 사용해서 암호화한다.
kubeseal -o yaml < test3-secrets.yaml > sealed-secrets.yaml
Go
복사
or
kubeseal --cert=./new-sealed-secrets-key.pub --format=yaml -f ./test3-secrets.yaml > ./testtest22-sealed-secrets.yaml
Go
복사
생성된 파일을 열어보면 아래와 같이 암호화되어 있다.
암호화가 잘 되어 있고, 이제 이 파일을 Github Repository 에 업로드할 수 있기 떄문에 보안적으로 안전하게 관리할 수 있다.
apiVersion: bitnami.com/v1alpha1 kind: SealedSecret metadata: creationTimestamp: null name: foobar-secret namespace: foobar spec: encryptedData: KEY: AgAJMVOBz+ceO0AoJ40I/Uy/bN8z901uE4n/3surNQlquXtXyzD7vyv8CmV26IMA/mEKCyVo8CmoiWLGqlsWFl8brsoljPsWKbD+YVdhp6e71bURBxx0aQEO8tbz2JKCD+kkIShQNVvPkUTn9VMY1lUCvzlchSy2QGGbgYl339AYz6PgCytOd4+4IF3aY0leWjJay9c8cKZI6t+wkKELk4mM7p7sNgRngalDf6FpYdG2vT6PwMIKDzcLwxePPdVm1lXTAPsSTvuug6K9rBCe4DxVn90f3ks/jDGy7Xt6hTaa5fOOMuTRc9ERaXJIy7/i4I45NPBbBp2a9DTkYZFlODxwtGz/3ho4f5FWn5H55EIffDXfcTmpQ0934KWIAzs/PkbGb6GeCbhW8RRP8bdcH47c4S2AWom2Ti2o4pp+pX8OQJYV9/TPq9RruXcvkeo0K/Zk4I2osn8RDEK6yWf2IVV0fXfRxX/uCRsnx1Msuecn6ik7ydQab92e7Dl4F893arS0Ra9IQevt1ciblpDzpbmNdPGol7GcXEmklixe9qa59Nfb1bPtNiZRTqMWGxHCG6NT5nealX7WCqzdJXjqLpyV3aEV4Kh86GqGMR7+FC3/NHObLGG9HDV6AvlP7sgqj0yVtjyjBe6vo59g5GuI00w4V2jaS9naejjdS3l6WKx5bM5WewBsh2QB69oFeS4vvIcE4OHUcyYvOfu2YkGo6f+qWyurUpRSQeooyzJ5S8I= template: metadata: creationTimestamp: null name: foobar-secret namespace: foobar type: Opaque
Go
복사

구성 요소

아래 SG 에서 8080 Port 를 허용해야 정상적으로 암호화가 실행된다.
1.
WorkerNode SecurityGroup 인바운드 허용 → 8080 Port
2.
ControlPlane SecurityGroup 아웃바운드 허용 → 8080 Port