Sử dụng khoá mã hoá do khách hàng quản lý (CMEK)

Trang này mô tả cách thực hiện các tác vụ liên quan đến khoá mã hoá do khách hàng quản lý (CMEK) cho Cloud Firestore. Để biết thêm thông tin về CMEK nói chung, bao gồm cả thời điểm và lý do nên bật CMEK, hãy xem tài liệu về Cloud KMS.

Chuẩn bị khoá CMEK

Để có thể tạo cơ sở dữ liệu Cloud Firestore được bảo vệ bằng CMEK, bạn phải hoàn tất các bước sau:

  1. Yêu cầu cấp quyền truy cập vào tính năng Cloud Firestore CMEK.
  2. Tạo (hoặc truy xuất) một Cloud Firestore tác nhân dịch vụ.
  3. Tạo khoá CMEK.
  4. Định cấu hình chế độ cài đặt IAM cho khoá đó.

Hoàn tất các bước này cho từng dự án sẽ chứa cơ sở dữ liệu Cloud Firestore được bảo vệ bằng CMEK. Nếu sau này tạo khoá CMEK mới, bạn phải định cấu hình chế độ cài đặt IAM cho khoá đó.

Yêu cầu quyền truy cập

Trước khi tạo một tác nhân dịch vụ Cloud Firestore, hãy yêu cầu cấp quyền truy cập vào tính năng CMEK bằng cách điền vào biểu mẫu này.

Tạo một nhân viên hỗ trợ dịch vụ Cloud Firestore

Trước khi tạo khóa CMEK, bạn phải có tác nhân dịch vụ Cloud Firestore, đây là loại tài khoản dịch vụ do Google quản lý mà Cloud Firestore sử dụng để truy cập khóa.

Chạy lệnh services identity create để tạo tác nhân dịch vụ mà Cloud Firestore dùng để truy cập vào khoá CMEK thay cho bạn. Lệnh này sẽ tạo tài khoản dịch vụ nếu tài khoản đó chưa tồn tại, sau đó hiển thị tài khoản đó.

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

Thay thế FIRESTORE_PROJECT bằng dự án mà bạn dự định dùng cho cơ sở dữ liệu Cloud Firestore.

Lệnh này sẽ hiển thị mã nhận dạng của tác nhân dịch vụ, được định dạng giống như địa chỉ email. Ghi lại chuỗi email đầu ra vì bạn sẽ sử dụng nó ở bước sau.

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

Tạo khoá

Bạn có thể sử dụng khóa được tạo trực tiếp trong Cloud KMS hoặc khóa được quản lý bên ngoài mà bạn cung cấp bằng Trình quản lý khóa bên ngoài của Cloud.

Vị trí khóa của Cloud KMS phải giống với vị trí của cơ sở dữ liệu Cloud Firestore mà nó sẽ được sử dụng.

  • Đối với vị trí cơ sở dữ liệu khu vực, hãy sử dụng cùng một tên vị trí cho vòng khóa, khóa và cơ sở dữ liệu vì tên vị trí có ánh xạ một-một.

    Ví dụ: nếu bạn muốn tạo một cơ sở dữ liệu được bảo vệ bằng CMEK trong us-west1, hãy tạo một khoá và khoá vòng trong us-west1.

  • Đối với vị trí cơ sở dữ liệu đa vùng, hãy sử dụng tên vị trí của vị trí đa vùng KMS:

    • Sử dụng vị trí us nhiều khu vực của Cloud KMS cho vị trí Cloud Firestore nam5 nhiều khu vực.
    • Sử dụng vị trí europe nhiều khu vực của Cloud KMS cho vị trí Cloud Firestore eur3 nhiều khu vực.

Trong dự án Google Cloud mà bạn muốn quản lý khoá, hãy hoàn tất các bước sau:

  1. Bật API Cloud KMS.

  2. Tạo móc chìa khóa và chìa khóa bằng một trong các tùy chọn sau:

Cấu hình cài đặt IAM cho khóa

Bảng điều khiển

Để cấp vai trò Cloud KMS cho đại lý dịch vụ của bạn, hãy thực hiện như sau. Bạn cũng có thể cấp quyền ở cấp khoá hoặc khoá-chuỗi nếu muốn có độ chi tiết thấp hơn.

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang IAM.

    Chuyển đến trang IAM

  2. Nhấp vào Thêm.

  3. Nhập mã nhận dạng có định dạng email cho Cloud Firestorenhân viên dịch vụ của bạn.

  4. Chọn vai trò Người mã hóa/giải mã Cloud KMS CryptoKey.

  5. Nhấp vào Lưu.

gcloud

Cấp vai trò cloudkms.cryptoKeyEncrypterDecrypter cho nhân viên hỗ trợ của bạn:

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

Thay thế nội dung sau:

  • KMS_KEY có tên mà bạn đã chỉ định cho khoá
  • KMS_KEYRING với móc chìa khóa KMS có chứa chìa khóa
  • KMS_LOCATION có khu vực chứa bộ khoá
  • SERVICE_AGENT_EMAIL với mã định danh được định dạng email cho tác nhân dịch vụ mà bạn đang cấp quyền truy cập
  • KMS_PROJECT có dự án chứa khoá

Thiết bị đầu cuối sẽ hiển thị phản hồi tương tự như sau:

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

Tạo cơ sở dữ liệu hỗ trợ CMEK

Sau khi khóa CMEK của bạn được tạo và cấu hình, bạn có thể tạo cơ sở dữ liệu được bảo vệ bằng CMEK. Bạn không thể chuyển đổi các cơ sở dữ liệu Cloud Firestore hiện có được bảo vệ bằng chế độ mã hoá mặc định của Google để sử dụng CMEK.

Bạn chỉ có thể chọn loại mã hóa và khóa khi tạo cơ sở dữ liệu hỗ trợ CMEK.

Bảng điều khiển

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Cơ sở dữ liệu.

    Truy cập trang Cơ sở dữ liệu

  2. Nhấp vào Tạo cơ sở dữ liệu.

  3. Chọn chế độ cơ sở dữ liệu. Nhấp vào Tiếp tục.

  4. Trên trang Cấu hình cơ sở dữ liệu, hãy nhập ID cơ sở dữ liệu.

  5. Chọn một vị trí.

  6. Nhấp vào Hiện các lựa chọn mã hoá, rồi chọn Khoá Cloud KMS.

  7. Chọn hoặc nhập tên tài nguyên cho khoá CMEK mà bạn muốn dùng cho cơ sở dữ liệu.

  8. Danh sách khoá chỉ bao gồm dự án Google Cloud hiện tại và vị trí cơ sở dữ liệu mà bạn đã chọn. Để sử dụng khoá của một dự án Google Cloud khác, hãy nhấp vào Chuyển dự án hoặc Nhập khoá theo cách thủ công.

  9. Nếu bạn được nhắc cấp quyền khoá cho tài khoản dịch vụ Cloud Firestore, hãy nhấp vào Cấp. Để tạo cơ sở dữ liệu CMEK, tài khoản dịch vụ Cloud Firestore của bạn phải được cấp vai trò cloudkms.cryptoKeyEncrypterDecrypter.

  10. Chọn quy tắc bảo mật cho máy khách di động và web.

  11. Nhấp vào Tạo cơ sở dữ liệu.

Sau khi cơ sở dữ liệu được tạo, bạn có thể xác minh rằng cơ sở dữ liệu được hỗ trợ CMEK bằng cách xem Chi tiết cơ sở dữ liệu:

  • Nếu cơ sở dữ liệu của bạn được bảo vệ bởi CMEK, trường Loại mã hóa sẽ hiển thị là Do khách hàng quản lý và trường Khóa mã hóa sẽ liệt kê Cloud KMS tương ứng và phiên bản khóa được sử dụng để bảo vệ cơ sở dữ liệu này.
  • Nếu cơ sở dữ liệu của bạn không được bảo vệ bằng CMEK, thì trường Loại mã hoá sẽ hiển thị là Do Google quản lý.

gcloud

Trước khi tạo cơ sở dữ liệu có hỗ trợ CMEK bằng Google Cloud CLI, hãy cài đặt phiên bản mới nhất và uỷ quyền cho gcloud CLI. Để biết thêm thông tin, hãy xem Cài đặt gcloud CLI.

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

Thay thế nội dung sau:

  • FIRESTORE_DATABASE_LOCATION có vị trí Cloud Firestore cho cơ sở dữ liệu
  • DATABASE_ID có mã nhận dạng cho cơ sở dữ liệu
  • KMS_KEY_NAME bằng tên bạn đã gán cho khóa. Sử dụng tên tài nguyên đầy đủ cho khoá theo định dạng sau:

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

  • FIRESTORE_PROJECT với dự án sẽ dùng cho cơ sở dữ liệu Cloud Firestore của bạn

API REST

Yêu cầu HTTP:

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

Trong nội dung yêu cầu, hãy định cấu hình CMEK trong trường cmek_config.kms_key_name.

Đặt thành mã nhận dạng tài nguyên đầy đủ của một khoá Cloud KMS. Chỉ được phép dùng khoá ở cùng vị trí với cơ sở dữ liệu này.

Giá trị này phải là mã tài nguyên khoá Cloud KMS ở định dạng projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Để biết thêm thông tin về các trường khác, hãy xem database create.

Ví dụ yêu cầu:

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"
  }
}'

Giao diện dòng lệnh (CLI) của Firebase

Để tạo một cơ sở dữ liệu có hỗ trợ CMEK, hãy sử dụng trường Tên khoá KMS. Nếu bạn không chỉ định tham số --kms-key-name, Cloud Firestore sẽ tạo cơ sở dữ liệu không phải CMEK theo mặc định.

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

Thay thế nội dung sau:

  • DATABASE_ID bằng mã nhận dạng cơ sở dữ liệu của bạn
  • LOCATION có vị trí của cơ sở dữ liệu
  • KMS_PROJECT với dự án chứa khoá CMEK của bạn
  • KMS_LOCATION có vị trí chứa khoá CMEK và bộ khoá của bạn
  • KMS_KEYRING_ID bằng mã nhận dạng của khoá CMEK
  • FIRESTORE_PROJECT với dự án sẽ dùng cho cơ sở dữ liệu Cloud Firestore của bạn

Xác nhận rằng cơ sở dữ liệu Cloud Firestore của bạn được bảo vệ bằng Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Thông tin sau đây về CMEK sẽ xuất hiện trong thông báo phản hồi:

  • Trường Tên khoá KMS cung cấp tên tài nguyên khoá đầy đủ được dùng để mã hoá cơ sở dữ liệu CMEK Cloud Firestore của bạn.
  • Trường Phiên bản khóa đang hoạt động cung cấp danh sách tất cả phiên bản khóa hiện đang được cơ sở dữ liệu CMEK này sử dụng. Trong quá trình xoay khoá, bạn có thể có nhiều phiên bản khoá đang hoạt động.

Terraform

Để tạo cơ sở dữ liệu hỗ trợ CMEK, hãy sử dụng tài nguyên google_firestore_database. Để biết thêm thông tin và ví dụ, hãy xem 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"
  }
}

Thay thế nội dung sau:

  • FIRESTORE_PROJECT với dự án để sử dụng cho cơ sở dữ liệu Cloud Firestore của bạn
  • DATABASE_ID có ID cho cơ sở dữ liệu
  • FIRESTORE_DATABASE_LOCATION có vị trí Cloud Firestore cho cơ sở dữ liệu
  • DATABASE_TYPE với FIRESTORE_NATIVE cho chế độ Gốc hoặc DATASTORE_MODE cho chế độ Kho dữ liệu.
  • KMS_KEY_NAME bằng tên bạn đã chỉ định cho khoá. Sử dụng tên tài nguyên đầy đủ cho khoá theo định dạng:

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

Truy cập cơ sở dữ liệu được bảo vệ bởi CMEK

Tất cả các thao tác đọc, ghi và truy vấn được gửi đến một cơ sở dữ liệu được bảo vệ bằng CMEK đều phải hoạt động giống như với một cơ sở dữ liệu được mã hoá mặc định của Google. Ví dụ: bạn không cần cung cấp khoá cho từng yêu cầu.

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK

Trước khi khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK từ bản sao lưu:

  • Quyết định xem bạn có muốn khôi phục cơ sở dữ liệu về chế độ mã hoá CMEK, về chế độ mã hoá mặc định của Google (không phải CMEK) hay về chế độ mã hoá giống như bản sao lưu hay không.
  • Chuẩn bị khóa (phiên bản chính) và phiên bản khóa mà bạn đã sử dụng để mã hóa bản sao lưu. Bật cả khoá và phiên bản khoá.

gcloud

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK về mã hóa CMEK

Để khôi phục mã hóa CMEK, hãy chạy lệnh gcloud firestore databases restore với cờ encryption-typekms-key-name tùy chọn để cấu hình loại mã hóa cho cơ sở dữ liệu được khôi phục. Nếu bạn không chỉ định loại mã hoá, thì cơ sở dữ liệu được khôi phục sẽ sử dụng cùng một cấu hình mã hoá như bản sao lưu.

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

Thay thế KMS_KEY_NAME bằng tên mà bạn đã chỉ định cho khoá. Sử dụng tên tài nguyên đầy đủ cho khoá theo định dạng sau:

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

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK về chế độ mã hoá mặc định

Để khôi phục về chế độ mã hoá mặc định của Google (không phải CMEK), hãy đặt cờ encryption-type theo cách sau:

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

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK về cùng loại mã hoá như bản sao lưu

Để khôi phục về cùng loại mã hoá như bản sao lưu, hãy đặt cờ encryption-type theo cách sau:

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

Giao diện dòng lệnh (CLI) của Firebase

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK về trạng thái mã hoá CMEK

Để khôi phục chế độ mã hoá CMEK, hãy sử dụng cờ encryption-typekms-key-name (không bắt buộc). Nếu bạn không chỉ định loại mã hoá, thì cơ sở dữ liệu được khôi phục sẽ sử dụng cùng một cấu hình mã hoá như bản sao lưu.

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

Thay thế nội dung sau:

  • DATABASE_ID bằng mã nhận dạng cơ sở dữ liệu của bạn
  • FIRESTORE_PROJECT với dự án sẽ dùng cho cơ sở dữ liệu Cloud Firestore của bạn
  • FIRESTORE_LOCATION có vị trí của cơ sở dữ liệu Cloud Firestore
  • BACKUP_ID bằng mã nhận dạng của bản sao lưu
  • KMS_PROJECT với dự án chứa khoá CMEK của bạn
  • KMS_LOCATION có vị trí chứa khoá CMEK và bộ khoá của bạn
  • KMS_KEYRING_ID bằng mã nhận dạng của khoá CMEK

Xác nhận rằng cơ sở dữ liệu Cloud Firestore đã khôi phục của bạn được mã hoá bằng CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK về chế độ mã hoá mặc định

Để khôi phục về chế độ mã hoá mặc định của Google (không phải CMEK), hãy đặt cờ encryption-type theo cách sau:

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

Thay thế nội dung sau:

  • DATABASE_ID bằng mã nhận dạng cơ sở dữ liệu của bạn
  • FIRESTORE_PROJECT với dự án sẽ dùng cho cơ sở dữ liệu Cloud Firestore của bạn
  • FIRESTORE_LOCATION có vị trí của cơ sở dữ liệu Cloud Firestore
  • BACKUP_ID bằng mã nhận dạng của bản sao lưu

Khôi phục cơ sở dữ liệu được bảo vệ bằng CMEK về cùng loại mã hoá như bản sao lưu

Để khôi phục về cùng loại mã hoá như bản sao lưu, hãy đặt cờ encryption-type theo cách sau:

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

Thay thế nội dung sau:

  • DATABASE_ID bằng mã nhận dạng cơ sở dữ liệu của bạn
  • FIRESTORE_PROJECT với dự án sẽ dùng cho cơ sở dữ liệu Cloud Firestore của bạn
  • FIRESTORE_LOCATION có vị trí của cơ sở dữ liệu Cloud Firestore
  • BACKUP_ID bằng mã nhận dạng của bản sao lưu

Sao chép cơ sở dữ liệu được bảo vệ bởi CMEK

Trước khi bạn sao chép một cơ sở dữ liệu được bảo vệ bằng CMEK:

  • Quyết định xem bạn có muốn sao chép cơ sở dữ liệu sang chế độ mã hoá CMEK, sang chế độ mã hoá mặc định của Google (không phải CMEK) hay sang cùng chế độ mã hoá với cơ sở dữ liệu nguồn hay không.
  • Chuẩn bị khoá (phiên bản chính) và phiên bản khoá mà bạn đã dùng để mã hoá cơ sở dữ liệu nguồn. Bật cả khoá và phiên bản khoá.

gcloud

Sao chép cơ sở dữ liệu được bảo vệ bằng CMEK sang chế độ mã hoá CMEK

Để sao chép sang chế độ mã hoá CMEK, hãy chạy lệnh gcloud firestore databases clone bằng các cờ encryption-typekms-key-name không bắt buộc để định cấu hình loại mã hoá cho cơ sở dữ liệu được sao chép. Nếu bạn không chỉ định loại mã hoá, cơ sở dữ liệu được sao chép sẽ sử dụng cùng một cấu hình mã hoá với cơ sở dữ liệu nguồn.

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

Thay thế KMS_KEY_NAME bằng tên bạn đã gán cho khóa. Sử dụng tên tài nguyên đầy đủ cho khoá theo định dạng sau:

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

Sao chép cơ sở dữ liệu được bảo vệ bằng CMEK sang chế độ mã hoá mặc định

Để sao chép vào phương thức mã hoá mặc định của Google (không phải CMEK), hãy đặt cờ encryption-type theo cách sau:

gcloud firestore databases clone \
--encryption-type=google-default-encryption

Sao chép một cơ sở dữ liệu được bảo vệ bằng CMEK sang cùng loại mã hoá với cơ sở dữ liệu nguồn

Để sao chép sang cùng một loại mã hoá như cơ sở dữ liệu nguồn, hãy đặt cờ encryption-type theo cách sau:

gcloud firestore databases clone \
--encryption-type=use-source-encryption

Đây cũng là hành vi mặc định nếu bạn không chỉ định --encryption-type.

Giao diện dòng lệnh (CLI) của Firebase

Sao chép cơ sở dữ liệu được bảo vệ bằng CMEK sang chế độ mã hoá CMEK

Để sao chép sang chế độ mã hoá CMEK, hãy chạy lệnh firebase firestore:databases:clone bằng các cờ encryption-typekms-key-name không bắt buộc để định cấu hình loại mã hoá cho cơ sở dữ liệu được sao chép. Nếu bạn không chỉ định loại mã hoá, cơ sở dữ liệu được sao chép sẽ sử dụng cùng một cấu hình mã hoá như cơ sở dữ liệu nguồn.

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name=KMS_KEY_NAME

Thay thế KMS_KEY_NAME bằng tên mà bạn đã chỉ định cho khoá. Sử dụng tên tài nguyên đầy đủ cho khoá theo định dạng sau:

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

Sao chép cơ sở dữ liệu được bảo vệ bằng CMEK sang mã hóa mặc định

Để sao chép vào phương thức mã hoá mặc định của Google (không phải CMEK), hãy đặt cờ encryption-type theo cách sau:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION

Sao chép một cơ sở dữ liệu được bảo vệ bằng CMEK sang cùng loại mã hoá với cơ sở dữ liệu nguồn

Để sao chép sang cùng một loại mã hoá như cơ sở dữ liệu nguồn, hãy đặt cờ encryption-type theo cách sau:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION

Đây cũng là hành vi mặc định nếu bạn không chỉ định --encryption-type.

Xem khoá đang được dùng

gcloud

Bạn có thể dùng lệnh databases describe gcloud CLI để xác nhận cấu hình CMEK của cơ sở dữ liệu:

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

Bạn sẽ thấy thông tin về CMEK trong trường cmekConfig trong phản hồi, tương tự như sau:

      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

Phản hồi bao gồm những thông tin sau:

  • kmsKeyName: tên tài nguyên đầy đủ của khoá dùng để mã hoá cơ sở dữ liệu được bảo vệ bằng CMEK.
  • activeKeyVersion: danh sách tất cả các phiên bản khoá hiện đang được cơ sở dữ liệu được bảo vệ bằng CMEK sử dụng. Trong quá trình xoay khoá, bạn có thể có nhiều phiên bản khoá đang hoạt động. Cả phiên bản khoá cũ và phiên bản khoá mới đều cần có trong quá trình thay khoá. Không tắt phiên bản khóa cũ cho đến khi nó không còn xuất hiện trong trường activeKeyVersion nữa.

API REST

Yêu cầu HTTP:

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

Trong nội dung yêu cầu, hãy định cấu hình CMEK trong trường cmek_config.kms_key_name. Đặt thành mã nhận dạng tài nguyên đầy đủ của một khoá Cloud KMS. Chỉ được phép dùng khoá ở cùng vị trí với cơ sở dữ liệu này.

Giá trị này phải là mã tài nguyên khoá Cloud KMS ở định dạng projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Để biết thêm thông tin về các trường khác, hãy xem trang database create.

Ví dụ về yêu cầu và phản hồi:

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"
    ]
  },
  ……
}

Tắt một khoá

Để tắt một khoá được liên kết với cơ sở dữ liệu, hãy hoàn tất các bước sau:

  1. Xem các phiên bản khoá đang được sử dụng cho một cơ sở dữ liệu.
  2. Vô hiệu hóa các phiên bản khóa đang sử dụng.
  3. Chờ thay đổi có hiệu lực và kiểm tra xem bạn có còn truy cập được vào dữ liệu hay không. Những thay đổi thường có hiệu lực trong vòng vài phút, nhưng có thể mất tới 3 giờ.

Khi một khóa được cơ sở dữ liệu sử dụng bị vô hiệu hóa, hãy chuẩn bị nhận được ngoại lệ FAILED_PRECONDITION kèm theo thông tin chi tiết bổ sung trong thông báo lỗi, ví dụ:

{
  "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)"
      }
    ]
  }
}

Bật một khoá

Để kích hoạt lại khóa được liên kết với cơ sở dữ liệu, hãy hoàn tất các bước sau:

  1. Xem các phiên bản khoá đang được dùng cho một cơ sở dữ liệu
  2. Bật các phiên bản khoá đang dùng
  3. Chờ thay đổi có hiệu lực và kiểm tra xem bạn có còn truy cập được vào dữ liệu hay không. Các thay đổi thường có hiệu lực trong vòng vài phút, nhưng cũng có thể mất đến 3 giờ.

Xem nhật ký kiểm tra cho khoá Cloud KMS

Trước khi bật nhật ký kiểm tra Cloud KMS Data Access, bạn nên làm quen với Nhật ký kiểm tra Cloud.

Nhật ký kiểm tra quyền truy cập vào dữ liệu Cloud KMS cho biết thời điểm Cloud Firestore hoặc bất kỳ sản phẩm nào khác được định cấu hình để sử dụng khoá CMEK của bạn thực hiện các lệnh gọi mã hoá/giải mã đến Cloud KMS. Cloud Firestore không đưa ra lệnh mã hóa/giải mã cho mọi yêu cầu dữ liệu mà thay vào đó duy trì một trình thăm dò kiểm tra khóa theo định kỳ. Kết quả thăm dò ý kiến sẽ xuất hiện trong nhật ký kiểm tra.

Bạn có thể thiết lập và tương tác với nhật ký kiểm tra trong bảng điều khiển Google Cloud:

  1. Đảm bảo rằng ghi nhật ký được bật cho Cloud KMS API trong dự án của bạn.

  2. Chuyển đến Cloud Logging trong bảng điều khiển Google Cloud.

    Chuyển đến Cloud Logging

  3. Giới hạn các mục nhật ký vào khóa Cloud KMS của bạn bằng cách thêm các dòng sau vào Trình tạo truy vấn:

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

    Thay thế nội dung sau:

    • KMS_KEY với tên của khóa CMEK
    • KMS_KEYRING có bộ khoá KMS chứa khoá
    • KMS_LOCATION cùng với vị trí của khoá và bộ khoá

    Nhật ký cho thấy một vài mục nhập nhật ký khoảng 5 phút một lần cho mỗi cơ sở dữ liệu. Các mục nhật ký trông tương tự như các ví dụ sau:

    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"
    

Hãy xem phần Tìm hiểu về nhật ký kiểm tra để biết thông tin chi tiết về cách diễn giải nhật ký kiểm tra.

Định cấu hình chính sách tổ chức CMEK

Để chỉ định các yêu cầu về việc tuân thủ quy trình mã hoá cho Cloud Firestorecơ sở dữ liệu trong tổ chức của bạn, hãy sử dụng giới hạn chính sách tổ chức CMEK.

Yêu cầu bảo vệ bằng CMEK

Định cấu hình constraints/gcp.restrictNonCmekServices để yêu cầu CMEK cho việc tạo cơ sở dữ liệu Cloud Firestore. Đặt điều kiện ràng buộc thành deny và thêm firestore.googleapis.com vào danh sách từ chối, ví dụ:

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

Thay thế FIRESTORE_PROJECT bằng dự án cần hạn chế.

Để tìm hiểu thêm về cách định cấu hình chính sách của tổ chức, hãy xem bài viết Tạo và chỉnh sửa chính sách.

Sau khi chính sách có hiệu lực, bạn sẽ nhận được một thông báo ngoại lệ FAILED_PRECONDITION và thông báo lỗi nếu cố gắng tạo một cơ sở dữ liệu không phải CMEK trong dự án chịu ảnh hưởng. Ví dụ: một ngoại lệ có dạng như sau:

{
  "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."
          }
        ]

Hạn chế việc sử dụng khoá cho CMEK

Để giới hạn khóa Cloud KMS được sử dụng để bảo vệ CMEK, hãy cấu hình ràng buộc constraints/gcp.restrictCmekCryptoKeyProjects.

Là một ràng buộc danh sách, các giá trị được chấp nhận là chỉ báo phân cấp tài nguyên (ví dụ: projects/PROJECT_ID, under:folders/FOLDER_IDunder:organizations/ORGANIZATION_ID). Hãy sử dụng ràng buộc này bằng cách định cấu hình danh sách chỉ báo phân cấp tài nguyên và đặt ràng buộc thành Allow (Cho phép). Cấu hình này hạn chế các dịch vụ được hỗ trợ để chỉ có thể chọn khoá CMEK trong số các dự án, thư mục và tổ chức được liệt kê. Yêu cầu tạo tài nguyên được bảo vệ bằng CMEK trong các dịch vụ được cấu hình sẽ không thành công nếu không có khóa Cloud Firestore từ một trong các tài nguyên được phép.

Ví dụ sau chỉ cho phép khóa từ ALLOWED_KEY_PROJECT_ID đối với cơ sở dữ liệu được bảo vệ bằng CMEK trong dự án đã chỉ định:

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

Sau khi chính sách có hiệu lực, bạn sẽ nhận được một ngoại lệ FAILED_PRECONDITION và thông báo lỗi nếu vi phạm quy tắc ràng buộc. Một trường hợp ngoại lệ sẽ có dạng như sau:

{
  "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."
          }
        ]
      }
    ]
  }
}

Bước tiếp theo