메시지 암호화 구성

Pub/Sub는 기본적으로 Google 관리 암호화 키로 메시지를 암호화합니다. 필요한 설정이나 구성이 없으며 서비스에 액세스하는 방식을 수정할 필요도 없습니다. 모든 메시지는 다음 상태 및 레이어에서 암호화됩니다.

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

고객 관리 암호화 키 사용

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는 구독자에게 전달되기 직전에 메시지를 복호화합니다.

Pub/Sub는 Google Cloud 서비스 계정을 사용하여 Cloud KMS에 액세스합니다. 서비스 계정은 각 프로젝트의 Pub/Sub에 의해 내부적으로 관리되며 서비스 계정 목록에는 표시되지 않습니다. 서비스 계정 양식에는 service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com이 있습니다. CMEK 기능이 작동하려면 Identity and Access Management의 Cloud KMS CryptoKey 암호화/복호화 역할을 이 계정에 부여해야 합니다.

주제 구성

CMEK는 Google Cloud Console 또는 gcloud 명령줄 도구를 사용하여 구성할 수 있습니다. 기본 요건의 경우 다음이 필요합니다.

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

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

Google Cloud Console 사용

Google Cloud Console 주제 만들기 대화상자를 사용하여 암호화 키를 추가할 수 있습니다. 대화상자에 액세스하는 방법은 Google Cloud Console 빠른 시작을 참조하세요.

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

Google Cloud Console:

  • Pub/Sub 서비스 계정에 적절한 권한이 있는지 확인하면서 IAM 구성을 간소화합니다.

  • 주제 생성 대화상자 내에서 암호화를 구성할 수 있습니다.

명령줄 사용

이 예시에서는 Google Cloud CLI를 사용하여 주제에 CMEK를 구성하는 방법을 보여줍니다.


   # Grant the Pub/Sub service account the Cloud KMS CryptoKey
   # Encrypter/Decrypter role. This service account is different
   # from the service account you are using to authorize requests to Google Cloud.

   gcloud projects add-iam-policy-binding ${PROJECT_ID} --member=\
      "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" \
      --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

   # Create a topic that uses customer-managed encryption, using the
   # --topic-encryption-key argument to specify the Cloud KMS key to use
   # for protecting message data.

   KEY_ID=projects/${PROJECT_ID}/locations/global/keyRings/my-key-ring/cryptoKeys/my-crypto-key
   alias pubsub="gcloud pubsub"
   pubsub topics create $TOPIC_NAME --topic-encryption-key=$KEY_ID

   # Confirm that the topic is configured for customer-managed encryption,
   # indicated by the presence of the kmsKeyName specified on the topic.

   pubsub topics describe $TOPIC_NAME
     

감사 로그

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를 사용할 수 없는 시간이 늘어나면 키 취소와 동일한 영향을 줍니다.