Trang này mô tả cách thực hiện các thao tác 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 chung về CMEK, bao gồm cả thời điểm và lý do bật tính năng này, hãy xem tài liệu về Cloud KMS.
Chuẩn bị khoá CMEK
Trước khi 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:
- Yêu cầu quyền truy cập vào tính năng CMEK của Cloud Firestore.
- Tạo (hoặc truy xuất) một tác nhân dịch vụ Cloud Firestore.
- Tạo khoá CMEK.
- Đị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. Sau này, nếu tạo một 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 bạn tạo một tác nhân dịch vụ Cloud Firestore, hãy yêu cầu quyền truy cập vào tính năngCMEK bằng cách điền vào biểu mẫu này.
Tạo tác nhân dịch vụ Cloud Firestore
Trước khi tạo khoá CMEK, bạn phải có Cloud Firestore trình đại diện dịch vụ. Đây là một loại tài khoản dịch vụ do Google quản lý mà Cloud Firestore sử dụng để truy cập vào khoá.
Chạy lệnh services identity create (tạo thông tin nhận dạng cho các dịch vụ) để tạo tác nhân dịch vụ mà Cloud Firestore sử dụng để thay mặt bạn truy cập vào khoá CMEK. 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 bạn dự định sử dụng cho cơ sở dữ liệu Cloud Firestore.
Lệnh này hiển thị mã nhận dạng của tác nhân dịch vụ, được định dạng như một địa chỉ email. Ghi lại chuỗi email đầu ra vì bạn sẽ sử dụng chuỗi này ở bước sau.
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
Tạo khoá
Bạn có thể sử dụng khoá được tạo trực tiếp trong Cloud KMS hoặc khoá được quản lý bên ngoài mà bạn cung cấp bằng Trình quản lý khoá bên ngoài trên đám mây.
Vị trí khoá của Cloud KMS phải giống với vị trí của cơ sở dữ liệu Cloud Firestore mà khoá đó sẽ được sử dụng.
Đối với vị trí cơ sở dữ liệu theo khu vực, hãy sử dụng cùng một tên vị trí cho vòng khoá, khoá và cơ sở dữ liệu vì tên vị trí có mối liên kết một với 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 vòng khoá và khoá trongus-west1
.Đối với vị trí cơ sở dữ liệu nhiều vùng, hãy sử dụng tên vị trí của vị trí nhiều vùng của KMS:
- Sử dụng vị trí nhiều vùng
us
của Cloud KMS cho vị trí nhiều vùng Cloud Firestorenam5
. - Sử dụng vị trí nhiều vùng
europe
của Cloud KMS cho vị trí nhiều vùng Cloud Firestoreeur3
.
- Sử dụng vị trí nhiều vùng
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:
Tạo một bộ khoá và một khoá bằng một trong các cách sau:
- Tạo bộ khoá và khoá ngay trong Cloud KMS.
- Sử dụng khoá do bên ngoài quản lý. Tạo khoá bên ngoài rồi tạo khoá Cloud EKM để cung cấp khoá thông qua Cloud KMS.
Định cấu hình chế độ cài đặt IAM cho khoá
Bảng điều khiển
Để cấp vai trò Cloud KMS cho tác nhân dịch vụ, hãy làm như sau. Bạn cũng có thể cấp quyền ở cấp khoá hoặc vòng khoá nếu muốn có mức độ chi tiết thấp hơn.
Trong Google Cloud Console, hãy chuyển đến trang IAM.
Nhấp vào Thêm.
Nhập mã nhận dạng ở định dạng email cho tác nhân dịch vụ Cloud Firestore.
Chọn vai trò Trình mã hoá/Trình giải mã khoá mã hoá Cloud KMS.
Nhấp vào Lưu.
gcloud
Cấp vai trò cloudkms.cryptoKeyEncrypterDecrypter
cho nhân viên hỗ trợ:
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 bộ khoá KMS chứa khoáKMS_LOCATION
với vùng chứa bộ khoáSERVICE_AGENT_EMAIL
có giá trị nhận dạng ở định dạng email cho nhân viên hỗ trợ dịch vụ mà bạn đang cấp quyền truy cậpKMS_PROJECT
với dự án chứa khoá
Dòng lệnh 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 tạo và định cấu hình khoá CMEK, bạn có thể tạo một cơ sở dữ liệu được bảo vệ bằng CMEK. Bạn không thể chuyển đổi cơ sở dữ liệu Cloud Firestore hiện có được bảo vệ bằng phương thức mã hoá mặc định của Google để sử dụng CMEK.
Bạn chỉ có thể chọn loại và khoá mã hoá khi tạo cơ sở dữ liệu hỗ trợ CMEK.
Bảng điều khiển
Trong Google Cloud Console, hãy chuyển đến trang Databases (Cơ sở dữ liệu).
Nhấp vào Tạo cơ sở dữ liệu.
Chọn chế độ cơ sở dữ liệu. Nhấp vào Tiếp tục.
Trên trang Định cấu hình cơ sở dữ liệu, hãy nhập mã cơ sở dữ liệu.
Chọn một vị trí.
Nhấp vào Hiển thị tuỳ chọn mã hoá, sau đó chọn Khoá Cloud KMS.
Chọn hoặc nhập tên tài nguyên cho khoá CMEK mà bạn muốn sử dụng cho cơ sở dữ liệu.
Danh sách khoá chỉ giới hạn ở 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á từ một dự án Google Cloud khác, hãy nhấp vào Chuyển đổi dự án hoặc Nhập khoá theo cách thủ công.
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, bạn phải cấp vai trò
cloudkms.cryptoKeyEncrypterDecrypter
cho tài khoản dịch vụ Cloud Firestore.Chọn quy tắc bảo mật cho ứng dụng di động và ứng dụng web.
Nhấp vào Tạo cơ sở dữ liệu.
Sau khi tạo cơ sở dữ liệu, bạn có thể xác minh rằng cơ sở dữ liệu đó đã bật CMEK bằng cách xem Thông tin chi tiết về cơ sở dữ liệu:
- Nếu cơ sở dữ liệu của bạn được bảo vệ bằng CMEK, thì trường Loại mã hoá sẽ hiển thị là Do khách hàng quản lý và trường Khoá mã hoá sẽ liệt kê Cloud KMS tương ứng và phiên bản khoá 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 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 bài viết 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
với vị trí Cloud Firestore cho cơ sở dữ liệuDATABASE_ID
có mã nhận dạng cho cơ sở dữ liệuKMS_KEY_NAME
có 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
FIRESTORE_PROJECT
với dự án để sử dụng cho cơ sở dữ liệu Cloud Firestore
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 khoá Cloud KMS. Chỉ cho phép một 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
.
Yêu cầu mẫ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 cơ sở dữ liệu 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 một 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
có mã nhận dạng của cơ sở dữ liệuLOCATION
với vị trí của cơ sở dữ liệuKMS_PROJECT
với dự án chứa khoá CMEKKMS_LOCATION
với vị trí chứa khoá CMEK và bộ khoáKMS_KEYRING_ID
có mã của vòng khoá CMEKFIRESTORE_PROJECT
với dự án để sử dụng cho cơ sở dữ liệu Cloud Firestore
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 CMEK sau đây 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 đủ dùng để mã hoá cơ sở dữ liệu CMEK Cloud Firestore.
- Trường Active Key Versions (Phiên bản khoá đang hoạt động) cung cấp danh sách tất cả phiên bản khoá 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 FirestoreDATABASE_ID
có mã nhận dạng cho cơ sở dữ liệuFIRESTORE_DATABASE_LOCATION
với vị trí Cloud Firestore cho cơ sở dữ liệuDATABASE_TYPE
vớiFIRESTORE_NATIVE
cho chế độ Gốc hoặcDATASTORE_MODE
cho chế độ Kho dữ liệu.KMS_KEY_NAME
có tên mà bạn chỉ định cho khoá. Sử dụng tên tài nguyên đầy đủ cho khoá ở định dạng:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
Truy cập vào cơ sở dữ liệu được bảo vệ bằng CMEK
Tất cả thao tác đọc, ghi và truy vấn được gửi đến cơ sở dữ liệu được bảo vệ bằng CMEK sẽ hoạt động giống như với 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 mỗi 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ề phương thức mã hoá CMEK, phương thức mã hoá mặc định của Google (không phải CMEK) hay phương thức mã hoá giống với bản sao lưu hay không.
Chuẩn bị khoá (primary-version) và phiên bản khoá mà bạn đã dùng để mã hoá 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ề chế độ mã hoá bằng CMEK
Để khôi phục chế độ mã hoá CMEK, hãy chạy lệnh gcloud firestore databases restore (khôi phục cơ sở dữ liệu Firestore) với cờ encryption-type
và kms-key-name
(không bắt buộc) để định cấu hình loại mã hoá cho cơ sở dữ liệu đã khôi phục. Nếu bạn không chỉ định loại mã hoá, thì cơ sở dữ liệu đã 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 một loại mã hoá như bản sao lưu
Để khôi phục về cùng một 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ề chế độ mã hoá CMEK
Để khôi phục phương thức mã hoá CMEK, hãy sử dụng cờ encryption-type
và kms-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
có mã nhận dạng của cơ sở dữ liệuFIRESTORE_PROJECT
với dự án để sử dụng cho cơ sở dữ liệu Cloud FirestoreFIRESTORE_LOCATION
với vị trí của cơ sở dữ liệu Cloud FirestoreBACKUP_ID
có mã nhận dạng của bản sao lưuKMS_PROJECT
với dự án chứa khoá CMEKKMS_LOCATION
với vị trí chứa khoá CMEK và bộ khoáKMS_KEYRING_ID
có mã của vòng 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
có mã nhận dạng của cơ sở dữ liệuFIRESTORE_PROJECT
với dự án để sử dụng cho cơ sở dữ liệu Cloud FirestoreFIRESTORE_LOCATION
với vị trí của cơ sở dữ liệu Cloud FirestoreBACKUP_ID
có 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 một loại mã hoá như bản sao lưu
Để khôi phục về cùng một 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
có mã nhận dạng của cơ sở dữ liệuFIRESTORE_PROJECT
với dự án để sử dụng cho cơ sở dữ liệu Cloud FirestoreFIRESTORE_LOCATION
với vị trí của cơ sở dữ liệu Cloud FirestoreBACKUP_ID
có mã nhận dạng của bản sao lưu
Xem khoá đang được sử dụng
gcloud
Bạn có thể sử dụng lệnh gcloud CLI databases describe (mô tả cơ sở dữ liệu) để 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 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 các thông tin sau:
kmsKeyName
: tên tài nguyên khoá đầ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ả 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. Bạn cần có cả phiên bản khoá cũ và phiên bản khoá mới trong quá trình xoay vòng khoá. Đừng tắt phiên bản khoá cũ cho đến khi phiên bản đó không còn xuất hiện trong trườngactiveKeyVersion
.
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 khoá Cloud KMS. Chỉ cho phép một 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 khoá được liên kết với cơ sở dữ liệu, hãy hoàn tất các bước sau:
- Xem các phiên bản khoá đang được sử dụng cho một cơ sở dữ liệu.
- Tắt các phiên bản khoá đang sử dụng.
- Chờ thay đổi có hiệu lực và kiểm tra xem bạn có thể truy cập vào dữ liệu đó hay không. Các thay đổi thường bắt đầu có hiệu lực trong vòng vài phút, nhưng cũng có thể mất đến 3 giờ.
Khi một khoá mà cơ sở dữ liệu sử dụng bị vô hiệu hoá, bạn sẽ 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 khoá
Để bật lại khoá được liên kết với một cơ sở dữ liệu, hãy hoàn tất các bước sau:
- Xem các phiên bản khoá đang được sử dụng cho cơ sở dữ liệu
- Bật các phiên bản khoá đang sử dụng này
- Chờ thay đổi có hiệu lực và kiểm tra xem bạn có thể truy cập vào dữ liệu đó hay không. Các thay đổi thường bắt đầu 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 Quyền truy cập dữ liệu Cloud KMS, bạn nên quen thuộc với Nhật ký kiểm tra trên đám mây.
Nhật ký kiểm tra quyền truy cập dữ liệu trên Cloud KMS cho bạn 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 lệnh gọi mã hoá/giải mã đến Cloud KMS. Cloud Firestore không đưa ra lệnh gọi mã hoá/giải mã trên mọi yêu cầu dữ liệu, mà thay vào đó duy trì một trình kiểm tra định kỳ để kiểm tra khoá. 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:
Đảm bảo rằng bạn đã bật tính năng ghi nhật ký cho API Cloud KMS trong dự án.
Chuyển đến Cloud Logging trong bảng điều khiển Google Cloud.
Giới hạn các mục nhập nhật ký cho khoá Cloud KMS 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
có tên của khoá CMEKKMS_KEYRING
với bộ khoá KMS chứa khoáKMS_LOCATION
với vị trí của khoá và bộ khoá
Nhật ký này cho thấy một vài mục nhập nhật ký cứ sau 5 phút cho mỗi cơ sở dữ liệu. Các mục nhập nhật ký sẽ có dạng 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 bài viết 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 tuân thủ về việc mã hoá cho cơ sở dữ liệu Cloud Firestore trong tổ chức của bạn, hãy sử dụng quy tắc ràng buộc chính sách tổ chức về 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 ngoại lệ FAILED_PRECONDITION
và thông báo lỗi nếu cố gắng tạo cơ sở dữ liệu không phải CMEK trong dự án bị ả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ế sử dụng khoá cho CMEK
Để giới hạn khoá Cloud KMS nào được dùng để bảo vệ CMEK, hãy định cấu hình quy tắc ràng buộc constraints/gcp.restrictCmekCryptoKeyProjects
.
Là một quy tắc ràng buộc danh sách, các giá trị được chấp nhận là chỉ báo hệ phân cấp tài nguyên (ví dụ: projects/PROJECT_ID
, under:folders/FOLDER_ID
và under:organizations/ORGANIZATION_ID
). Hãy sử dụng quy tắc ràng buộc này bằng cách định cấu hình danh sách chỉ báo hệ phân cấp tài nguyên và đặt quy tắc ràng buộc thành Cho phép.
Cấu hình này hạn chế các dịch vụ được hỗ trợ để bạn chỉ có thể chọn khoá CMEK trong các dự án, thư mục và tổ chức được liệt kê. Các yêu cầu tạo tài nguyên được bảo vệ bằng CMEK trong các dịch vụ đã định cấu hình sẽ không thành công nếu không có khoá Cloud Firestore từ một trong các tài nguyên được phép.
Ví dụ sau đây chỉ cho phép các khoá từ ALLOWED_KEY_PROJECT_ID cho các 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 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." } ] } ] } }