CMEK 및 기본 설정 오류 문제 해결

이 문서에서는 일반적인 CMEK 구성 오류를 찾아 완화하는 방법과 기본 리소스 위치를 설정할 때 발생하는 오류를 식별하는 방법을 설명합니다.

기본 리소스 위치 설정 문제 해결

조직 또는 폴더의 기본 스토리지 위치를 업데이트하려 하지만 다음과 유사한 오류와 함께 명령어가 실패하는 경우입니다.

ERROR: (gcloud.logging.settings.update) INVALID_ARGUMENT: The KMS key location must match the storage location. Received KMS key location: us-central1, storage location: us-west1
- '@type': type.googleapis.com/google.rpc.DebugInfo
  detail: '[ORIGINAL ERROR] generic::invalid_argument: The KMS key location must match
    the storage location. Received KMS key location: us-central1, storage location:
    us-west1 [google.rpc.error_details_ext] { message: "The KMS key location must
    match the storage location. Received KMS key location: us-central1, storage location:
    us-west1" }'

이 오류를 해결하려면 조직 또는 폴더의 기본 스토리지 위치를 조직 또는 폴더의 Cloud Key Management Service 키 위치와 일치하도록 설정하세요.

VPC 서비스 제어 및 도메인 제한 공유 문제 해결

CMEK를 조직 또는 폴더의 기본 리소스 설정으로 구성했거나 CMEK가 사용 설정된 로그 버킷을 만들었습니다. 그런 다음 VPC 서비스 제어를 구성합니다. VPC 서비스 제어를 구성한 후에는 VPC 서비스 제어에서 Cloud Key Management Service에 대한 액세스를 제한하거나 도메인 제한 공유를 사용 설정합니다.

다음 중 하나 이상이 발생합니다.

  • Cloud Logging에서 CMEK 액세스 문제에 대한 알림이 수신되었습니다.

  • 조직 또는 폴더에서 새 Google Cloud 프로젝트를 만들 때 CMEK가 _Default_Required 로그 버킷에 사용 설정되지 않았습니다.

  • CMEK가 사용 설정된 로그 버킷에서 읽을 때 오류가 발생합니다. 표시되는 오류는 다음 오류와 비슷합니다.

    ERROR: (gcloud.logging.read) FAILED_PRECONDITION: service account `cmek-PROJECT_IDgcp-sa-logging.iam.gserviceaccount.com` must have both encrypt and decrypt access to the CMEK KMS key `projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY`
    
  • CMEK가 사용 설정된 로그 버킷을 만들거나 업데이트하면 오류가 발생합니다. 표시되는 오류는 다음 오류와 비슷합니다.

    ERROR: (gcloud.logging.buckets.create) service account `cmek-PROJECT_ID@gcp-sa-logging.iam.gserviceaccount.com` must have both encrypt and decrypt access to the CMEK KMS key `projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY`
    - '@type': type.googleapis.com/google.rpc.DebugInfo
      detail: '[ORIGINAL ERROR] generic::permission_denied: Request is prohibited by
      organization's policy. vpcServiceControlsUniqueIdentifier: <var>ERRORID</var>;'
    

이러한 문제가 VPC 서비스 제어 구성으로 인해 발생했는지 확인하려면 다음을 수행하세요.

  1. CMEK 구성이 포함된 리소스의 Cloud Logging 설정을 식별합니다. 리소스는 프로젝트, 폴더 또는 조직이 될 수 있습니다. CMEK가 사용 설정된 로그 버킷을 만든 경우 PROJECT 리소스를 선택합니다.

    프로젝트

    gcloud logging settings describe --project=PROJECT_ID
    

    명령어를 실행하기 전에 PROJECT_ID를 로그 버킷이 포함된 프로젝트 ID로 바꿉니다.

    폴더

    gcloud logging settings describe --folder=FOLDER_ID
    

    명령어를 실행하기 전에 FOLDER_ID를 폴더의 ID로 바꿉니다.

    조직

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

    명령어를 실행하기 전에 ORGANIZATION_ID를 조직의 ID로 바꿉니다.

    위 명령어는 다음과 비슷한 정보를 반환합니다.

    kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    

    조직 및 폴더의 경우 다음 필드도 반환됩니다.

    kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
    

    kmsKeyName 필드의 값에는 키를 저장하는 Google Cloud 프로젝트가 포함됩니다.

  2. 서비스 계정을 마이그레이션해야 하는지 확인합니다.

    • kmsServiceAccountId 필드의 값에 프리픽스 service-가 있으면 서비스 계정을 마이그레이션할 필요가 없습니다. CMEK 구성 오류에 대한 자세한 내용은 이 문서의 CMEK 문제 해결 섹션을 참조하세요.

    • kmsServiceAccountId 값에 프리픽스 cmek-가 있으면 다음 단계로 진행합니다.

  3. 도메인 제한 공유를 사용 중지하거나 VPC 서비스 제어 제한 서비스 목록에서 Cloud Key Management Service를 삭제하여 서비스 계정을 마이그레이션해야 합니다.

    오류가 해결된 경우 실패를 해결하려면 영향을 받는 리소스를 새 서비스 계정으로 마이그레이션해야 합니다. 이 단계에 대한 자세한 내용은 다음 섹션을 참조하세요.

CMEK 서비스 계정 마이그레이션

다음 프로세스에서는 Cloud Logging에서 구성된 Cloud Key Management Service 키에 액세스하는 데 사용하는 서비스 계정을 변경하는 방법을 설명합니다. 서비스 계정을 변경하면 VPC 서비스 제어 및 도메인 제한 공유와 관련된 알려진 문제가 해결됩니다.

  1. 리소스의 loggingServiceAccountId를 확인합니다. 리소스는 프로젝트, 폴더 또는 조직이 될 수 있습니다. CMEK가 사용 설정된 로그 버킷을 만든 경우 PROJECT 리소스를 선택합니다.

    프로젝트

    gcloud logging settings describe --project=PROJECT_ID
    

    명령어를 실행하기 전에 PROJECT_ID를 로그 버킷이 포함된 프로젝트 ID로 바꿉니다.

    폴더

    gcloud logging settings describe --folder=FOLDER_ID
    

    명령어를 실행하기 전에 FOLDER_ID를 폴더의 ID로 바꿉니다.

    조직

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

    명령어를 실행하기 전에 ORGANIZATION_ID를 조직의 ID로 바꿉니다.

    위 명령어는 다음과 비슷한 정보를 반환합니다.

    kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    

    조직 및 폴더의 경우 다음 필드도 반환됩니다.

    kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
    

    kmsKeyName 필드의 값에는 키를 저장하는 Google Cloud 프로젝트가 포함됩니다.

  2. 조직 또는 폴더에 기본 리소스 설정을 구성한 경우 다음을 수행합니다.

    1. KMS_PROJECT_ID에서 loggingServiceAccountId 필드로 식별된 서비스 계정에 Cloud Key Management Service CryptoKey 암호화/복호화 역할을 부여합니다.

    2. 다음 curl 명령어를 실행하여 리소스에서 사용하는 Cloud Key Management Service 서비스 계정을 변경합니다.

      프로젝트

      해당 없음

      폴더

      curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/folders/FOLDER_ID/settings?updateMask=kmsServiceAccountId
      

      명령어를 실행하기 전에 다음을 수행합니다.

      • FOLDER_ID를 폴더의 ID로 바꿉니다.
      • SERVICE_ACCT_NAME을 앞에서 식별된 loggingServiceAccountId로 바꿉니다.

      조직

      curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/settings?updateMask=kmsServiceAccountId
      

      명령어를 실행하기 전에 다음을 수행합니다.

      • ORGANIZATION_ID를 조직의 ID로 바꿉니다.
      • SERVICE_ACCT_NAME을 앞에서 식별된 loggingServiceAccountId로 바꿉니다.

      위 명령어의 결과는 다음과 비슷합니다.

      {
        "name": ".../settings",
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY",
        "kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com",
        "storageLocation": "...",
        "loggingServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"
      }
      
  3. CMEK로 사용 설정된 기존 로그 버킷이 포함된 각 Google Cloud 프로젝트 또는 폴더에 대해 다음을 수행합니다.

    1. 프로젝트 또는 폴더에서 CMEK로 사용 설정된 각 로그 버킷에 대해 다음을 수행합니다.

      1. Cloud Key Management Service 키를 저장하는 Google Cloud 프로젝트를 확인합니다.

        프로젝트

        gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
        

        명령어를 실행하기 전에 다음을 수행합니다.

        • PROJECT_ID를 로그 버킷이 포함된 프로젝트 ID로 바꿉니다.
        • LOCATION을 로그 버킷의 위치로 바꿉니다.

        폴더

        gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
        

        명령어를 실행하기 전에 다음을 수행합니다.

        • FOLDER_ID를 폴더의 ID로 바꿉니다.
        • LOCATION을 로그 버킷의 위치로 바꿉니다.

        위 명령어의 결과는 다음과 비슷합니다.

        cmekSettings:
          kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
          kmsKeyVersionName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/1
          serviceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
        createTime: '2022-10-31T12:00:00.0000000Z'
        lifecycleState: ACTIVE
        name: projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_ID
        retentionDays: 30
        createTime: '2022-10-31T13:00:00.0000000Z'
        
      2. Cloud Key Management Service 키 KMS_PROJECT_ID를 소유하는 Google Cloud 프로젝트로 이동하고 Cloud Key Management Service CryptoKey 암호화/복호화 역할을 loggingServiceAccountId 필드로 식별된 서비스 계정에 부여합니다.

    2. 프로젝트의 경우 다음 curl 명령어를 실행하여 Cloud Key Management Service 서비스 계정을 변경합니다.

      프로젝트

      curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/projects/PROJECT_ID/settings?updateMask=kmsServiceAccountId
      

      명령어를 실행하기 전에 다음을 수행합니다.

      • PROJECT_ID를 로그 버킷이 포함된 프로젝트 ID로 바꿉니다.
      • SERVICE_ACCT_NAME을 앞에서 식별된 loggingServiceAccountId로 바꿉니다.

      폴더

      이전 단계의 폴더에서 사용한 Cloud Key Management Service 서비스 계정을 변경했으므로 작업이 필요하지 않습니다.

      위 명령어의 결과는 다음과 비슷합니다.

      {
        "name": ".../settings",
        "kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com",
        "loggingServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"
      }
      
  4. CMEK가 사용 설정된 각 로그 버킷에 대해 다음을 수행합니다.

    1. Cloud KMS 키를 순환합니다.

    2. 마이그레이션을 확인합니다. 로그 버킷의 상위 리소스는 실행할 Google Cloud CLI 명령어를 결정합니다. 상위 요소는 프로젝트, 폴더 또는 조직일 수 있습니다.

      프로젝트

      gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
      

      명령어를 실행하기 전에 다음을 수행합니다.

      • PROJECT_ID를 로그 버킷이 포함된 프로젝트 ID로 바꿉니다.
      • LOCATION을 로그 버킷의 위치로 바꿉니다.

      폴더

      gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
      

      명령어를 실행하기 전에 다음을 수행합니다.

      • FOLDER_ID를 폴더의 ID로 바꿉니다.
      • LOCATION을 로그 버킷의 위치로 바꿉니다.

      프로젝트의 경우 위 명령어 결과는 다음과 비슷합니다.

      cmekSettings:
        kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
        kmsKeyVersionName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/1
        serviceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
      createTime: '2022-10-31T12:00:00.0000000Z'
      lifecycleState: ACTIVE
      name: projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_ID
      retentionDays: 30
      createTime: '2022-10-31T13:00:00.0000000Z'
      

      serviceAccountId가 앞에서 식별된 loggingServiceAccountId와 일치하는지 확인합니다.

  5. 이전 서비스 계정의 권한을 취소하기 전에 30분 이상 기다립니다. 이전 서비스 계정의 권한을 취소한 후 문제가 발생하면 권한을 복원하고 Cloud 지원팀에 문의하세요.

CMEK 문제 해결

CMEK를 구성하면 Cloud KMS 키가 포함된 Google Cloud 프로젝트에 관련 문제에 대한 알림이 전송됩니다. 예를 들어 KMS_KEY_NAME이 잘못되었거나, 연결된 서비스 계정에 필요한 Cloud Key Management Service CryptoKey 암호화/복호화 역할이 없거나, 키 액세스가 사용 중지된 경우 업데이트가 실패합니다.

CMEK를 구성한 후에는 다음 중 하나 이상이 발생합니다.

  • Cloud Logging에서 CMEK 액세스 문제에 대한 알림이 수신되었습니다.

  • 조직 또는 폴더에서 새 Google Cloud 프로젝트를 만들 때 CMEK가 _Default_Required 로그 버킷에 사용 설정되지 않았습니다.

  • CMEK가 사용 설정된 로그 버킷에서 읽거나 로그 버킷을 만들거나 업데이트하려고 하면 오류가 발생합니다.

알림에는 실패에 대한 정보와 문제 해결에 사용할 수 있는 정보가 포함됩니다.

오류 권장사항
암호화 키 권한이 거부되었습니다.

Google Cloud 프로젝트와 연관된 로깅 서비스 계정에 지정된 Cloud KMS 키로 작업을 수행하기 위한 IAM 권한이 부족합니다. 오류의 안내를 따르거나 다음 문서를 참조하세요.

암호화 키가 사용 중지되었습니다. 지정된 Cloud KMS 키가 사용 중지되었습니다. 오류의 안내에 따라 키를 다시 사용 설정합니다.
암호화 키가 폐기되었습니다.

지정된 Cloud KMS 키가 폐기되었습니다. 안내를 따르거나 다음 문서를 참조하세요.

Cloud KMS 키가 포함된 프로젝트 식별

로그 버킷, 폴더 또는 조직에서 사용하는 암호화 키가 포함된 Google Cloud 프로젝트의 ID를 식별하려면 다음을 수행합니다.

프로젝트

gcloud logging settings describe --project=PROJECT_ID

명령어를 실행하기 전에 PROJECT_ID를 로그 버킷이 포함된 프로젝트 ID로 바꿉니다.

폴더

gcloud logging settings describe --folder=FOLDER_ID

명령어를 실행하기 전에 FOLDER_ID를 폴더의 ID로 바꿉니다.

조직

gcloud logging settings describe --organization=ORGANIZATION_ID

명령어를 실행하기 전에 ORGANIZATION_ID를 조직의 ID로 바꿉니다.

위 명령어는 다음과 비슷한 정보를 반환합니다.

kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com

조직 및 폴더의 경우 다음 필드도 반환됩니다.

kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY

kmsKeyName 필드의 값에는 키를 저장하는 Google Cloud 프로젝트가 포함됩니다.

키 사용성 확인

키의 사용성을 확인하려면 다음 명령어를 실행하여 모든 키를 나열합니다.

gcloud kms keys list \
--location=KMS_KEY_LOCATION \
--keyring=KMS_KEY_RING

이 명령어는 각 키에 대한 정보를 표 형식으로 반환합니다. 출력의 첫 번째 줄은 열 이름 목록입니다.

NAME PURPOSE ...

명령어 결과에 Cloud KMS CryptoKey가 ENABLED으로 표시되고 키의 용도가 대칭적 암호화인지 확인합니다. PURPOSE 열에는 ENCRYPT_DECRYPT가 포함되고 PRIMARY_STATE 열에는 ENABLED가 포함되어 있어야 합니다.

필요하면 새 키를 만듭니다.

권한 구성 확인

조직의 CMEK 설정과 연결된 서비스 계정에는 반드시 구성된 키에 대한 Cloud KMS CryptoKey 암호화/복호화 역할이 있어야 합니다.

키의 Cloud IAM 정책을 나열하려면 다음 명령어를 실행합니다.

gcloud kms keys get-iam-policy KMS_KEY_NAME

필요하면 Cloud KMS CryptoKey 암호화/복호화 역할이 포함된 서비스 계정을 키에 추가합니다.