메시지 암호화 구성

이 문서에서는 Pub/Sub용 고객 관리 암호화 키(CMEK)를 구성하는 방법을 설명합니다.

Pub/Sub는 기본적으로 Google 소유 및 Google 관리 키로 메시지를 암호화합니다. Google 관리 암호화 키를 사용할 때는 추가 설정이 필요하지 않습니다.

CMEK 정보

CMEK는 사용자가 소유하는 암호화 키이며 Cloud Key Management Service(Cloud KMS)에서 관리 및 저장됩니다. Pub/Sub 데이터 보호를 위해 사용되는 암호화 키를 더 세부적으로 제어해야 할 경우에는 CMEK를 사용할 수 있습니다. 일부 조직에서는 CMEK 사용도 의무화합니다.

CMEK를 사용하면 암호화 키를 완전히 제어할 수 있으므로 수명 주기, 순환, 액세스 정책을 관리할 수 있습니다. CMEK로 Pub/Sub를 구성하면 이 서비스가 지정된 키를 사용하여 모든 데이터를 자동으로 암호화합니다. CMEK에 Cloud KMS를 사용하는 경우 사용 패턴에 따라 추가 비용이 발생할 수 있습니다.

모든 메시지는 다음 상태 및 레이어에서 암호화됩니다.

애플리케이션 레이어에서 Pub/Sub는 메시지가 수신되는 즉시 받은 메시지를 개별적으로 암호화합니다. 이 구현에는 다음 기능이 추가되었습니다.

Pub/Sub용 CMEK

Pub/Sub는 CMEK와 함께 봉투 암호화 패턴을 사용합니다. 이 접근 방식에서 메시지는 Cloud KMS에 의해 암호화되지 않습니다. 대신 Cloud KMS는 각 주제에 대해 Pub/Sub가 만든 데이터 암호화 키(DEK)를 암호화하는 데 사용됩니다. 이러한 DEK는 Pub/Sub에 의해 암호화된 형태, 즉 래핑된 형태로만 저장됩니다. DEK를 저장하기 전에 서비스는 DEK를 Cloud KMS로 전송하여 해당 주제에 지정된 키 암호화 키(KEK)로 암호화합니다. 약 6시간마다 각 주제에 대해 새 DEK가 생성됩니다.

Pub/Sub는 메시지를 구독에 게시하기 전에 해당 주제에 대해 생성된 최신 DEK를 사용하여 메시지를 암호화합니다. Pub/Sub는 메시지가 구독자에게 전달되기 직전에 메시지를 복호화합니다.

시작하기 전에

Google Cloud 콘솔 또는 Google Cloud CLI를 사용하여 Pub/Sub용 CMEK를 구성할 수 있습니다.

다음 태스크를 완료합니다.

  • Cloud KMS API를 사용 설정합니다.

  • Cloud KMS에 키링과 키를 만듭니다. 키와 키링은 삭제할 수 없습니다.

이러한 태스크를 수행하는 방법은 Cloud KMS 빠른 시작 가이드를 참조하세요.

Pub/Sub 리소스는 전역이므로 전역 Cloud KMS 키를 사용하여 CMEK가 사용 설정된 주제를 구성하는 것이 좋습니다. 주제 게시자와 구독자의 위치에 따라 리전별 Cloud KMS 키를 사용하면 리전 간 네트워크 링크에 불필요한 종속 항목이 발생할 수 있습니다.

CMEK를 구성하는 데 필요한 역할 및 권한

Pub/Sub는 Google Cloud 서비스 에이전트를 사용하여 Cloud KMS에 액세스합니다. 서비스 에이전트는 각 프로젝트의 Pub/Sub에 의해 내부적으로 관리되며 기본적으로 Google Cloud 콘솔의 서비스 계정 페이지에는 표시되지 않습니다.

Pub/Sub 서비스 에이전트에는 service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com 양식이 있습니다.

Pub/Sub에는 CMEK를 사용하여 데이터를 암호화 및 복호화하기 위한 특정 권한이 필요합니다.

다음 단계에 따라 필요한 액세스를 설정합니다.

  • Pub/Sub 서비스 에이전트에 Cloud KMS CryptoKey 암호화/복호화(roles/cloudkms.cryptoKeyEncrypterDecrypter) 역할을 부여합니다.

    gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    다음을 바꿉니다.

    • CLOUD_KMS_KEY_NAME: Cloud KMS 키의 이름입니다.

      이 키는 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY 형식입니다.

      한 가지 예시는 projects/test-project/locations/us-central1/keyRings/test-keyring/cryptoKeys/test-key입니다.

    • PROJECT_NUMBER: Pub/Sub 프로젝트의 프로젝트 번호입니다.

IAM 역할 부여에 대한 자세한 내용은 리소스에 역할 부여를 참조하세요.

CMEK로 주제 구성

Google Cloud 콘솔 또는 gcloud CLI를 사용하여 주제의 CMEK를 구성할 수 있습니다.

콘솔

CMEK로 주제를 만들려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 Pub/Sub 주제 페이지로 이동합니다.

    주제로 이동

  2. 주제 만들기를 클릭합니다.

  3. 주제 ID 필드에 주제의 ID를 입력합니다.

    주제 이름 지정에 대한 자세한 내용은 이름 지정 가이드라인을 참조하세요.

  4. 암호화에서 Cloud KMS 키를 클릭합니다.

  5. 키 유형을 선택합니다. 고객 관리 키 선택 드롭다운이 표시되지 않으면 프로젝트에 대해 Cloud KMS API를 사용 설정했는지 확인합니다.

  6. 주제 만들기를 클릭합니다.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. CMEK로 주제를 만들려면 gcloud pubsub topics create 명령어를 실행합니다.

        gcloud pubsub topics create TOPIC_ID --topic-encryption-key=ENCRYPTION_KEY
        

    다음을 바꿉니다.

    • TOPIC_ID: 주제의 ID 또는 이름입니다.

      주제 이름을 지정하는 방법에 대한 자세한 내용은 주제, 구독, 스키마, 스냅샷 이름 지정 가이드라인을 참조하세요.

    • ENCRYPTION_KEY: 주제에 사용할 CMEK의 ID입니다.

      형식은 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY입니다.

주제의 CMEK 업데이트

Pub/Sub 주제에 연결된 CMEK를 자유롭게 변경할 수 있습니다. gcloud CLI를 사용하여 CMEK를 업데이트할 수 있습니다. 그러나 이 변경사항은 소급해서 적용되지 않습니다.

키 변경 전에 주제에 게시된 메시지는 원래 키로 암호화된 상태로 유지됩니다. CMEK 없이 주제를 만든 경우 나중에 CMEK를 추가할 수 있습니다. 기존 메시지는 기본 Google 관리 암호화로 계속 보호됩니다. 주제의 CMEK를 변경해도 이전에 게시된 메시지는 다시 암호화되지 않습니다. 이러한 메시지는 처음에 암호화된 키로 계속 보호됩니다.

Pub/Sub에는 약 5분 동안 지속되는 키 캐싱 메커니즘이 있습니다. Pub/Sub가 새 키 버전을 인식하고 사용하기까지 이 정도의 시간이 걸릴 수 있습니다.

감사 로그

Cloud KMS는 키가 사용, 사용 중지 설정되거나, Pub/Sub에서 메시지를 암호화하고 복호화할 때 감사 로그를 생성합니다. 이는 게시 또는 전송 가용성 문제를 디버깅하는 데 유용합니다.

Cloud KMS 키는 Pub/Sub 주제 리소스의 감사 로그에 첨부됩니다. Pub/Sub에는 다른 Cloud KMS 관련 정보가 포함되어 있지 않습니다.

가격 및 비용

다음 Pub/Sub 요청의 경우 CMEK 사용 시 Pub/Sub 가격을 기준으로 Cloud KMS 서비스에 대한 요금이 청구됩니다.

  • CMEK를 사용하는 각 주제에 대해 6시간마다 새로운 DEK가 암호화되고 저장됩니다.

  • 이 키는 6분마다 DEK를 복호화하는 데 사용됩니다. 복호화는 Pub/Sub 서비스가 실행되는 리전의 모든 영역에 대해 한 번씩 3번 수행됩니다.

예를 들어 다음과 같은 주제를 살펴보겠습니다.

  • 구독 1개 이상

  • 동일한 리전의 게시자 및 구독자 고객

Cloud KMS 암호화 연산 수는 다음과 같이 계산할 수 있습니다.

1 key access for ENCRYPT * (30 days / month * 24 hours / day) / 6 hours
 + 3 key accesses for DECRYPT
   * (30 days / month * 24 hours / day * 60 minutes / hour ) / 6 minutes
   = 21,720 Cloud KMS key access events
암호화 작업의 10,000개의 연산당 비용이 $0.03인 가격 책정 구조를 사용할 경우 위의 사용량은 약 $0.07입니다. 최신 가격 정보는 Cloud KMS 가격 책정을 참조하세요.

실제로는 액세스 패턴에 따라 키를 가져오는 빈도를 늘리거나 줄일 수 있습니다. 이 수치는 추정치로만 사용합니다.

모니터링 및 문제 해결

키 액세스 문제는 다음과 같은 영향을 미칠 수 있습니다.

  • 메시지 전송 지연

  • 게시 오류

response_classresponse_code 기준으로 그룹화된 다음 측정항목을 사용하여 게시 및 pull 요청 오류를 모니터링합니다.

  • topic/send_request_count
  • subscription/pull_request_count
  • subscription/streaming_pull_response_count

StreamingPull 응답의 오류율은 100%입니다. 이는 요청이 실패한 것이 아니라 스트림이 종료되었음을 나타냅니다. StreamingPull을 모니터링하려면 FAILED_PRECONDITION 응답 코드를 찾습니다.

메시지 게시 및 전송은 여러 가지 이유로 FAILED_PRECONDITION 오류가 발생하며 실패할 수 있습니다.

푸시 구독의 경우 CMEK별 전송 문제를 직접 감지할 수 없습니다. 대신 다음과 같은 방법을 사용할 수 있습니다.

  • subscription/num_unacked_messages을 사용하여 푸시 구독의 백로그 크기 및 기간을 모니터링합니다.

  • 비정상적인 급증의 경우 subscription/oldest_unacked_message_age를 모니터링합니다.

  • 게시 오류 및 CMEK 감사 로그를 사용하여 문제를 식별합니다.

키 사용 중지 및 다시 사용 설정

Pub/Sub가 메시지 데이터를 복호화하지 못하도록 하는 방법에는 두 가지가 있습니다.

  • 권장: Pub/Sub를 사용하여 주제와 관련된 Cloud KMS 키를 사용 중지합니다. 이 접근 방식은 특정 키와 관련된 Pub/Sub 주제 및 구독에만 영향을 미칩니다.

  • Pub/Sub 서비스 계정(service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com)에서 IAM을 사용하여 Pub/Sub CryptoKey 암호화/복호화 역할을 취소합니다. 이 접근 방식은 CMEK를 사용하여 암호화된 메시지를 포함하는 프로젝트의 모든 Pub/Sub 주제와 구독에 영향을 줍니다.

어느 작업도 즉시 액세스 취소를 보장하지는 않지만 일반적으로 IAM 변경사항은 더 빠르게 전파됩니다. 자세한 내용은 Cloud KMS 리소스 일관성액세스 변경 전파를 참조하세요.

Pub/Sub가 Cloud KMS 키에 액세스할 수 없는 경우 StreamingPull 또는 pull을 사용한 메시지 게시 및 전송이 FAILED_PRECONDITION 오류와 함께 실패합니다. 푸시 엔드포인트로의 메시지 전송이 중지됩니다. 전송 및 게시를 재개하려면 Cloud KMS 키에 대한 액세스를 복원합니다.

Cloud KMS 키가 Pub/Sub에 액세스할 수 있게 되면 12시간 이내에 게시를 사용할 수 있고 메시지 전송은 2시간 이내에 재개됩니다.

Cloud KMS이 1분 미만 정도로 간헐적으로 중단될 경우에는 게시 및 제공이 크게 중단되지 않을 수 있지만 Cloud KMS를 사용할 수 없는 시간이 늘어나면 키 취소와 동일한 영향을 줍니다.