23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Kubernetes 환경에서 효과적인 GitOps를 위해서는 가능한 모든 Kubernetes 리소스를 Manifest 파일로 관리해야 합니다.
다만, 여기서 Secret 리소스에 대해서는 고민이 필요합니다.
일반적으로 Secret은 Kubernetes 환경에서 비밀번호, API 키, 인증 토큰 등의 민감 정보를 저장하기 위해 사용되는 리소스입니다.
base64로 인코딩된 데이터를 포함하며, ConfigMap과 유사한 방식으로 Pod 내에서 환경변수나 파일 형태로 전달될 수 있습니다.
그러나 Secret 자체는 기본적으로 암호화되지 않고 etcd에 저장되기 때문에, 특별한 보안 설정이 없으면 민감 정보가 노출될 위험이 있습니다.
따라서 Secret을 안전하게 관리하기 위해서는 별도의 보안 조치가 필요하며, 특히 이를 GitOps 환경에서 다루는 것은 주의가 필요합니다.
효과적인 GitOps를 위해서는 애플리케이션 및 인프라 구성은 물론, 모든 Kubernetes 리소스 구성을 Code Repo(=Git)에 저장하고 이를 기반으로 모든 리소스를 관리해야 합니다.
그러나 Secret은 민감한 데이터를 포함하고 있어 Git 저장소에 직접 저장하는 것이 보안상 매우 위험합니다.
manifest 에는 단순히 base64 인코딩한 값이이 저장되기 때문에, 별도 처리없이 Code Repo에서 관리한다면,
사실상 Code Repo 에 접근이 가능한 사용자/개발자에게 민감정보가 오픈됩니다.
그렇다고, Code Repo 의 접근권한을 통제하거나, Secret을 수동으로 클러스터에 적용하면 GitOps 철학에 맞지도 않고, 효율성이 떨어집니다.
따라서 GitOps 를 유지하면서도 민감 정보를 안전하게 다루는 방법이 필요합니다.
SealedSecret은 GitOps 환경에서 Kubernetes Secret을 안전하게 관리할 수 있도록 도와주는 오픈소스 입니다.
사용자는 kubeseal CLI를 이용해 Secret을 암호화한 SealedSecret을 생성하고, 이를 Code Repo에 저장할 수 있습니다.
SealedSecret은 Kubernetes 클러스터에서 SealedSecrets Controller에 의해 자동으로 복호화되어 실제 Secret 리소스로 변환됩니다.
이렇게 하면 민감 정보가 암호화된 상태로 Code Repo에 저장되므로 보안이 강화되고, 효율적인 GitOps도 유지할 수 있습니다.
전체 동작 입니다.
기본적으로 Code Repo 에는 암호화된 SealedSecret 이 관리되고, Controller 를 통해서 클러스터 내부에서 복호화합니다.
개발자는 Secret 을 SealedSecret Controller 를 통해서 암호화된 SealedSecret.yaml 파일 생성
개발자는 Code Repo 에 SealedSecret.yaml 을 Commit
Kubernetes 에 배포
SealedSecret Controller 가 SealedSecret 복호화 및 Secret 리소스 생성
Application 에서 Secret 사용
아래 2가지 설치가 필요합니다
sealed-secret controller: 암/복호화 수행. Kubernetes 클러스터에 설치
kubeseal: 암호화된 SealedSecret 생성하기 위한 CLI 도구. Kuberentes 클러스터에 접근 가능한 환경에 설치
아래와 같이 helm 명령어로 설치가 가능합니다.
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm repo update
helm install sealed-secrets-controller sealed-secrets/sealed-secrets \
--namespace kube-system \
--create-namespace \
--set keyrenewperiod=720h \
--set keyttl=8760h설치시에 key 만료 주기에 대한 설정에 대한 고민은 필요합니다.
특히 keyttl 의 경우 키가 만료되기 전에 해당 Key 로 암호화된 모든 SealedSecret 은 갱신이 되어야 하니, 보안과 관리 효율성 측면을 고려해서 적절한 값 선택이 필요하며,
이미 생성된 key 에 대한 만료주기 변경은 불가합니다.
keyrenewperiod: 새로운 key 생성주기
keyttl: 생성된 key 만료주기
Kubernetes 클러스터에 접근 가능한 Client 에 아래처럼 설치합니다. (linux 기반)
wget https://github.com/bitnami-labs/sealed-secrets/releases/latest/download/kubeseal-linux-amd64
chmod +x kubeseal-linux-amd64
sudo mv kubeseal-linux-amd64 /usr/local/bin/kubesealSealedSecret 은 아래와 같이 생성이 가능합니다.
$ ls
secret.yaml
$ kubectl get secret my-secret
Error from server (NotFound): secrets "my-secret" not found
# secret.yaml -> sealed-secret.yaml 변경
$ kubeseal --controller-name sealed-secrets --controller-namespace kube-system --format=yaml < secret.yaml > sealed-secret.yaml
# sealed-secret.yaml 생성 확인
$ ls
sealed-secret.yaml secret.yaml
# sealed-secret.yaml 적용
$ kubectl apply -f sealed-secret.yaml
sealedsecret.bitnami.com/my-secret created
$ kubectl get secret my-secret
NAME TYPE DATA AGE
my-secret Opaque 2 17sdata 가 단순히 encoding 되어있습니다.
Code Repo 에 commit 한다면 민감정보가 노출됩니다.
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # echo -n 'admin' | base64
password: bXlwYXNzd29yZA== # echo -n 'mypassword' | base64data가 암호화 되어 있습니다.
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: my-secret
namespace: default
spec:
encryptedData:
password: AgBITqt3u8rpLei9HgqMbpqFTN0p6JnKAEI0FK7ivt8vKuetv2JTPShctLZpnXJzwERGk7SUorWFpjGGqbNkLxsCr7WmHR8OR1cVkB7E80mALRYbjyL7OIFnRqNCdC3hh2mU276WtVXhjLZJ/RFNobvt9HJXqdnXTz8YbQzN6YnbwW1TNoSBQ9YlygvWsnMFB7k7/Nwj/sUjin1R3Cjgg50cP4M0bKTZa3yq+veeQ2MX4CSWiDjW4dIis4ikDv9Nx1JW1lrG6HaAy7Xp9E4F21NpjaNC03ypk+yZ/iVz/VA0utCMWaGx33svbCHjkkZma32K8kJtkxOEFP5mPOYMF1CB2uEP07JwAwwPtGHKjffUIW4pYE3OtHO/XFDDZmcK2VGoayh5IEcc1cTnCnVCEIwYfuUVhnuFrxGACWYzs3I8Eg2e5qzcbIT6eIj28qhWnVzjtpYStxCB/g2r/Zl/bfXbLhnYoB+hnGHDik3AOI46eahNwrc8oOX+BFWWG/nfISUTlGqwoSgE9UN0locIxLyX8cIjmsWJf8ymnm5lugnPp8KRfcA+q0FbON0WD4SJSSJRCMWck+S5c9vdM2HHrUs4XcayMsy7oXuEHqFPNpkgS0ajePag3IqK9CA55Z4ZbfUmFi6BouaabJ6varTJqSEittcK98B09PfDLiPY9AjGsckKJsqtB8CQTLRtKDpaSh2vuSC+kuqharR8
username: AgAd1b1APaTJ8rSS/zbn5P4IsDGNYIdab1yUVMRWt2TcFBKvmhsxJ6zxFBZGiDd0KYqjFg10U1OxlQcI3RL+boAIKqQCVg3akLmyVrc1ebwmuu5ihFIs4NrHWs8nTsd73ABnXbzbB/BBv92Lp0CSmNFNwxaqfeM8ZK8UnstxLqKK3Wn2Un1mA6wpP+jcBhHpVBsHN9RwLuBo8q0RBS9feNE5RF+zMoRxttCPaeR0Bg3Fx2EQNlWN+DQ28lPubpGCG8na07oIn+jR6WkYcybVqiWHR7h6Z0Q3w9hWX0fdr2i5Y4/QI7vj7yLg9jkCPMfrp/NZwFMjGHjXZqDH0EXYSqb4mrUOy6YvXbb8R++EGSQJOSAvdpms6IDQlMh/qwk2oEq6P7vAliJZeWTEr9esIRWCRQTyLQqc4HlWAsbq/B3ObaDyvcgBMbjr3PjOZdguNdj+Ytnpd3BbTNGATnw4PqYlaeC63RaFcLzDJSeR4flatFC6U9eLNlJrKlj5ebuhtD80rHa4ToN4nk8ko1KcHGy3cI9KBYYiQIPkwB4rCYEIf7t4QR924nSPY2aEUPIU0tojKzNkiOqwNa81TDB3c4x31bBLzHPtlGLZuoxLC0zx8SQ+KOdxSNkWLuF49nqUOP5O/6DtO8Wodif1pPhfdC/KOQwDMaHT8VbmXED8YBghrsxWNA11b7HfzfckcFja4Ii5zNTJdw==
template:
metadata:
creationTimestamp: null
name: my-secret
namespace: default
type: Opaque암/복호화 솔루션의 경우, 결국 암/복호화 key 를 안전하게, 잘 관리하는 것이 핵심입니다.
따라서 key 를 적절하게 교체해주고, 별도 저장소 key 백업 등을 통해서 분실시 데이터 복구방법 등에 대해서도 사전에 고려하는것이 필요합니다.
key 추출 등의 기능도 제공하니, 이를 활용한 구성을 권장드립니다.
아직 0.3 버전입니다. 굉장히 복잡한 동작을 하는 오픈소스는 아니지만, 향후 업그레이드시 이슈 가능성 등은 감안해서 도입이 필요합니다.
SealedSecret은 Kubernetes 환경에서 민감정보를 안전하게 관리하고 GitOps 에 통합하기 위해 간단하면서도 효과적인 오픈소스입니다.
Code Repo 에서는 암호화된 SealedSecret 만을 관리하기 때문에, GitOps 통합과 보안성 둘다 확보할 수 있습니다.
설정이 간단하고 운영 부담이 적다는 장점이 있지만, Vault나 ESO처럼 동적 Secret 발급, 외부 스토리지 연동 등의 고급 기능을 지원하지 않는점은 고려해서 도입이 필요합니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.