etcd 및 제어 영역 부팅 디스크 암호화


에 문의하세요.

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

이 페이지에서는 GKE의 선택적 제어 영역 기능 세트 중 하나를 설명합니다. 이 기능을 사용하면 제어 영역 보안 상태를 확인하거나 관리하는 키를 사용하여 제어 영역에서 암호화 및 사용자 인증 정보 서명을 구성하는 등의 작업을 실행할 수 있습니다. 자세한 내용은 GKE 제어 영역 권한 정보를 참고하세요.

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

제어 영역 부팅 디스크 및 etcd 암호화 정보

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

Cloud KMS에서 GKE가 제어 평면 리소스를 암호화하는 데 사용하는 키를 만듭니다. 이러한 리소스를 만들 때는 다음 사항을 고려하세요.

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

다른 GKE 제어 영역 권한 기능과의 사용

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

이러한 기능은 새 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의 기밀 모드를 사용할 수 있어야 합니다.

    영역 표준 모드 클러스터의 경우 클러스터 영역에 하이퍼디스크 균형 용량이 있어야 합니다. 용량과 관련하여 도움이 필요하면 Cloud Customer Care에 문의하세요.

    Hyperdisk 균형의 비밀 모드는 특정 지역에서만 사용할 수 있습니다. 자세한 내용은 비밀 모드의 하이퍼디스크 균형 볼륨에 지원되는 리전을 참고하세요.

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

  • Cloud 외부 키 관리자 (Cloud EKM) 키는 지원되지 않습니다.

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

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

키 만들기

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

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

    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. 부팅 디스크 및 etcd 디스크의 암호화 키에 대한 위임 전달을 통한 Cloud KMS CryptoKey 암호화/복호화(roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) 역할을 클러스터 프로젝트의 GKE 서비스 에이전트에 부여합니다.

    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 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 컨트롤 플레인 기관 기능에 따라 지정된 다양한 옵션으로 클러스터를 만듭니다. 이러한 기능은 클러스터 생성 중에만 클러스터에서 구성할 수 있습니다. 다음 명령어는 Autopilot 모드 클러스터를 만듭니다. 대신 Standard 모드 클러스터를 만들려면 gcloud container clusters create 명령어와 함께 동일한 플래그를 사용합니다.

  • 디스크 암호화를 구성하고 자체 CA 및 서비스 계정 서명 키를 실행하는 클러스터를 만들려면 다음 단계를 따르세요.

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

      gcloud container clusters create-auto 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 서비스 계정 서명 키 버전 경로입니다.
      • 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-auto 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 내부 백업 암호화 키 경로입니다.

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

암호화 키 상태 확인

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

로깅을 사용하여 키 확인

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)"
    

다음 단계