본문 바로가기
Infra2024년 8월 2일6분 읽기

Kubernetes Secrets 관리 — sealed-secrets와 external-secrets

YS
김영삼
조회 797

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 SecretsExternal 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

아직 댓글이 없습니다.
Ctrl+Enter로 등록