etcd 및 컨트롤 플레인 부팅 디스크 암호화


이 페이지에서는 Cloud Key Management Service(Cloud KMS)에서 관리하는 키를 사용하여 Google Kubernetes Engine(GKE) 컨트롤 플레인에 저장된 데이터를 암호화하는 방법을 보여줍니다. etcd, GKE 클러스터 아키텍처, Cloud KMS와 같은 개념에 이미 익숙해야 합니다.

이 페이지에서는 GKE의 선택적 컨트롤 플레인 기능 집합 중 한 부분을 설명합니다. 이 기능을 사용하면 컨트롤 플레인 보안 상황 확인, 관리하는 키를 사용하여 컨트롤 플레인에서 암호화 및 사용자 인증 정보 서명 구성과 같은 태스크를 수행할 수 있습니다. 자세한 내용은 GKE control plane authority 정보를 참조하세요.

기본적으로 Google Cloud 는 다양한 보안 조치를 관리형 컨트롤 플레인에 적용합니다. 이 페이지에서는 GKE 컨트롤 플레인을 더 잘 파악하거나 제어할 수 있는 선택적 기능을 설명합니다.

컨트롤 플레인 부팅 디스크 및 etcd 암호화 정보

기본적으로 GKE는 Google Cloud에서 관리하는 암호화 키를 사용하여 컨트롤 플레인 노드의 부팅 디스크, etcd에 데이터를 저장하는 디스크, etcd의 Google Cloud 내부 운영 백업을 암호화합니다. 이 기본 암호화에 대한 자세한 내용은 기본 저장 데이터 암호화를 참조하세요. 원하는 경우 Cloud KMS를 사용하여 관리하는 자체 암호화 키를 사용하여 이러한 리소스를 암호화할 수 있습니다. 자세한 내용은 제어 영역 부팅 디스크 및 etcd 암호화를 참고하세요.

GKE가 컨트롤 플레인 리소스를 암호화하는 데 사용하는 키를 Cloud KMS에서 만듭니다. 이러한 리소스를 만들 때는 다음 사항을 고려하세요.

  • 각 키의 용도와 관계없이 클러스터의 모든 키에 키링 하나를 사용할 수 있습니다. 자체 인증 기관 설정과 같은 다른 용도로 사용한 기존 키링이 있으면 이 가이드에서 해당 키링을 사용할 수 있습니다.
  • 지연 시간이 단축될 수 있도록 클러스터와 동일한 Google Cloud 위치에 키를 만들어야 합니다.
  • 대부분의 사용 사례에서는 소프트웨어 Cloud KMS 키 보호 수준을 사용할 수 있습니다. Cloud HSM과 함께 하드웨어 키를 사용할 수도 있습니다.
  • 이러한 키는 대칭 암호화에 사용되므로 encryption 값과 함께 --purpose 플래그를 지정해야 합니다.
  • 키 폐기의 기본 기간을 수정해서는 안 됩니다.

다른 GKE control plane authority 기능과의 사용

GKE control plane authority는 클러스터를 만들 때 동시에 사용 설정해야 하는 자체 관리 키와 관련된 다음 기능을 제공합니다.

새 GKE 클러스터를 만들 때만 이러한 기능을 사용 설정할 수 있습니다. 이러한 기능을 사용하도록 기존 클러스터를 업데이트할 수 없습니다. 같은 클러스터에서 이 두 기능을 모두 사용하려면 두 가이드 모두에서 모든 키 및 CA 구성 절차를 수행한 후 클러스터 만들기 섹션의 설명대로 두 기능 집합을 모두 사용 설정하는 클러스터 생성 명령어를 실행합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 키 프로젝트에 클러스터용 Cloud KMS 키링이 있는지 확인합니다. 클러스터 위치에서 기존 키링을 사용할 수 있습니다. 새 키링을 만들려면 키링 만들기를 참조하세요.
  • Enable the Cloud Key Management Service API.

    Enable the API

프로젝트 식별

다음과 같이 별도의 Google Cloud 프로젝트를 사용하는 것이 좋습니다.

  • 키 프로젝트: 모든 키를 포함합니다.
  • 클러스터 프로젝트: GKE 클러스터를 포함합니다.

키와 GKE 클러스터에 같은 프로젝트를 선택적으로 사용할 수 있지만 키와 암호화 작업을 관리하는 팀이 클러스터를 관리하는 팀과 구분되도록 별도의 프로젝트를 사용하는 것이 좋습니다.

필수 역할 및 권한

자체 암호화 키를 실행하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

요구사항

클러스터는 GKE 버전 1.31.1-gke.1846000 이상을 실행해야 합니다.

제한사항

  • 클러스터를 만드는 동안에만 부팅 디스크와 etcd 암호화 키를 구성할 수 있습니다.
  • 리전 Standard 모드 클러스터와 Autopilot 클러스터의 경우 클러스터를 만드는 리전에 해당 리전의 영역 최소 3개 이상에서 Hyperdisk Balanced의 비밀 모드를 사용할 수 있는 용량이 있어야 합니다.

    영역 Standard 모드 클러스터의 경우 클러스터 영역에 Hyperdisk Balanced 용량이 있어야 합니다. 용량에 대한 도움이 필요하면 Cloud Customer Care에 문의하세요.

  • GKE에서는 Cloud KMS의 키만 지원합니다. 다른 Kubernetes KMS 제공업체나 다른 암호화 제공업체를 사용할 수 없습니다.

  • Cloud External Key Manager(Cloud EKM) 키는 지원되지 않습니다.

  • 재해 복구 전용인 etcd의 Google Cloud 내부 운영 백업에 액세스하거나 상호작용할 수 없습니다.

  • 멀티 리전 키링은 지원되지 않습니다. 리전별 키링을 사용해야 합니다.

  • GKE control plane authority 기능을 사용할 수 있는 리전과 영역은 다음과 같은 특정 기능도 사용해야 하는지에 따라 달라집니다.

    • 고객 관리 암호화 키를 사용하여 컨트롤 플레인 부팅 디스크를 암호화하려면 클러스터가 다음 리전 중 하나에 있어야 합니다.
      • asia-east1
      • asia-northeast1
      • asia-southeast1
      • europe-west1
      • europe-west4
      • us-central1
      • us-east1
      • us-east4
      • us-east5
      • us-south1
      • us-west1
      • us-west3
      • us-west4
    • GKE control plane authority 기능과 함께 Confidential GKE Node를 사용하려면 클러스터가 Hyperdisk Balanced의 비밀 모드를 지원하는 리전에 있어야 합니다.

    이러한 기능을 사용하지 않는 경우 모든 Google Cloud 위치에서 GKE control plane authority 기능을 사용할 수 있습니다.

키 만들기

이 섹션에서는 컨트롤 플레인의 부팅 디스크 및 etcd 디스크용 암호화 키와 etcd의 Google Cloud내부 운영 백업용 별도의 암호화 키를 만듭니다. 하나의 키링을 사용하여 이러한 모든 키와 클러스터의 다른 키를 보관할 수 있습니다.

  1. 컨트롤 플레인 부팅 디스크 및 etcd 디스크의 암호화 키를 만듭니다.

    gcloud kms keys create KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    다음을 바꿉니다.

    • KCP_DISK_KEY_NAME: 컨트롤 플레인 부팅 디스크 및 etcd 디스크의 암호화 키 이름
    • KEYRING_NAME: 클러스터의 암호화 키를 저장할 키링의 이름
    • LOCATION: 키링의 Google Cloud 위치. 클러스터 위치와 같아야 합니다. 리전 목록은 Cloud KMS 위치 표에서 '리전'을 필터링하세요.
    • PROTECTION_LEVEL: 키 보호 수준(예: software 또는 hsm)
    • KEY_PROJECT_ID: 키 프로젝트의 프로젝트 ID
  2. etcd 내부 백업 암호화 키를 만듭니다.

    gcloud kms keys create ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME을 etcd 내부 백업 암호화 키 이름으로 바꿉니다.

GKE 서비스 에이전트에 IAM 역할 부여

이 섹션에서는 클러스터 프로젝트의 GKE 서비스 에이전트에 생성한 키에 대한 IAM 역할을 부여합니다. 이러한 키를 사용하여 해당 컨트롤 플레인 리소스를 암호화하려면 GKE 서비스 에이전트에 이러한 역할이 필요합니다.

  1. 클러스터 프로젝트 번호를 찾습니다.

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    CLUSTER_PROJECT_ID를 GKE 클러스터 프로젝트의 프로젝트 ID로 바꿉니다.

    출력은 다음과 비슷합니다.

    1234567890
    
  2. 클러스터 프로젝트의 GKE 서비스 에이전트에 부팅 디스크 및 etcd 디스크의 암호화 키에 대한 Cloud KMS CryptoKey 암호화/복호화(roles/cloudkms.cryptoKeyEncrypterDecrypter) 역할을 부여합니다.

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project=KEY_PROJECT_ID
    

    다음을 바꿉니다.

    • KCP_DISK_KEY_NAME: 디스크 암호화 키 이름
    • LOCATION: 키의 Google Cloud 위치
    • KEYRING_NAME: 암호화 키가 포함된 키링의 이름
    • CLUSTER_PROJECT_NUMBER: 이전 단계에서 확인한 클러스터 프로젝트의 숫자 프로젝트 번호
    • KEY_PROJECT_ID: 키 프로젝트의 프로젝트 ID
  3. 클러스터 프로젝트의 GKE 서비스 에이전트에 부팅 디스크 및 etcd 디스크의 암호화 키에 대한 위임을 통한 Cloud KMS CryptoKey 암호화/복호화(roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) 역할을 부여합니다.

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \
        --project=KEY_PROJECT_ID
    
  4. 키 순환을 위해 클러스터 프로젝트의 GKE 서비스 에이전트에 부팅 디스크 및 etcd 디스크의 암호화 키에 대한 Cloud KMS 키 사용자 역할을 부여합니다.

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/container.cloudKmsKeyUser \
        --project=KEY_PROJECT_ID
    
  5. 클러스터 프로젝트의 GKE 서비스 에이전트에 etcd 내부 백업 암호화 키에 대한 Cloud KMS CryptoKey 암호화(roles/cloudkms.cryptoKeyEncrypter) 역할을 부여합니다.

    gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypter \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME을 etcd 운영 백업 암호화 키 이름으로 바꿉니다.

    roles/cloudkms.cryptoKeyEncrypter 역할을 부여하면 GKE에서 개발자를 대신하여 데이터베이스 복원을 수행할 수 없으며 데이터베이스 문제 발생 시 기능을 복원하는 데 걸리는 시간이 크게 증가합니다. GKE에서 복원을 수행하도록 허용하려면 대신 roles/cloudkms.cryptoKeyEncrypterDecrypter 역할을 부여합니다.

클러스터에서 암호화 키 사용

이 섹션에서는 암호화 키 경로를 확인하는 방법을 보여줍니다.

  1. 디스크 암호화 키 경로를 확인합니다.

    gcloud kms keys describe KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    다음을 바꿉니다.

    • KCP_DISK_KEY_NAME: 컨트롤 플레인 부팅 디스크 및 etcd 디스크의 암호화 키 이름
    • KEYRING_NAME: 키가 포함된 키링의 이름
    • LOCATION: 키의 Google Cloud 위치
    • KEY_PROJECT_ID: 키 프로젝트의 프로젝트 ID

    출력은 다음과 비슷합니다.

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
    
  2. etcd 내부 백업 암호화 키 경로를 확인합니다.

    gcloud kms keys describe ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    ETCD_BACKUP_KEY_NAME을 etcd 운영 백업 암호화 키 이름으로 바꿉니다.

    출력은 다음과 비슷합니다.

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
    

클러스터 만들기

이 섹션에서는 구성하려는 GKE control plane authority 기능에 따라 지정된 다양한 옵션으로 클러스터를 만듭니다. 클러스터 생성 중에만 클러스터에 이러한 기능을 구성할 수 있습니다. 다음 명령어는 Standard 모드 클러스터를 만듭니다. 대신 Autopilot 모드 클러스터를 만들려면 gcloud container clusters create-auto 명령어와 함께 같은 플래그를 사용합니다.

  • 디스크 암호화를 구성하고 자체 CA 및 서비스 계정 서명 키를 실행하는 클러스터를 만들려면 다음을 수행합니다.

    1. 자체 인증 기관 및 키 실행의 모든 키 및 CA 구성 단계를 수행합니다.
    2. 새 클러스터에 CA 및 키 설정의 안내에 따라 각 서비스 계정 키와 CA의 경로를 찾습니다.
    3. 클러스터 만들기:

      gcloud container clusters create CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \
          --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \
          --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \
          --cluster-ca=PATH_TO_CLUSTER_CA \
          --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \
          --etcd-api-ca=PATH_TO_ETCD_API_CA \
          --aggregation-ca=PATH_TO_AGGREGATION_CA
      

      다음을 바꿉니다.

      • CLUSTER_NAME: 새 클러스터의 이름입니다.
      • LOCATION: 새 클러스터 위치
      • CLUSTER_PROJECT_ID: 클러스터 프로젝트의 프로젝트 ID
      • PATH_TO_DISK_KEY: 이 페이지의 이전 단계에서 사용한 디스크 암호화 키의 경로
      • PATH_TO_ETCD_BACKUP_KEY: 이 페이지의 이전 단계에서 사용한 etcd 내부 백업 암호화 키의 경로
      • PATH_TO_SIGNING_KEY_VERSION: Cloud KMS의 Kubernetes ServiceAccount 서명 키 버전의 경로
      • PATH_TO_VERIFICATION_KEY_VERSION: Cloud KMS의 Kubernetes ServiceAccount 확인 키 버전의 경로
      • PATH_TO_CLUSTER_CA: 클러스터 CA 풀의 경로
      • PATH_TO_ETCD_PEER_CA: etcd 피어 CA 풀의 경로
      • PATH_TO_ETCD_API_CA: etcd API CA 풀의 경로
      • PATH_TO_AGGREGATION_CA: 집계 CA 풀의 경로
  • 이 가이드에서 만든 키를 사용하여 디스크 암호화만 구성하는 클러스터를 만들려면 다음 명령어를 실행합니다.

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
        --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 새 클러스터의 이름입니다.
    • LOCATION: 새 클러스터 위치
    • CLUSTER_PROJECT_ID: 클러스터 프로젝트의 프로젝트 ID
    • PATH_TO_DISK_KEY: 이전 단계의 디스크 암호화 키 경로
    • PATH_TO_ETCD_BACKUP_KEY: 이전 단계의 etcd 내부 백업 암호화 키 경로

새 Standard 모드 클러스터를 만들 때 이러한 플래그를 모두 지정할 수도 있습니다.

암호화 키 상태 확인

이 섹션에서는 클러스터 생성 중에 사용된 암호화 키를 확인하는 방법을 보여줍니다. Cloud Logging을 사용하거나 Google Cloud CLI를 사용하여 이 확인을 수행할 수 있습니다.

Logging을 사용하여 키 확인

Logging을 사용하여 키를 확인하려면 다음을 수행합니다.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 다음 쿼리를 지정하여 클러스터 생성 로그를 가져옵니다.

    resource.type="gke_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    
  3. 쿼리 실행을 클릭합니다.

출력에서 클러스터 생성 파라미터에 다음 예시와 같이 Cloud KMS에서 설정한 키에 해당하는 키 경로가 포함되어 있는지 확인합니다.

# lines omitted for clarity
userManagedKeysConfig: {
  controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
  gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}

gcloud CLI를 사용하여 키 확인

gcloud CLI를 사용하여 암호화 키를 확인하려면 다음을 수행합니다.

  1. 디스크 암호화 키의 경우 다음 명령어를 실행합니다.

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
    
  2. etcd 내부 백업 암호화 키의 경우 다음 명령어를 실행합니다.

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
    

다음 단계