External Secret

External Secrets Operator(ESO)는 Kubernetes 환경에서 외부 비밀 관리 시스템(예: AWS Secrets Manager, HashiCorp Vault, Google Secret Manager 등)에 저장된 비밀 정보를 Kubernetes 클러스터 내에서 Kubernetes Secret으로 쉽게 사용할 수 있게 해주는 오픈소스 오퍼레이터입니다. 이를 통해 애플리케이션이 외부에서 관리되는 비밀을 안전하게 사용할 수 있습니다.

ESO를 사용하는 이유

  • 보안성: 비밀 데이터를 애플리케이션 코드에 직접 포함하지 않고 외부 비밀 저장소에 보관함으로써 보안 위협을 줄일 수 있습니다.

  • 자동화: 비밀 데이터가 변경될 때마다 수동으로 Kubernetes Secret을 업데이트할 필요 없이, 자동으로 동기화됩니다.

  • 유연성: 여러 클라우드 제공자의 비밀 저장소와 통합되어 클러스터 환경에 구애받지 않고 사용할 수 있습니다.

주요 개념

  1. ExternalSecret:

    • 외부 비밀 관리 시스템에 저장된 비밀을 참조하여 Kubernetes의 Secret으로 변환하는 리소스입니다. ExternalSecret은 외부에서 가져올 데이터를 정의하고 Kubernetes Secret으로 매핑하는 역할을 합니다.

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: example-secret
spec:
  secretStoreRef:
    name: aws-secret-store  # Secret Store 참조
    kind: SecretStore
  target:
    name: example-kubernetes-secret  # 생성될 Kubernetes Secret 이름
  data:
    - secretKey: username  # Kubernetes Secret의 key
      remoteRef:
        key: prod/db-credentials  # 외부 비밀 저장소에서 참조할 비밀
        property: username
  1. Secret Store:

  • ESO가 외부 비밀 관리 시스템에 접근할 수 있도록 연결 정보를 제공하는 리소스입니다. AWS Secrets Manager, Google Secret Manager와 같은 다양한 외부 저장소에 대한 연결 설정과 인증 정보를 포함합니다.

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-secret-store
spec:
  provider:
    aws:
      service: SecretsManager
      region: us-east-1  # AWS 리전
      auth:
        secretRef:
          accessKeyIDSecretRef:
            name: aws-creds
            key: accessKey  # 액세스 키
          secretAccessKeySecretRef:
            name: aws-creds
            key: secretAccessKey  # 시크릿 키
  1. ClusterSecretStore:

  • 여러 네임스페이스에서 사용할 수 있도록 외부 비밀 관리 시스템을 정의하는 리소스입니다. 하나의 비밀 저장소를 클러스터 전역에서 사용할 수 있게 설정합니다.

apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
  name: aws-secret-store
spec:
  # provider field contains the configuration to access the provider
  # which contains the secret exactly one provider must be configured.
  provider:
    # (1): AWS Secrets Manager
    # aws configures this store to sync secrets using AWS Secret Manager provider
    aws:
      service: SecretsManager
      region: ap-northeast-2
      # Auth defines the information necessary to authenticate against AWS
      auth:
        jwt:
          serviceAccountRef:
            name: external-secrets
            namespace: external-secrets
SecertsManager
Parameter Store

Secret 데이터의 자동 갱신

외부 비밀 관리 시스템에서 비밀 데이터가 변경될 경우, ESO는 이를 감지하여 Kubernetes Secret을 자동으로 갱신합니다. 이렇게 하면 Kubernetes 애플리케이션이 최신 비밀 정보를 사용할 수 있으며, 수동 업데이트의 번거로움을 줄일 수 있습니다.

외부 비밀 관리 시스템

  • AWS Secrets Manager: AWS 환경에서 비밀 데이터를 관리할 때 사용됩니다.

  • AWS Systems Manager Parameter Store: AWS의 파라미터 저장소로도 통합 가능합니다.

  • Google Secret Manager: GCP 환경에서 비밀 관리에 사용됩니다.

  • HashiCorp Vault: 오픈소스 기반의 보안 자격 증명 관리 시스템입니다.

  • Azure Key Vault: Microsoft Azure 클라우드의 비밀 관리 서비스입니다.

고려 사항

  • ESO는 외부 비밀 저장소와 안전하게 통신하기 위해 OAuth, IAM 역할, API 키 등 다양한 인증 방식을 지원합니다. 이로써 외부 비밀 저장소와의 연결이 안전하게 유지되며, 민감한 데이터에 대한 접근이 엄격히 제어됩니다.

  • Kubernetes Secret에 저장된 데이터는 Base64 인코딩이지만, 암호화가 아니므로 적절한 RBAC 설정 및 추가적인 Secret 암호화를 고려할 수 있습니다.

Last updated