개발 창고/Server

Kubernetes Secret 완전 정복 : 민감한 데이터를 안전하게 저장하고 관리하는 방법

Royzero 2025. 8. 6. 22:00
반응형

목차

  1. Secret이란?
  2. ConfigMap과 Secret의 차이
  3. Secret의 주요 특징
  4. Secret 타입 종류
  5. Secret 생성 방법
  6. Secret을 Pod에서 사용하는 방법
  7. Secret 관리와 보안 패턴
  8. 실제 사용 시나리오
  9. 운영 환경에서의 보안 고려사항
  10. 자주 묻는 질문 (FAQ)
  11. 요약 정리

1. Secret이란?

Kubernetes Secret비밀번호, 인증 토큰, TLS 인증서처럼 민감한 데이터를 안전하게 저장하고, Pod나 다른 Kubernetes 리소스에서 참조할 수 있도록 하는 리소스입니다.

  • 데이터는 Base64 인코딩 형태로 저장됩니다.
  • API 서버와 etcd에 저장되며, 필요 시 암호화 설정 가능
  • Pod에 환경변수 또는 볼륨 파일 형태로 주입 가능

중요: Base64는 암호화가 아닌 단순 인코딩입니다. 암호화 저장을 원하면 Kubernetes EncryptionConfiguration을 설정해야 합니다.


2. ConfigMap과 Secret의 차이

많은 초보자들이 Secret과 ConfigMap을 혼동합니다.

항목 ConfigMap Secret
목적 일반 설정 데이터 민감한 데이터
저장 형식 Plain text Base64 인코딩
보안성 낮음 높음 (암호화 가능)
사용 예 API endpoint URL, 환경 설정 값 비밀번호, API 토큰, TLS 키

3. Secret의 주요 특징

  • 민감 데이터 관리: 중요한 값을 안전하게 저장
  • Pod 주입 방식 다양: 환경변수 또는 볼륨 파일로 주입 가능
  • RBAC 제어: 접근 권한을 세밀하게 제한 가능
  • 플러그인 연동 가능: External Secrets, HashiCorp Vault 등과 연동 가능

4. Secret 타입 종류

타입 설명 사용 예
Opaque 기본 키-값 저장 DB 계정, API 키
kubernetes.io/dockerconfigjson Docker 레지스트리 인증 이미지 Pull Secret
kubernetes.io/tls TLS 인증서와 키 HTTPS 서비스 인증서
그 외 커스텀 타입 특정 컨트롤러/플러그인용 Sealed Secrets, External Secrets

5. Secret 생성 방법

1) YAML로 생성

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=       # "admin"의 Base64
  password: c2VjdXJlcGFzcw== # "securepass"의 Base64

Base64 인코딩 방법

echo -n "admin" | base64

2) CLI로 생성

kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=securepass

3) 파일 기반 생성

kubectl create secret generic db-secret \
  --from-file=username.txt \
  --from-file=password.txt

6. Secret을 Pod에서 사용하는 방법

1) 환경변수로 주입

env:
  - name: DB_USER
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: username

2) 볼륨으로 주입

volumes:
  - name: secret-vol
    secret:
      secretName: db-secret

이 방식은 파일로 마운트되어 Pod 내부에서 /etc/secret-volume/username처럼 접근 가능


7. Secret 관리와 보안 패턴

운영 환경에서는 Secret을 단순 YAML로 저장하면 위험합니다.

권장 패턴

  • RBAC 최소 권한 부여: Secret 조회/수정 권한은 꼭 필요한 사용자/서비스만 허용
  • GitOps 시 암호화 저장: SOPS, Sealed Secrets 등을 사용
  • 암호화 저장: etcd 암호화 활성화
  • 네트워크 암호화: API 서버와의 통신을 TLS로 보호
  • 정기 로테이션: 주기적으로 Secret 값 변경

8. 실제 사용 시나리오

  1. DB 접속 정보 관리
    환경변수로 Pod에 주입하여 애플리케이션이 DB에 접속
  2. API 키 관리
    외부 API 호출 시 필요한 인증 토큰 저장
  3. TLS 인증서 배포
    Ingress Controller에 HTTPS 설정 적용
  4. Docker Registry 인증
    Private 이미지 Pull을 위한 로그인 정보 저장

9. 운영 환경에서의 보안 고려사항

  • kubectl get secret -o yaml 명령으로 누구나 Base64 값을 읽을 수 있으므로 RBAC 제한 필수
  • Pod 로그나 환경변수 Dump 시 Secret 값이 노출될 수 있음 → 애플리케이션 로깅 주의
  • Git에 Secret YAML을 저장하지 말 것 (암호화 도구 필수)
  • Secret 갱신 시 Pod 재시작 필요 여부 확인 (환경변수 vs 볼륨 차이)

10. 자주 묻는 질문 (FAQ)

Q1. Secret 값은 자동으로 암호화되나요?
아니요, Base64 인코딩일 뿐입니다. 암호화를 원하면 etcd 암호화 설정 필요

Q2. Secret이 변경되면 Pod에 자동 반영되나요?
환경변수는 재시작 필요, 볼륨 마운트 방식은 자동 반영됨

Q3. Secret을 GitOps로 관리하려면?
SOPS, Sealed Secrets 등 암호화 툴을 활용하는 것이 안전


11. 요약 정리

  • Secret은 Kubernetes의 민감 데이터 안전 저장소
  • ConfigMap과 용도, 보안성에서 다름
  • 운영 시 RBAC, 암호화, GitOps 보안 패턴 적용 필수
  • 환경변수/볼륨 주입 방식에 따른 동작 차이 이해 필요
반응형