
애플리케이션을 배포할 때 데이터베이스 접속 정보, API 키, 인증서와 같은 민감한 정보, 즉 시크릿(Secret) 을 안전하게 관리하는 것은 매우 중요하다. 단순히 Git 저장소에 평문으로 저장하거나 Base64로 인코딩하여 쿠버네티스 Secret 오브젝트로 관리하는 것은 심각한 보안 위협을 초래할 수 있다.
시크릿을 저장하는 가장 안전하고 권장되는 방법은 전문 시크릿 관리 도구를 사용하는 것이다. 이러한 도구는 시크릿의 암호화, 접근 제어, 감사(Audit), 라이프사이클 관리 등 보안에 특화된 기능을 제공한다.
HashiCorp Vault
AWS Secrets Manager
Azure Key Vault
Google Secret Manager
그렇다면 이러한 외부 저장소에 있는 시크릿을 쿠버네티스 애플리케이션에서는 어떻게 사용해야 할까? 이때 사용되는 것이 바로 External Secrets Operator (ESO) 이다.
ESO는 쿠버네티스 클러스터에 설치되어, 외부 시크릿 관리 도구와 연동하는 역할을 수행하는 컨트롤러이다. ESO는 SecretStore 라는 CRD를 통해 외부 저장소의 연결 정보를 정의하고, ExternalSecret 이라는 CRD를 통해 어떤 시크릿을 가져와 쿠버네티스 네이티브 Secret 오브젝트로 동기화할지 지정한다.
이 방식을 사용하면, 민감한 정보는 안전한 외부 저장소에서 중앙 관리하고, 애플리케이션은 쿠버네티스 표준 방식(Secret)으로 시크릿을 참조할 수 있어 보안과 편의성을 모두 확보할 수 있다.
SecretStore 는 어떤 외부 시크릿 저장소를 사용할지, 그리고 어떻게 인증할지에 대한 정보를 담고 있는 CRD(Custom Resource Definition)이다. 아래는 AWS Secrets Manager를 시크릿 저장소로 사용하기 위한 SecretStore YAML 파일 예제이다.
apiVersion: external-secrets.io/v1alpha1
kind: SecretStore
metadata:
# SecretStore의 고유한 이름
name: secretstore-sre
spec:
# 이 SecretStore를 사용할 컨트롤러 지정 (필요시)
controller: dev
# 시크릿을 가져올 외부 공급자(Provider) 설정
provider:
aws:
# 사용할 AWS 서비스 지정
service: SecretsManager
# 이 SecretStore가 사용할 AWS IAM 역할(Role)의 ARN
# Pod가 이 역할을 위임받아(AssumeRole) Secrets Manager에 접근하게 된다.
role: arn:aws:iam::123456789012:role/sre-team
# AWS 리전
region: ap-northeast-2
# AWS 인증 방법 설정
auth:
secretRef:
# AWS 접근 키 ID를 담고 있는 쿠버네티스 Secret 참조
accessKeyIDSecretRef:
name: awssm-secret # 참조할 Secret의 이름
key: accesskey # Secret 안에서 접근 키 ID가 저장된 키(key)
# AWS 시크릿 접근 키를 담고 있는 쿠버네티스 Secret 참조
secretAccessKeySecretRef:
name: awssm-secret # 참조할 Secret의 이름
key: secretaccesskey # Secret 안에서 시크릿 접근 키가 저장된 키(key)
주요 속성 설명
provider.aws.service : 사용할 AWS 서비스를 명시한다. SecretsManager 또는 ParameterStore 를 사용할 수 있다.
provider.aws.role : 가장 중요한 보안 설정이다. 특정 IAM 역할을 지정하여 해당 역할에 부여된 최소한의 권한(Secrets Manager의 특정 시크릿 읽기 권한 등)만으로 동작하도록 한다. 이를 통해 강력한 최소 권한 원칙(Principle of Least Privilege)을 준수할 수 있다.
provider.aws.auth.secretRef : IAM 역할을 위임(AssumeRole)하기 위해 필요한 초기 인증 정보를 담고 있는 쿠버네티스 Secret 을 참조한다. 이 awssm-secret 은 External Secrets Operator가 IAM 역할을 수임하기 위해 단 한 번만 사용하는 자격 증명이다.
이렇게 SecretStore 를 생성해두면, ExternalSecret 리소스가 이 secretstore-sre 를 참조하여 AWS Secrets Manager에서 실제 시크릿 값을 안전하게 가져와 쿠버네티스 클러스터 내에 Secret 으로 생성해준다.