고객 관리 암호화 키(CMEK) 사용

이 페이지에서는 Datastore 모드의 Firestore용 고객 관리 암호화 키(CMEK)와 관련된 태스크를 수행하는 방법을 설명합니다. CMEK를 사용 설정하는 시기와 이유를 포함한 일반적인 CMEK에 대한 자세한 내용은 Cloud KMS 문서를 참조하세요.

CMEK 키 준비

CMEK로 보호되는 Datastore 모드 데이터베이스를 만들려면 먼저 다음 단계를 완료해야 합니다.

  1. Datastore 모드 CMEK 기능에 대한 액세스를 요청합니다.
  2. Datastore 모드 서비스 에이전트를 만들거나 가져옵니다.
  3. CMEK 키를 만듭니다.
  4. 해당 키의 IAM 설정을 구성합니다.

CMEK로 보호되는 Firestore 데이터베이스를 포함할 프로젝트마다 다음 단계를 완료합니다. 나중에 새 CMEK 키를 만들면 해당 키에 대한 IAM 설정을 구성해야 합니다.

액세스 요청

Datastore 모드 서비스 에이전트를 만들기 전에 이 양식을 작성하여 CMEK 기능에 대한 액세스를 요청하세요.

Datastore 모드 서비스 에이전트 만들기

CMEK 키를 만들기 전에 Datastore 모드 서비스 에이전트가 있어야 하는데 이는 Datastore 모드가 키에 액세스하는 데 사용하는 Google 관리 서비스 계정의 유형입니다.

services identity create 명령어를 실행하여 Datastore 모드에서 사용자 대신 CMEK 키에 액세스하는 데 사용하는 서비스 에이전트를 만듭니다. 이 명령어는 서비스 계정이 아직 존재하지 않는 경우 해당 계정을 만든 후 표시합니다.

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

FIRESTORE_PROJECT를 Datastore 모드 데이터베이스에 사용할 프로젝트로 바꿉니다.

이 명령어는 이메일 주소와 같은 형식의 서비스 에이전트 ID를 표시합니다. 나중 단계에서 사용하기 때문에 출력 이메일 문자열을 기록합니다.

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

키 만들기

Cloud KMS에서 직접 생성된 키 또는 Cloud 외부 키 관리자에서 사용할 수 있는 외부 관리 키를 사용할 수 있습니다.

Cloud KMS 키 위치는 함께 사용할 Datastore 모드 데이터베이스의 위치와 동일해야 합니다.

  • 리전 데이터베이스 위치의 경우 위치 이름이 일대일로 매핑되므로 키링, 키, 데이터베이스에 동일한 위치 이름을 사용합니다.

    예를 들어 us-west1에 CMEK로 보호되는 데이터베이스를 만들려면 us-west1에 키링과 키를 만듭니다.

  • 멀티 리전 데이터베이스 위치의 경우에는 KMS 멀티 리전 위치의 위치 이름을 사용합니다.

    • Datastore 모드 nam5 멀티 리전 위치에 Cloud KMS us 멀티 리전 위치를 사용합니다.
    • Datastore 모드 eur3 멀티 리전 위치에 Cloud KMS europe 멀티 리전 위치를 사용합니다.

키를 관리할 Google Cloud 프로젝트에서 다음을 완료합니다.

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

  2. 다음 옵션 중 하나를 사용하여 키링과 키를 만듭니다.

키의 IAM 설정 구성

콘솔

서비스 에이전트에 Cloud KMS 역할을 부여하려면 다음을 수행합니다. 더 낮은 세분화를 원하는 경우 키 또는 키링 수준에서 권한을 부여할 수도 있습니다.

  1. Google Cloud Console에서 IAM 페이지로 이동합니다.

    IAM 페이지로 이동

  2. 추가를 클릭합니다.

  3. Datastore 모드 서비스 에이전트의 이메일 형식 ID를 입력합니다.

  4. Cloud KMS CryptoKey 암호화/복호화 역할을 선택합니다.

  5. 저장을 클릭합니다.

gcloud

서비스 에이전트에 cloudkms.cryptoKeyEncrypterDecrypter 역할을 부여합니다.

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

다음을 바꿉니다.

  • KMS_KEY: 키에 할당한 이름
  • KMS_KEYRING: 키가 포함된 KMS 키링
  • KMS_LOCATION :키링이 포함된 리전
  • SERVICE_AGENT_EMAIL: 액세스 권한을 부여하는 서비스 에이전트의 이메일 형식 식별자
  • KMS_PROJECT: 키가 포함된 프로젝트

터미널에 다음과 유사한 응답이 표시됩니다.

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

CMEK 지원 데이터베이스 만들기

CMEK 키를 만들고 구성한 후에는 CMEK로 보호되는 데이터베이스를 만들 수 있습니다. Google 기본 암호화로 보호되는 기존 Datastore 모드 데이터베이스는 CMEK를 사용하도록 변환할 수 없습니다.

CMEK 지원 데이터베이스를 만들 때만 암호화 유형과 키를 선택할 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 데이터베이스 페이지로 이동합니다.

    데이터베이스 페이지로 이동

  2. 데이터베이스 만들기를 클릭합니다.

  3. 데이터베이스 모드를 선택합니다. 계속을 클릭합니다.

  4. 데이터베이스 구성 페이지에서 데이터베이스 ID를 입력합니다.

  5. 지역을 선택합니다.

  6. 암호화 옵션 표시를 클릭한 다음 Cloud KMS 키를 선택합니다.

  7. 데이터베이스에 사용할 CMEK 키의 리소스 이름을 선택하거나 입력합니다.

  8. 키 목록은 현재 Google Cloud 프로젝트 및 선택한 데이터베이스 위치로 제한됩니다. 다른 Google Cloud 프로젝트의 키를 사용하려면 프로젝트 전환 또는 키 수동 입력을 클릭합니다.

  9. Datastore 모드 서비스 계정에 키 권한을 부여하라는 메시지가 표시되면 권한 부여를 클릭합니다. CMEK 데이터베이스를 만들려면 Datastore 모드 서비스 계정에 cloudkms.cryptoKeyEncrypterDecrypter 역할이 부여되어야 합니다.

  10. 모바일 및 웹 클라이언트의 보안 규칙을 선택합니다.

  11. 데이터베이스 만들기를 클릭합니다.

데이터베이스가 생성되면 데이터베이스 세부정보를 확인하여 해당 데이터베이스가 CMEK 사용 데이터베이스인지 확인할 수 있습니다.

  • 데이터베이스가 CMEK로 보호되는 경우 암호화 유형 필드가 고객 관리로 표시되고 암호화 키 필드에는 해당 Cloud KMS와 이 데이터베이스를 보호하는 데 사용되는 키 버전이 표시됩니다.
  • 데이터베이스가 CMEK로 보호되지 않으면 암호화 유형 필드가 Google 관리로 표시됩니다.

gcloud

Google Cloud CLI로 CMEK 지원 데이터베이스를 만들기 전에 최신 버전을 설치하고 gcloud CLI를 승인합니다. 자세한 내용은 gcloud CLI 설치를 참조하세요.

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

다음을 바꿉니다.

  • FIRESTORE_DATABASE_LOCATION: 데이터베이스의 Datastore 모드 위치
  • DATABASE_ID: 데이터베이스의 ID
  • KMS_KEY_NAME: 키에 할당한 이름 다음 형식으로 된 키의 전체 리소스 이름을 사용합니다.

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

  • FIRESTORE_PROJECT: Datastore 모드 데이터베이스에 사용할 프로젝트

REST API

HTTP 요청:

POST https://firestore.googleapis.com/v1/projects/{FIRESOTRE_PROJECT}/databases

요청 본문에서 cmek_config.kms_key_name 필드에 CMEK를 구성합니다.

Cloud KMS 키의 전체 리소스 ID로 설정합니다. 이 데이터베이스와 동일한 위치의 키만 허용되기 때문입니다.

이 값은 projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} 형식의 Cloud KMS 키 리소스 ID여야 합니다.

다른 필드에 대한 자세한 내용은 database create 페이지를 참조하세요.

요청 예시:

curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
  "type":"FIRESTORE_NATIVE",
  "locationId":"{FIRESTORE_DATABASE_LOCATION}",
  "cmekConfig": {
    "kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
  }
}'

Firebase CLI

CMEK 지원 데이터베이스를 만들려면 KMS 키 이름 필드를 사용하세요. --kms-key-name 파라미터를 지정하지 않으면 Datastore 모드에서 기본적으로 비CMEK 데이터베이스를 만듭니다.

firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT

다음을 바꿉니다.

  • DATABASE_ID: 데이터베이스 ID
  • LOCATION: 데이터베이스 위치
  • KMS_PROJECT: CMEK 키가 포함된 프로젝트
  • KMS_LOCATION: CMEK 키 및 키링이 포함된 위치
  • KMS_KEYRING_ID: CMEK 키링의 ID
  • FIRESTORE_PROJECT: Datastore 모드 데이터베이스에 사용할 프로젝트

Datastore 모드 데이터베이스가 Firebase CLI로 보호되는지 확인합니다.

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

응답 메시지에 다음 CMEK 정보가 표시됩니다.

  • KMS 키 이름 필드는 Datastore 모드 CMEK 데이터베이스를 암호화하는 데 사용되는 전체 키 리소스 이름을 제공합니다.
  • 활성 키 버전 필드는 이 CMEK 데이터베이스에서 현재 사용 중인 모든 키 버전의 목록을 제공합니다. 키 순환 중에 여러 활성 키 버전이 있을 수 있습니다.

Terraform

CMEK 사용 데이터베이스를 만들려면 google_firestore_database 리소스를 사용합니다. 자세한 내용 및 예는 google_firestore_database를 참조하세요.

resource "google_firestore_database" "database" {
  project     = "FIRESTORE_PROJECT"
  name        = "DATABASE_ID"
  location_id = "FIRESTORE_DATABASE_LOCATION"
  type        = "DATABASE_TYPE"

  cmek_config {
    kms_key_name = "KMS_KEY_NAME"
  }

}

다음을 바꿉니다.

  • FIRESTORE_PROJECT: Datastore 모드 데이터베이스에 사용할 프로젝트
  • DATABASE_ID: 데이터베이스의 ID
  • FIRESTORE_DATABASE_LOCATION: 데이터베이스의 Datastore 모드 위치
  • DATABASE_TYPE: 기본 모드의 경우 FIRESTORE_NATIVE, Datastore 모드의 경우 DATASTORE_MODE
  • KMS_KEY_NAME: 키에 할당한 이름 다음 형식으로 된 키의 전체 리소스 이름을 사용합니다.

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK로 보호되는 데이터베이스에 액세스

CMEK로 보호되는 데이터베이스에 전송되는 모든 읽기, 쓰기, 쿼리 작업은 Google 기본 암호화된 데이터베이스와 동일하게 작동해야 합니다. 예를 들어 각 요청에 대한 키를 제공할 필요가 없습니다.

CMEK 보호 데이터베이스 복원

백업에서 CMEK 보호 데이터베이스를 복원하기 전에 다음을 수행합니다.

  • 데이터베이스를 CMEK 암호화로 복원할지, Google의 기본 암호화(CMEK가 아님)로 복원할지, 백업과 동일한 암호화로 복원할지 결정합니다.
  • 백업을 암호화하는 데 사용한 키(primary-version)와 키 버전을 준비합니다. 키와 키 버전을 모두 사용 설정합니다.

gcloud

CMEK 보호 데이터베이스를 CMEK 암호화로 복원

CMEK 암호화로 복원하려면 선택사항인 encryption-typekms-key-name 플래그와 함께 gcloud firestore databases restore 명령어를 실행하여 복원된 데이터베이스의 암호화 유형을 구성합니다. 암호화 유형을 지정하지 않으면 복원된 데이터베이스는 백업과 동일한 암호화 구성을 사용합니다.

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

KMS_KEY_NAME을 키에 할당한 이름으로 바꿉니다. 다음 형식으로 된 키의 전체 리소스 이름을 사용합니다.

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK 보호 데이터베이스를 기본 암호화로 복원

Google의 기본 암호화(CMEK가 아님)로 복원하려면 다음과 같이 encryption-type 플래그를 설정합니다.

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

CMEK 보호 데이터베이스를 백업과 동일한 암호화 유형으로 복원

백업과 동일한 암호화 유형으로 복원하려면 다음과 같이 encryption-type 플래그를 설정하세요.

  gcloud firestore databases restore --encryption-type=use-source-encryption

Firebase CLI

CMEK 보호 데이터베이스를 CMEK 암호화로 복원

CMEK 암호화로 복원하려면 선택적 encryption-typekms-key-name 플래그를 사용합니다. 암호화 유형을 지정하지 않으면 복원된 데이터베이스는 백업과 동일한 암호화 구성을 사용합니다.

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT

다음을 바꿉니다.

  • DATABASE_ID: 데이터베이스 ID
  • FIRESTORE_PROJECT: Datastore 모드 데이터베이스에 사용할 프로젝트
  • FIRESTORE_LOCATION: Datastore 모드 데이터베이스의 위치
  • BACKUP_ID: 백업의 ID
  • KMS_PROJECT: CMEK 키가 포함된 프로젝트
  • KMS_LOCATION: CMEK 키 및 키링이 포함된 위치
  • KMS_KEYRING_ID: CMEK 키링의 ID

복원된 Datastore 모드 데이터베이스가 CMEK로 암호화되었는지 확인합니다.

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

CMEK 보호 데이터베이스를 기본 암호화로 복원

Google의 기본 암호화(CMEK가 아님)로 복원하려면 다음과 같이 encryption-type 플래그를 설정합니다.

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

다음을 바꿉니다.

  • DATABASE_ID: 데이터베이스 ID
  • FIRESTORE_PROJECT: Datastore 모드 데이터베이스에 사용할 프로젝트
  • FIRESTORE_LOCATION: Datastore 모드 데이터베이스의 위치
  • BACKUP_ID: 백업의 ID

CMEK 보호 데이터베이스를 백업과 동일한 암호화 유형으로 복원

백업과 동일한 암호화 유형으로 복원하려면 다음과 같이 encryption-type 플래그를 설정하세요.

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

다음을 바꿉니다.

  • DATABASE_ID: 데이터베이스 ID
  • FIRESTORE_PROJECT: Datastore 모드 데이터베이스에 사용할 프로젝트
  • FIRESTORE_LOCATION: Datastore 모드 데이터베이스의 위치
  • BACKUP_ID: 백업의 ID

사용 중인 키 보기

gcloud

databases describe gcloud CLI 명령어를 사용하여 데이터베이스 CMEK 구성을 확인할 수 있습니다.

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

다음과 비슷한 응답의 cmekConfig 필드에 CMEK 정보가 표시됩니다.

cmekConfig:
    activeKeyVersion:
    - projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  locationId: nam5
  name: projects/PROJECT_ID/databases/DATABASE_ID

응답에는 다음 정보가 포함됩니다.

  • kmsKeyName: CMEK로 보호되는 데이터베이스를 암호화하는 데 사용되는 키의 전체 키 리소스 이름.
  • activeKeyVersion: CMEK로 보호되는 데이터베이스에서 현재 사용 중인 모든 키 버전의 목록. 키 순환 중에 여러 활성 키 버전이 있을 수 있습니다. 키 순환 중에 이전 키 버전과 새 키 버전을 모두 사용할 수 있어야 합니다. 이전 키 버전이 더 이상 activeKeyVersion 필드에 표시되지 않을 때까지는 사용 중지하지 마세요.

REST API

HTTP 요청:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

요청 본문에서 cmek_config.kms_key_name 필드에 CMEK를 구성합니다. Cloud KMS 키의 전체 리소스 ID로 설정합니다. 이 데이터베이스와 동일한 위치의 키만 허용되기 때문입니다.

이 값은 projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} 형식의 Cloud KMS 키 리소스 ID여야 합니다.

다른 필드에 대한 자세한 내용은 database create 페이지를 참조하세요.

요청 및 응답 예시:

curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"

----------------------------------------- Response --------------------------------------------
{
  "name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
  "locationId": "{FIRESTORE_DATABASE_LOCATION}",
  "type": "FIRESTORE_NATIVE",
  "cmekConfig": {
    "kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
    "activeKeyVersion": [
      "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
    ]
  },
  ……
}

키 중지

데이터베이스와 연결된 키를 사용 중지하려면 다음을 완료하세요.

  1. 데이터베이스에 사용 중인 키 버전 보기
  2. 해당 키 버전 사용 중지
  3. 변경사항이 적용될 때까지 기다린 후 데이터에 더 이상 액세스할 수 없는지 확인합니다. 변경사항은 일반적으로 몇 분 내에 적용되지만 최대 3시간이 걸릴 수 있습니다.

데이터베이스에서 사용하는 키가 사용 중지되면 오류 메시지로 추가 세부정보와 함께 FAILED_PRECONDITION 예외가 수신됩니다. 예를 들면 다음과 같습니다.

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

키 사용 설정

데이터베이스와 연결된 키를 다시 사용 설정하려면 다음을 완료합니다.

  1. 데이터베이스에 사용 중인 키 버전 보기
  2. 해당 키 버전 사용 설정
  3. 변경사항이 적용될 때까지 기다린 후 데이터에 더 이상 액세스할 수 없는지 확인합니다. 변경사항은 일반적으로 몇 분 내에 적용되지만 최대 3시간이 걸릴 수 있습니다.

Cloud KMS 키의 감사 로그 보기

Cloud KMS 데이터 액세스 감사 로그를 사용 설정하기 전에 Cloud 감사 로그를 숙지해야 합니다.

Cloud KMS 데이터 액세스 감사 로그는 Datastore 모드 또는 CMEK 키를 사용하도록 구성된 다른 제품이 Cloud KMS에 암호화/복호화 호출을 하는 시점을 보여줍니다. Datastore 모드는 모든 데이터 요청에 암호화/복호화 호출을 실행하지 않으며, 대신에 정기적으로 키를 확인하는 폴러를 유지합니다. 폴링 결과는 감사 로그에 표시됩니다.

Google Cloud Console에서 감사 로그를 설정하고 상호작용할 수 있습니다.

  1. 프로젝트에서 Cloud KMS API에 대해 로깅이 사용 설정되었는지 확인합니다.

  2. Google Cloud Console에서 Cloud Logging으로 이동합니다.

    Cloud Logging으로 이동

  3. 쿼리 빌더에 다음 줄을 추가하여 로그 항목을 Cloud KMS로 제한합니다.

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    다음을 바꿉니다.

    • KMS_KEY: CMEK 키 이름
    • KMS_KEYRING: 키가 포함된 KMS 키링
    • KMS_LOCATION: 키 및 키링의 위치

    로그에는 데이터베이스당 약 5분마다 일부 로그 항목이 표시됩니다. 로그 항목은 다음 예시와 유사하게 표시됩니다.

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
    

감사 로그 해석에 대한 자세한 내용은 감사 로그 이해를 참조하세요.

CMEK 조직 정책 구성

조직에서 Datastore 모드 데이터베이스의 암호화 규정 준수 요구사항을 지정하려면 CMEK 조직 정책 제약조건을 사용하세요.

CMEK 보호 요구

Datastore 모드 데이터베이스 만들기에 CMEK를 요구하도록 constraints/gcp.restrictNonCmekServices를 구성합니다. 제약조건을 deny로 설정하고 거부 목록에 firestore.googleapis.com을 추가합니다. 예를 들면 다음과 같습니다.

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

FIRESTORE_PROJECT를 제한할 프로젝트로 바꿉니다.

조직 정책 구성에 대해 자세히 알아보려면 정책 만들기 및 수정을 참조하세요.

정책이 적용된 후 영향을 받는 프로젝트에 CMEK가 아닌 데이터베이스를 만들려고 하면 FAILED_PRECONDITION 예외 및 오류 메시지가 표시됩니다. 예를 들어 다음과 같은 예외가 수신됩니다.

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictNonCmekServices",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]

CMEK에 대한 키 사용 제한

CMEK 보호를 위해 사용되는 Cloud KMS 키를 제한하려면 constraints/gcp.restrictCmekCryptoKeyProjects 제약조건을 구성합니다.

목록 제약조건으로서 허용되는 값은 리소스 계층 구조 표시기입니다(예:projects/PROJECT_ID ,under:folders/FOLDER_ID, under:organizations/ORGANIZATION_ID). 리소스 계층 구조 표시기 목록을 구성하고 제약조건을 허용으로 설정하여 이 제약조건을 사용합니다. 이 구성은 나열된 프로젝트, 폴더, 조직에서만 CMEK 키를 선택할 수 있도록 지원되는 서비스를 제한합니다. 허용되는 리소스 중 하나에서 Datastore 모드 키를 사용하지 않으면 구성된 서비스에서 CMEK로 보호되는 리소스를 만들기 위한 요청이 실패합니다.

다음 예시에서는 지정된 프로젝트에서 CMEK로 보호되는 데이터베이스에 대해 ALLOWED_KEY_PROJECT_ID의 키만 허용합니다.

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

정책이 적용된 후 제약조건을 위반하면 FAILED_PRECONDITION 예외 및 오류 메시지가 표시됩니다. 다음과 같은 예외가 수신됩니다.

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictCmekCryptoKeyProjects",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]
      }
    ]
  }
}

다음 단계