Vault KMS 보안

Vault KMS 보안 (KMS security)

Vault Kubernetes Key Management의 보안 아키텍처, 프로세스 흐름, 보안 통제, 위협 모델을 다룹니다.

출처: 문서

본문

베타 기능이에요. 베타 기능은 안정적이지만 아직 불완전할 수 있고 변경될 수 있어요. 프로덕션 Vault 배포에 베타 기능을 쓰는 것은 권장하지 않습니다.

쿠버네티스 KMS 플러그인은 Vault Transit 시크릿 엔진 플러그인을 봉투 암호화(envelope encryption)의 외부 KEK 제공자로 사용해요. 봉투 암호화는 두 계층 암호화 방식으로, 데이터를 데이터 암호화 키(DEK)로 암호화한 다음 그 DEK를 다시 두 번째 키 암호화 키(KEK)로 암호화합니다. 봉투 암호화는 중앙 집중식 키 관리와 회전을 가능하게 하면서도 대량의 데이터를 효율적으로 암호화해요.

Vault Kubernetes Key Management 개요

Vault Kubernetes Key Management는 쿠버네티스 KMS v2 프로토콜을 사용하는 gRPC 서버(vault-kube-kms) 를 제공해요. 이 서버는 쿠버네티스 API 서버와 Vault 같은 외부 키 관리 서비스 사이의 인터페이스 역할을 해서, 쿠버네티스 시크릿과 기타 etcd 리소스의 봉투 암호화를 지원합니다. 모든 암호화 작업마다 새 DEK를 생성하던 KMS v1과 달리, KMS v2는 DEK 시드(seed) 방식을 사용해요.

vault-kube-kms 프로세스는 쿠버네티스 컨트롤 플레인에서 스태틱 파드(static Pod)로 실행됩니다. 이 프로세스는:

  • API 서버의 gRPC 요청을 유닉스 도메인 소켓에서 수신해요.
  • AppRole 인증으로 Vault에 인증해요.
  • 암호화/복호화 작업을 Vault Transit으로 전달해요.
  • 자동 토큰 갱신으로 Vault 클라이언트를 캐시해요.
  • 상태(health)와 현재 KEK 버전을 쿠버네티스에 보고해요.

쿠버네티스 API 서버와 통신하기 위해 vault-kube-kms 프로세스는 구성 가능한 경로(기본: /tmp/vault-kube-kms.socket)에 소유자와 그룹에 대한 읽기/쓰기/실행 권한(0770)으로 유닉스 소켓을 만듭니다. 기본 권한은 프로세스 자체(소유자)와 같은 그룹의 다른 프로세스들로 접근을 제한해 쿠버네티스 플러그인을 보호해요.

프로세스 흐름

vault-kube-kms 프로세스는 쿠버네티스 API 서버와 같은 컨트롤 플레인 노드에서 실행되며, gRPC 요청을 유닉스 도메인 소켓으로 수신해요. 프로세스 간 통신은 파일시스템 권한에 기반한 커널 적용 접근 제어를 사용합니다.

시작 전에:

  1. Vault 관리자가 Transit 플러그인으로 KEK를 Vault의 명명된 암호화 키로 생성하고, Vault 정책으로 접근을 제한해요.
  2. Vault 관리자가 인증(AppRole)을 정책에 연결하고, 관련 appRole ID와 시크릿 ID를 쿠버네티스 관리자에게 제공해요.
    • 역할 ID(role ID) 는 플래그나 환경 변수로 구성할 수 있는 비민감 식별자예요.
    • 시크릿 ID 는 쿠버네티스 컨트롤 플레인 노드에 저장되고 vault-kube-kms 프로세스가 파일시스템 경로에서 읽는 민감 자격 증명이에요.
  3. 쿠버네티스 관리자가 Vault 서버 주소, appRole ID, 시크릿 ID로 vault-kube-kms 프로세스를 구성해요.

시작 시:

  1. vault-kube-kms 프로세스가 Vault에 인증하는 Vault 클라이언트를 만들고 캐시합니다. 이 클라이언트는 인증 토큰을 자동으로 갱신하고, 토큰이 만료되면 재인증을 처리해요.
  2. 쿠버네티스 API 서버가 하나의 DEK 시드를 생성하고, 그 클라이언트로 vault-kube-kms 프로세스에 암호화를 요청해요.
  3. Vault 클라이언트가 TLS로 Vault 서버에 연결하고, 쿠버네티스 관리자가 제공한 AppRole 인증 세부 정보로 인증해요.
  4. 인증되면 vault-kube-kms 프로세스가 시드를 Transit 플러그인에 보내 암호화합니다. KEK는 결코 Vault 밖으로 나가지 않으며, KEK를 포함한 모든 암호화 작업은 Transit 플러그인 안에서 일어나요.
  5. Transit 플러그인이 암호화된 시드를 vault-kube-kms 프로세스에 반환해요.
  6. vault-kube-kms 프로세스가 암호화된 시드를 상태 정보와 현재 KEK 버전과 함께 쿠버네티스 API 서버에 보고해요.
  7. 쿠버네티스 API 서버가 임의 데이터와 HMAC 기반 키 유도 함수(HKDF)로 시드에서 고유한 일회용 DEK를 유도해요.
  8. 쿠버네티스 API 서버가 데이터 암호화 키를 암호화된 데이터와 함께 etcd에 저장해요. Vault는 데이터나 시드를 저장하지 않아요.

시작 후에는 쿠버네티스 API 서버가 KEK 회전 이벤트를 감지할 때만 vault-kube-kms 프로세스에 연결합니다.

보안 통제 (Security controls)

Vault Kubernetes Key Management는 종단 간 보안 통제를 제공해요.

통제 구현
소켓 권한 umask 0007로 생성된 유닉스 소켓, 소유자+그룹으로 접근 제한
Vault로의 TLS 기본 TLS 활성화, 커스텀 CA 인증서 지원, SNI 구성 가능
인증 보호된 파일시스템 경로의 시크릿 ID를 사용하는 AppRole
토큰 관리 토큰 만료 시 재인증을 포함한 자동 갱신
비루트 컨테이너 컨테이너 또는 OpenShift UBI 이미지에서 UID 65532(nonroot)로 실행
입력 검증 키 ID, 구성 값, Vault 응답의 엄격한 검증
Enterprise 검증 Vault Enterprise 라이선스 검증
로깅 구성 가능한 수준과 민감 데이터 마스킹이 있는 구조화 JSON 로깅
메트릭 gRPC 지연 히스토그램이 있는 Prometheus 엔드포인트

위협 모델 범위 (Threat model coverage)

Vault Kubernetes Key Management는 다양한 보안 위협을 다룹니다.

위협 설명 주요 완화
무단 소켓 접근 컨트롤 플레인 노드의 프로세스가 허가 없이 vault-kube-kms 프로세스와 통신 시도 제한된 소켓 권한, 비루트 실행, 제한된 노드 접근
네트워크 가로채기 공격자가 vault-kube-kms 프로세스와 Vault 사이의 트래픽 가로챔 기본 TLS 활성화, 커스텀 CA 인증서·SNI 구성 지원
키 노출 Transit 암호화 키(KEK) 노출 KEK가 결코 Vault 밖으로 나가지 않음. vault-kube-kms 프로세스는 원시 키 자료가 아닌 암호문·평문만 처리
데이터 재생·롤백 공격자가 이전 암호화 데이터로 대체 키 버전 추적으로 쿠버네티스가 오래된 암호화를 감지해 재암호화를 트리거
Vault 사용 불가 Vault를 사용할 수 없게 됨 쿠버네티스 KMS v2 덕분에 API 서버가 DEK 시드를 로컬 캐시해 정상 동작 중 Vault 의존도를 낮춤
정보 유출 로그나 메트릭에 민감 데이터 표시 민감 값 마스킹이 있는 구조화 로깅. 메트릭은 지연과 카운터만 노출
리소스 고갈 과도한 요청이 Vault Kubernetes Key Management를 압도 연결 처리의 클라이언트 측 캐싱, 구성 가능한 요청 타임아웃

위협 모델 제외 사항 (Threat model exclusions)

Vault Kubernetes Key Management는 인프라 수준 통제가 필요한 위협으로부터는 보호하지 않아요.

  • 쿠버네티스 클러스터 관리자가 컨트롤 플레인 노드에 대한 접근을 적절히 보호해야 해요.
  • Vault 클러스터 관리자가 적절한 정책으로 Vault 클러스터 접근을 보호해야 해요.

더 알아보기 (Learn more)