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 요청을 유닉스 도메인 소켓으로 수신해요. 프로세스 간 통신은 파일시스템 권한에 기반한 커널 적용 접근 제어를 사용합니다.
시작 전에:
- Vault 관리자가 Transit 플러그인으로 KEK를 Vault의 명명된 암호화 키로 생성하고, Vault 정책으로 접근을 제한해요.
- Vault 관리자가 인증(AppRole)을 정책에 연결하고, 관련 appRole ID와 시크릿 ID를 쿠버네티스 관리자에게 제공해요.
- 역할 ID(role ID) 는 플래그나 환경 변수로 구성할 수 있는 비민감 식별자예요.
- 시크릿 ID 는 쿠버네티스 컨트롤 플레인 노드에 저장되고 vault-kube-kms 프로세스가 파일시스템 경로에서 읽는 민감 자격 증명이에요.
- 쿠버네티스 관리자가 Vault 서버 주소, appRole ID, 시크릿 ID로 vault-kube-kms 프로세스를 구성해요.
시작 시:
- vault-kube-kms 프로세스가 Vault에 인증하는 Vault 클라이언트를 만들고 캐시합니다. 이 클라이언트는 인증 토큰을 자동으로 갱신하고, 토큰이 만료되면 재인증을 처리해요.
- 쿠버네티스 API 서버가 하나의 DEK 시드를 생성하고, 그 클라이언트로 vault-kube-kms 프로세스에 암호화를 요청해요.
- Vault 클라이언트가 TLS로 Vault 서버에 연결하고, 쿠버네티스 관리자가 제공한 AppRole 인증 세부 정보로 인증해요.
- 인증되면 vault-kube-kms 프로세스가 시드를 Transit 플러그인에 보내 암호화합니다. KEK는 결코 Vault 밖으로 나가지 않으며, KEK를 포함한 모든 암호화 작업은 Transit 플러그인 안에서 일어나요.
- Transit 플러그인이 암호화된 시드를 vault-kube-kms 프로세스에 반환해요.
- vault-kube-kms 프로세스가 암호화된 시드를 상태 정보와 현재 KEK 버전과 함께 쿠버네티스 API 서버에 보고해요.
- 쿠버네티스 API 서버가 임의 데이터와 HMAC 기반 키 유도 함수(HKDF)로 시드에서 고유한 일회용 DEK를 유도해요.
- 쿠버네티스 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 클러스터 접근을 보호해야 해요.