Kubernetes Secret의 문제점
Kubernetes Secret은 기본적으로 Base64 인코딩만 되어 있어, etcd에 평문으로 저장됩니다. GitOps를 실천하려면 Secret 매니페스트를 Git에 커밋해야 하는데, 이는 보안상 큰 위험입니다.
1. Sealed Secrets (Bitnami)
설치
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm install sealed-secrets sealed-secrets/sealed-secrets -n kube-system
brew install kubeseal
Secret 암호화
cat < secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
namespace: production
type: Opaque
data:
DB_HOST: cG9zdGdyZXMucHJvZC5zdmMuY2x1c3Rlci5sb2NhbA==
DB_PASSWORD: c3VwZXJfc2VjcmV0XzEyMw==
YAMLEOF
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: db-credentials
namespace: production
spec:
encryptedData:
DB_HOST: AgBy8h...encrypted...==
DB_PASSWORD: AgCK3...encrypted...==
2. External Secrets Operator (ESO)
설치
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
-n external-secrets --create-namespace
AWS Secrets Manager 연동
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: aws-secrets-manager
spec:
provider:
aws:
service: SecretsManager
region: ap-northeast-2
auth:
jwt:
serviceAccountRef:
name: external-secrets-sa
namespace: external-secrets
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-credentials
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target:
name: db-credentials
creationPolicy: Owner
data:
- secretKey: DB_HOST
remoteRef:
key: prod/database
property: host
- secretKey: DB_PASSWORD
remoteRef:
key: prod/database
property: password
비교표
| 기준 | Sealed Secrets | External Secrets |
|---|---|---|
| 비밀 저장소 | Git (암호화됨) | 외부 서비스 |
| 비밀 회전 | 수동 | 자동 (refreshInterval) |
| 멀티 클러스터 | 클러스터별 키 쌍 | 중앙 집중 관리 |
| 외부 의존성 | 없음 | 외부 비밀 관리 서비스 |
| 복잡도 | 낮음 | 중간~높음 |
| 적합한 규모 | 소~중규모 | 중~대규모 |
보안 강화
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret:
- identity: {}
실전 체크리스트
- 절대로 일반 Secret YAML을 Git에 커밋하지 마세요.
- 소규모 팀이나 단일 클러스터에서는 Sealed Secrets가 간편하고 효과적입니다.
- 비밀 자동 회전이 필요하거나 AWS/GCP를 이미 사용 중이면 External Secrets가 적합합니다.
- etcd 암호화를 반드시 활성화하여 Secret이 디스크에 평문으로 저장되지 않게 하세요.
- RBAC으로 Secret 접근 권한을 최소화하고, 감사 로그를 활성화하세요.
댓글 0