Zum Hauptinhalt springen

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

마이그레이션 단계

  1. VSO 설치 및 설정
  2. VaultStaticSecret CRD 생성
  3. ExternalSecret → VaultStaticSecret 변환
  4. 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

관련 문서