안녕하세요! 지난번 ConfigMap에 이어, 오늘은 보안이 필요한 데이터를 다루는 Secret(시크릿)에 대해 알아보겠습니다. 비밀번호, OAuth 토큰, ssh 키와 같은 민감한 정보를 어떻게 관리해야 할까요?

1. Secret이란 무엇인가요? 🔒
Secret은 비밀번호, 토큰, 키와 같은 소량의 민감한 데이터를 보관하고 관리하기 위한 객체입니다. ConfigMap과 유사하지만, 데이터를 Base64로 인코딩하여 저장한다는 점이 다릅니다.
💡 핵심 요약
- 효율성: Pod가 실행될 때만 메모리에 마운트되어 디스크 노출을 최소화합니다.
- 보안성: 민감한 정보를 애플리케이션 이미지나 YAML 파일에 노출하지 않고 주입할 수 있습니다.
2. Secret 생성하기 🛠️
시크릿 역시 kubectl 명령어와 YAML 파일을 통해 생성할 수 있습니다.
A. kubectl 명령어로 생성
# 사용자 이름과 비밀번호를 포함하는 시크릿 생성
kubectl create secret generic db-user-pass \
--from-literal=username='admin' \
--from-literal=password='S3cretP@ssw0rd'
B. YAML 파일로 정의
YAML 파일을 작성할 때는 반드시 값이 Base64로 인코딩되어야 합니다.
- 예: admin → YWRtaW4=
- 예: S3cretP@ssw0rd → UzNjcmV0UEBzc3cwcmQ=
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque
data:
username: YWRtaW4=
password: UzNjcmV0UEBzc3cwcmQ=
3. Secret을 컨테이너에 연결하기 🔗
시크릿을 사용하는 방법은 ConfigMap과 거의 동일합니다.
① 환경 변수로 주입
spec:
containers:
- name: my-container
image: nginx
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-user-pass
key: password
② 볼륨으로 마운트 (가장 권장되는 방식)
시크릿 볼륨을 사용하면 데이터가 tmpfs(RAM 기반 파일 시스템)에 저장되므로, 데이터가 노드 디스크에 기록되지 않아 더 안전합니다.
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: db-user-pass
4. 쿠버네티스 시크릿의 치명적인 한계와 이유 ⚠️
많은 분이 오해하시는 부분이지만, 쿠버네티스 자체 시크릿 기능만으로는 완전한 보안을 달성하기 어렵습니다.
왜 시크릿만으로는 부족할까?
- 단순 Base64 인코딩: 시크릿 데이터는 암호화(Encryption)가 아닌 인코딩(Encoding)만 되어 있습니다. 즉, 누구나 base64 -d 명령으로 원본 내용을 볼 수 있습니다.
- etcd 내 평문 저장: 기본적으로 시크릿 정보는 쿠버네티스의 저장소인 etcd에 암호화되지 않은 채로 저장됩니다. etcd 접근 권한이 있는 사람은 모든 비밀 정보를 탈취할 수 있습니다.
- 권한 관리의 한계: RBAC을 통해 접근을 제한할 수 있지만, Pod를 생성할 수 있는 권한이 있다면 해당 Pod에 시크릿을 마운트하여 내용을 확인하는 편법이 가능합니다.
5. 더 안전한 대안: 외부 Secret 관리 도구 🛡️
전문적인 보안 수준을 요구하는 환경에서는 쿠버네티스 시크릿 대신(혹은 결합하여) 다음과 같은 솔루션을 사용합니다.
- HashiCorp Vault: 업계 표준과 같은 도구로, 동적 비밀번호 생성 및 강력한 암호화 기능을 제공합니다.
- AWS Secrets Manager / Azure Key Vault: 클라우드 서비스에서 제공하는 관리형 보안 서비스입니다.
- External Secrets Operator (ESO): 외부 도구(Vault, AWS 등)의 정보를 쿠버네티스 시크릿으로 안전하게 동기화해주는 오픈소스 프로젝트입니다.
마무리하며 🎁
주군, 시크릿은 편리하지만 '절대적인 금고'는 아닙니다. 운영 환경에서는 반드시 etcd 암호화(Encryption at Rest)를 활성화하거나, Vault와 같은 전문 도구를 병행하시는 것을 추천드립니다.
'클라우드 > 쿠버네티스' 카테고리의 다른 글
| 쿠버네티스의 App Store, Helm으로 복잡한 매니페스트 한 번에 관리하기 (0) | 2026.02.16 |
|---|---|
| Kustomize를 활용한 쿠버네티스 애플리케이션 설정 관리 가이드 (0) | 2026.02.16 |
| ☸️ Kubernetes ConfigMap: 설정과 코드를 완벽하게 분리하는 법 (0) | 2026.02.09 |
| 🚀 [K8s 심화] 쿠버네티스 확장하기: CRD(Custom Resource Definition) 완벽 가이드 (feat. CKAD) (0) | 2026.02.09 |
| [K8s 보안] 실전 CKAD 대비: NetworkPolicy로 마스터하는 포드 통신 제어 전략 (0) | 2026.02.07 |