Vault
HashiCorp Vault는 Lumie 플랫폼의 중앙 집중식 시크릿 관리 시스템입니다. 데이터베이스 자격 증명, API 키, 인증서 등 모든 민감한 정보를 안전하게 저장하고 관리합니다.
아키텍처
배포 모드
- 모드: Standalone (단일 인스턴스)
- 스토리지: MinIO S3 백엔드 (고가용성은 MinIO의 erasure coding으로 보장)
- 네임스페이스:
vault - 우선순위:
high-priority(중요한 인프라)
구성 요소
Vault Secrets Operator (VSO)
개요
VSO는 Vault와 Kubernetes 간의 브리지 역할을 하며, Vault의 시크릿을 Kubernetes Secret으로 자동 동기화합니다.
주요 CRD
VaultConnection
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultConnection
metadata:
name: vault-connection
namespace: vault
spec:
address: http://vault.vault.svc.cluster.local:8200
skipTLSVerify: true
VaultAuth
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
name: vault-auth
namespace: vault
spec:
vaultConnectionRef: vault-connection
method: kubernetes
mount: kubernetes
allowedNamespaces:
- "*"
kubernetes:
role: vault-secrets-operator
serviceAccount: default
audiences:
- vault
VSO 설정
controller:
manager:
clientCache:
persistenceModel: direct-unencrypted
resources:
requests:
cpu: 15m
memory: 128Mi
limits:
memory: 128Mi
인증 및 권한
Kubernetes 인증
- 인증 방법: Kubernetes Service Account
- 마운트 경로:
kubernetes - 역할:
vault-secrets-operator
RBAC 설정
clusterRoles:
- name: system:auth-delegator
rules:
- apiGroups: ["authentication.k8s.io"]
resources: ["tokenreviews"]
verbs: ["create"]
- apiGroups: ["authorization.k8s.io"]
resources: ["subjectaccessreviews"]
verbs: ["create"]
Vault 시크릿 범위
Vault는 오퍼레이터가 생성하지 않는 시크릿만 보관합니다:
| Vault 보관 대상 | 경로 예시 |
|---|---|
| JWT 서명 키 | secret/infrastructure/jwt |
| OAuth2 클라이언트 시크릿 (Google, Kakao) | secret/infrastructure/oauth2 |
| MinIO 액세스 키 | secret/infrastructure/minio |
| Barman 백업 자격 증명 | secret/infrastructure/barman |
| Redis 비밀번호 | secret/infrastructure/redis |
| CNPG bootstrap seed 비밀번호 | secret/infrastructure/postgresql |
lumie_app DB 비밀번호 | secret/infrastructure/postgresql |
Vault에 보관하지 않는 항목:
- CNPG
*-superuser시크릿 (CloudNativePG 오퍼레이터 생성) - RabbitMQ Topology Operator
User자격 증명 (Topology Operator 생성)
오퍼레이터가 생성한 시크릿을 Vault에 미러링하면 단일 권한 원칙(SoT)이 깨집니다.
시크릿 관리
VaultStaticSecret 사용법
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
name: example-vss
namespace: example
spec:
type: kv-v2
mount: secret
path: example/path
destination:
name: example-secret
create: true
refreshAfter: 30s
vaultAuthRef: vault/vault-auth
템플릿 변환
destination:
name: rabbitmq-secrets
transformation:
templates:
rabbitmq-password: "{{ .Secrets.RABBITMQ_PASSWORD }}"
rabbitmq-erlang-cookie: "{{ .Secrets.RABBITMQ_ERLANG_COOKIE }}"
스토리지 백엔드
MinIO S3 설정
Vault는 MinIO S3를 스토리지 백엔드로 사용합니다:
storage "s3" {
endpoint = "https://minio.minio.svc.cluster.local:9000"
bucket = "vault-storage"
region = "us-east-1"
access_key = "vault-access-key"
secret_key = "vault-secret-key"
s3_force_path_style = true
}
보안 설정
TLS 설정
- 내부 통신: TLS 비활성화 (클러스터 내부)
- 외부 접근: Teleport를 통한 보안 접근
접근 제어
- UI 접근: Teleport
- API 접근: 서비스 계정 기반 인증
- 네트워크: ClusterIP (내부 접근만)
마이그레이션
ESO → VSO 마이그레이션
기존 External Secrets Operator에서 Vault Secrets Operator로 마이그레이션 중입니다:
# 하위 호환성을 위한 ClusterSecretStore (제거 예정)
clusterSecretStore:
enabled: true
name: vault-backend
vault:
server: http://vault.vault.svc.cluster.local:8200
path: secret
version: v2
마이그레이션 단계
- VSO 설치 및 설정
- VaultStaticSecret CRD 생성
- ExternalSecret → VaultStaticSecret 변환
- ClusterSecretStore 제거
운영
리소스 할당
resources:
requests:
cpu: 15m
memory: 100Mi
limits:
memory: 156Mi
업데이트 전략
updateStrategyType: "RollingUpdate"
모니터링
- 헬스체크:
/v1/sys/health - 메트릭: Prometheus 통합 (설정 시)
- 로그: 구조화된 JSON 로그
사용 예시
데이터베이스 자격 증명
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
name: postgres-credentials
namespace: lumie-backend
spec:
type: kv-v2
mount: secret
path: database/postgres
destination:
name: postgres-secret
transformation:
templates:
username: "{{ .Secrets.username }}"
password: "{{ .Secrets.password }}"
vaultAuthRef: vault/vault-auth
API 키 관리
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
name: external-api-keys
namespace: lumie-worker
spec:
type: kv-v2
mount: secret
path: api/external-services
destination:
name: api-keys
vaultAuthRef: vault/vault-auth