데이터 암호화를 위해 KMS 제공자 사용하기

데이터 암호화를 위해 KMS 제공자 사용하기 (Using a KMS provider for data encryption)

이 페이지는 비밀 데이터 암호화를 활성화하도록 키 관리 서비스(Key Management Service, KMS) 제공자와 플러그인을 구성하는 방법을 보여드려요. 쿠버네티스 1.37에는 두 가지 버전의 KMS 저장소 암호화가 있어요. 가능하면 KMS v2를 사용해야 해요. KMS v1은 (쿠버네티스 v1.28부터) 폐기되었고 (쿠버네티스 v1.29부터) 기본적으로 비활성화되었기 때문이에요. KMS v2는 KMS v1보다 훨씬 더 나은 성능 특성을 제공해요.

주의: 이 문서는 KMS v2의 일반 공개(GA) 구현(및 폐기된 버전 1 구현)을 위한 것이에요. 쿠버네티스 v1.29보다 오래된 컨트롤 플레인 컴포넌트를 사용한다면, 클러스터가 실행하는 쿠버네티스 버전 문서의 상당 페이지를 확인하세요. 더 이른 쿠버네티스 릴리스는 정보 보안과 관련될 수 있는 다른 동작을 가졌어요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

필요한 쿠버네티스 버전은 선택한 KMS API 버전에 따라 달라져요. 쿠버네티스는 KMS v2를 사용할 것을 권장해요.

  • KMS API v1을 선택해 v1.27 이전 버전의 클러스터를 지원하거나 KMS v1만 지원하는 레거시 KMS 플러그인이 있다면, 어떤 지원되는 쿠버네티스 버전이든 동작할 거예요. 이 API는 쿠버네티스 v1.28부터 폐기됐어요. 쿠버네티스는 이 API의 사용을 권장하지 않아요.

버전을 확인하려면 kubectl version을 입력하세요.

KMS v1

기능 상태: Kubernetes v1.28부터 Deprecated (폐기).

쿠버네티스 버전 1.10.0 이상이 필요해요.

  • 버전 1.29 이상에서 KMS의 v1 구현은 기본적으로 비활성화돼요. 기능을 활성화하려면 --feature-gates=KMSv1=true를 설정해 KMS v1 제공자를 구성해요.
  • 클러스터는 etcd v3 이상을 사용해야 해요.

KMS v2

  • 기능 상태: Kubernetes v1.29부터 Stable.
  • 클러스터는 etcd v3 이상을 사용해야 해요.

KMS 암호화와 객체별 암호화 키 (KMS encryption and per-object encryption keys)

KMS 암호화 제공자는 etcd의 데이터를 암호화하기 위해 봉투 암호화(envelope encryption) 체계를 사용해요. 데이터는 데이터 암호화 키(DEK)로 암호화돼요. DEK는 원격 KMS에 저장되고 관리되는 키 암호화 키(KEK)로 암호화돼요.

(폐기된) KMS의 v1 구현을 사용한다면 각 암호화에 새 DEK가 생성돼요.

KMS v2에서는 각 암호화에 새 DEK가 생성돼요. API 서버는 키 파생 함수(key derivation function)를 사용해 비밀 시드(secret seed)와 일부 랜덤 데이터를 결합해 단일 사용 데이터 암호화 키를 생성해요. 시드는 KEK가 회전될 때마다 회전돼요(자세한 내용은 아래 "key_id와 키 회전 이해" 섹션 참고).

KMS 제공자는 UNIX 도메인 소켓을 통해 특정 KMS 플러그인과 통신하기 위해 gRPC를 사용해요. gRPC 서버로 구현되고 쿠버네티스 컨트롤 플레인과 같은 호스트에 배포되는 KMS 플러그인은 원격 KMS와의 모든 통신을 담당해요.

KMS 제공자 구성하기 (Configuring the KMS provider)

API 서버에 KMS 제공자를 구성하려면 암호화 구성 파일의 providers 배열에 kms 유형의 제공자를 포함하고 다음 속성을 설정해요.

KMS v1

  • apiVersion: KMS 제공자의 API 버전. 이 값을 비워 두거나 v1로 설정해요.
  • name: KMS 플러그인의 표시 이름. 설정 후에는 변경할 수 없어요.
  • endpoint: gRPC 서버(KMS 플러그인)의 리슨 주소. 엔드포인트는 UNIX 도메인 소켓이에요.
  • cachesize: 클리어 상태로 캐시할 데이터 암호화 키(DEK)의 수. 캐시되면 DEK는 KMS에 다시 호출하지 않고 사용할 수 있어요. 반면 캐시되지 않은 DEK는 풀기(unwrap) 위해 KMS에 호출해야 해요.
  • timeout: kube-apiserver가 오류를 반환하기 전에 kms-plugin이 응답할 때까지 기다리는 시간(기본값은 3초).

KMS v2

  • apiVersion: KMS 제공자의 API 버전. v2로 설정해요.
  • name: KMS 플러그인의 표시 이름. 설정 후에는 변경할 수 없어요.
  • endpoint: gRPC 서버(KMS 플러그인)의 리슨 주소. 엔드포인트는 UNIX 도메인 소켓이에요.
  • timeout: kube-apiserver가 오류를 반환하기 전에 kms-plugin이 응답할 때까지 기다리는 시간(기본값은 3초).

KMS v2는 cachesize 속성을 지원하지 않아요. 서버가 KMS 호출을 통해 DEK를 풀면 모든 데이터 암호화 키(DEK)가 클리어 상태로 캐시돼요. 일단 캐시되면 DEK는 KMS에 호출하지 않고 무기한 복호화를 수행하는 데 사용될 수 있어요.

"저장소 암호화 구성 이해"를 참고하세요.

KMS 플러그인 구현하기 (Implementing a KMS plugin)

KMS 플러그인을 구현하려면 새 플러그인 gRPC 서버를 개발하거나 클라우드 제공업체가 이미 제공하는 KMS 플러그인을 활성화할 수 있어요. 그런 다음 플러그인을 원격 KMS와 통합하고 쿠버네티스 컨트롤 플레인에 배포해요.

클라우드 제공업체가 지원하는 KMS 활성화하기 (Enabling the KMS supported by your cloud provider)

클라우드 제공업체 특정 KMS 플러그인을 활성화하는 방법은 클라우드 제공업체를 참고하세요.

KMS 플러그인 gRPC 서버 개발하기 (Developing a KMS plugin gRPC server)

Go용으로 사용 가능한 스텁 파일을 사용해 KMS 플러그인 gRPC 서버를 개발할 수 있어요. 다른 언어의 경우 proto 파일을 사용해 gRPC 서버 코드 개발에 사용할 수 있는 스텁 파일을 만들어요.

KMS v1

Go 사용: 스텁 파일 api.pb.go의 함수와 데이터 구조를 사용해 gRPC 서버 코드를 개발해요. Go 이외의 언어 사용: protoc 컴파일러를 proto 파일 api.proto와 함께 사용해 특정 언어용 스텁 파일을 생성해요.

KMS v2

Go 사용: 과정을 더 쉽게 만드는 상위 레벨 라이브러리가 제공돼요. 하위 레벨 구현은 스텁 파일 api.pb.go의 함수와 데이터 구조를 사용해 gRPC 서버 코드를 개발할 수 있어요. Go 이외의 언어 사용: protoc 컴파일러를 proto 파일 api.proto와 함께 사용해 특정 언어용 스텁 파일을 생성해요.

그런 다음 스텁 파일의 함수와 데이터 구조를 사용해 서버 코드를 개발해요.

(계속) 아래 나머지 섹션에서 KMS v2 프로세스/서버/연결 규약, KMS 구성 파일 예시, 키 회전에 대한 자세한 내용은 원문을 참고하세요.

더 알아보기 (Learn more)