استفاده از کلیدهای رمزگذاری تحت مدیریت مشتری (CMEK)

این صفحه نحوه انجام کارهای مربوط به کلیدهای رمزگذاری مدیریت‌شده توسط مشتری (CMEK) برای Cloud Firestore را شرح می‌دهد. برای اطلاعات بیشتر درباره CMEK به‌طور کلی، ازجمله زمان و دلیل فعال کردن آن، به اسناد Cloud KMS مراجعه کنید.

آماده کردن کلیدهای CMEK

قبل‌از اینکه بتوانید پایگاه داده Cloud Firestore محافظت‌شده با CMEK ایجاد کنید، باید مراحل زیر را تکمیل کنید:

  1. درخواست دسترسی به Cloud Firestore ویژگی CMEK.
  2. یک عامل سرویس Cloud Firestore ایجاد (یا بازیابی) کنید.
  3. کلید CMEK ایجاد کنید.
  4. تنظیمات IAM را برای آن کلید پیکربندی کنید.

این مراحل را برای هر پروژه‌ای که حاوی پایگاه‌های داده محافظت‌شده با CMEK Cloud Firestore است تکمیل کنید. اگر بعداً کلید CMEK جدیدی ایجاد کنید، باید تنظیمات IAM را برای آن کلید پیکربندی کنید.

درخواست دسترسی

قبل‌از ایجاد عامل سرویس Cloud Firestore، با تکمیل کردن این فرم، دسترسی به ویژگی CMEK را درخواست کنید.

ایجاد کردن عامل خدمات Cloud Firestore

قبل‌از ایجاد کلید CMEK، باید Cloud Firestore نماینده سرویس داشته باشید که نوعی حساب سرویس تحت مدیریت Google است که Cloud Firestore از آن برای دسترسی به کلید استفاده می‌کند.

فرمان services identity create را اجرا کنید تا عامل سرویسی را که Cloud Firestore برای دسترسی به کلید CMEK ازطرف شما استفاده می‌کند ایجاد کنید. این فرمان حساب خدمات را درصورت عدم وجود ایجاد می‌کند، سپس آن را نمایش می‌دهد.

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

FIRESTORE_PROJECT را با پروژه‌ای که قصد دارید برای پایگاه‌های داده Cloud Firestore استفاده کنید جایگزین کنید.

این فرمان شناسه نماینده سرویس را نمایش می‌دهد که قالب آن شبیه نشانی ایمیل است. رشته ایمیل خروجی را ثبت کنید، زیرا در مرحله بعد از آن استفاده خواهید کرد.

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

ایجاد کلید

می‌توانید از کلیدی که مستقیماً در Cloud KMS ایجاد شده است یا کلیدی که به‌صورت خارجی مدیریت می‌شود و آن را با Cloud External Key Manager دردسترس قرار می‌دهید استفاده کنید.

مکان کلید Cloud KMS باید با مکان پایگاه داده Cloud Firestore که با آن استفاده خواهد شد یکسان باشد.

  • برای مکان‌های پایگاه داده منطقه‌ای، از نام مکان یکسان برای حلقه‌کلید، کلید، و پایگاه داده استفاده کنید زیرا نام‌های مکان نگاشت یک‌به‌یک دارند.

    برای مثال، اگر می‌خواهید پایگاه داده محافظت‌شده با CMEK در us-west1 ایجاد کنید، حلقه‌کلید و کلید را در us-west1 ایجاد کنید.

  • برای مکان‌های پایگاه داده چندمنطقه‌ای، از نام مکان مکان چندمنطقه‌ای KMS استفاده کنید:

    • از مکان چندمنطقه‌ای Cloud KMS us برای مکان چندمنطقه‌ای Cloud Firestore nam5 استفاده کنید.
    • از مکان چندمنطقه‌ای Cloud KMS europe برای مکان چندمنطقه‌ای Cloud Firestore eur3 استفاده کنید.

در پروژه Google Cloud که می‌خواهید کلیدهایتان را در آن مدیریت کنید، موارد زیر را تکمیل کنید:

  1. Cloud KMS API را فعال کنید.

  2. بااستفاده از یکی از گزینه‌های زیر، حلقه‌کلید و کلید ایجاد کنید:

پیکربندی تنظیمات IAM برای کلید

کنسول

برای اعطای نقش Cloud KMS به عامل سرویس خود، مراحل زیر را دنبال کنید. اگر می‌خواهید دانه‌بندی کمتری داشته باشید، می‌توانید در سطح کلید یا حلقه‌کلید نیز اجازه اعطا کنید.

  1. در کنسول Google Cloud، به صفحه IAM بروید.

    به صفحه IAM بروید

  2. روی افزودن کلیک کنید.

  3. شناسه با قالب ایمیل را برای نماینده سرویس Cloud Firestore وارد کنید.

  4. نقش رمزگذار/رمزگشای CryptoKey در Cloud KMS را انتخاب کنید.

  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 ایجاد کنید. پایگاه‌های داده Cloud Firestore موجود که با رمزگذاری پیش‌فرض Google محافظت می‌شوند نمی‌توانند برای استفاده از CMEK تبدیل شوند.

فقط هنگام ایجاد پایگاه داده CMEK-فعال می‌توانید نوع رمزگذاری و کلید را انتخاب کنید.

کنسول

  1. در کنسول Google Cloud، به صفحه پایگاه‌های داده بروید.

    به صفحه «پایگاه‌های داده» بروید

  2. روی ایجاد پایگاه داده کلیک کنید.

  3. حالت پایگاه داده را انتخاب کنید. روی ادامه کلیک کنید.

  4. در صفحه پیکربندی پایگاه داده، شناسه پایگاه داده را وارد کنید.

  5. مکانی را انتخاب کنید.

  6. روی نمایش گزینه‌های رمزگذاری کلیک کنید و سپس کلید Cloud KMS را انتخاب کنید.

  7. نام منبع را برای کلید CMEK که می‌خواهید برای پایگاه داده استفاده کنید انتخاب یا وارد کنید.

  8. فهرست کلیدها به پروژه Google Cloud فعلی و مکان پایگاه داده‌ای که انتخاب کرده‌اید محدود است. برای استفاده از کلید از پروژه Google Cloud دیگری، روی عوض کردن پروژه یا وارد کردن دستی کلید کلیک کنید.

  9. اگر از شما خواسته شد اجازه کلید را به حساب سرویس Cloud Firestore اعطا کنید، روی اعطا کردن کلیک کنید. برای ایجاد پایگاه داده CMEK، باید نقش cloudkms.cryptoKeyEncrypterDecrypter به حساب خدماتی Cloud Firestore شما اعطا شود.

  10. قوانین امنیتی را برای کارخواه‌های تلفن همراه و وب انتخاب کنید.

  11. روی ایجاد پایگاه داده کلیک کنید.

پس‌از ایجاد پایگاه داده، می‌توانید با مشاهده جزئیات پایگاه داده تأیید کنید که پایگاه داده CMEK-فعال است:

  • اگر پایگاه داده شما با CMEK محافظت می‌شود، فیلد نوع رمزگذاری به‌صورت مدیریت‌شده توسط مشتری نشان داده می‌شود و فیلد کلید رمزگذاری Cloud KMS مربوطه و نسخه کلیدی را که برای محافظت از این پایگاه داده استفاده می‌شود فهرست می‌کند.
  • اگر پایگاه داده شما با CMEK محافظت نمی‌شود، فیلد نوع رمزگذاری به‌صورت مدیریت‌شده توسط Google نشان داده می‌شود.

gcloud

قبل‌از ایجاد پایگاه داده با CMEK فعال با Google Cloud CLI، جدیدترین نسخه را نصب کنید و به 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 با مکان Cloud Firestore برای پایگاه داده
  • DATABASE_ID با شناسه پایگاه داده
  • KMS_KEY_NAME با نامی که به کلید اختصاص داده‌اید. از نام کامل منبع برای کلید در قالب زیر استفاده کنید:

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

  • FIRESTORE_PROJECT با پروژه‌ای که می‌خواهید برای پایگاه داده Cloud Firestore استفاده کنید

REST API

درخواست اچ‌تی‌تی‌پی:

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

در بدنه درخواست، CMEK را در فیلد cmek_config.kms_key_name پیکربندی کنید.

روی شناسه منبع کامل کلید Cloud KMS تنظیم شده است. فقط کلیدی که در همان مکان این پایگاه داده باشد مجاز است.

این مقدار باید شناسه منبع کلید Cloud KMS در قالب projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_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

برای ایجاد پایگاه داده با CMEK فعال، از فیلد نام کلید KMS استفاده کنید. اگر پارامتر --kms-key-name را مشخص نکنید، Cloud Firestore به‌طور پیش‌فرض پایگاه داده‌ای بدون 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 با شناسه پایگاه داده‌تان
  • LOCATION با مکان پایگاه داده‌تان
  • KMS_PROJECT با پروژه‌ای که حاوی کلید CMEK شما است
  • KMS_LOCATION با مکانی که حاوی کلید CMEK و حلقه‌کلید شما است
  • KMS_KEYRING_ID با شناسه حلقه‌کلید CMEK شما
  • FIRESTORE_PROJECT با پروژه‌ای که می‌خواهید برای پایگاه داده Cloud Firestore استفاده کنید

تأیید کنید که پایگاه داده Cloud Firestore شما با واسط خط فرمان Firebase محافظت می‌شود:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

اطلاعات CMEK زیر در پیام پاسخ نشان داده می‌شود:

  • فیلد نام کلید KMS نام کامل منبع کلید را که برای رمزگذاری پایگاه داده CMEK Cloud Firestore شما استفاده می‌شود ارائه می‌دهد.
  • فیلد نسخه‌های کلید فعال فهرستی از همه نسخه‌های کلید را که درحال‌حاضر توسط این پایگاه داده 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 با پروژه‌ای که می‌خواهید برای پایگاه داده Cloud Firestore استفاده کنید
  • DATABASE_ID با شناسه پایگاه داده
  • FIRESTORE_DATABASE_LOCATION با مکان Cloud Firestore برای پایگاه داده
  • DATABASE_TYPE با FIRESTORE_NATIVE برای حالت «بومی» یا DATASTORE_MODE برای حالت Datastore.
  • 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)، یا به همان رمزگذاری نسخه پشتیبان بازیابی کنید.
  • کلید (نسخه اصلی) و نسخه کلیدی را که برای رمزگذاری نسخه پشتیبان استفاده کرده‌اید آماده کنید. هم کلید و هم نسخه کلید را فعال کنید.

gcloud

بازیابی پایگاه داده محافظت‌شده با CMEK به رمزگذاری CMEK

برای بازیابی به رمزگذاری CMEK، فرمان gcloud firestore databases restore را با پرچم‌های اختیاری encryption-type و kms-key-name اجرا کنید تا نوع رمزگذاری را برای پایگاه داده بازیابی‌شده پیکربندی کنید. اگر نوع رمزگذاری را مشخص نکنید، پایگاه داده بازیابی‌شده از همان پیکربندی رمزگذاری نسخه پشتیبان استفاده خواهد کرد.

  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

بازیابی پایگاه داده محافظت‌شده با CMEK به رمزگذاری CMEK

برای بازیابی به رمزگذاری CMEK، از پرچم اختیاری encryption-type و kms-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 با شناسه پایگاه داده‌تان
  • FIRESTORE_PROJECT با پروژه‌ای که می‌خواهید برای پایگاه داده Cloud Firestore استفاده کنید
  • FIRESTORE_LOCATION با مکان پایگاه داده Cloud Firestore
  • BACKUP_ID با شناسه نسخه پشتیبان شما
  • KMS_PROJECT با پروژه‌ای که حاوی کلید CMEK شما است
  • KMS_LOCATION با مکانی که حاوی کلید CMEK و حلقه‌کلید شما است
  • KMS_KEYRING_ID با شناسه حلقه‌کلید CMEK شما

تأیید کنید که پایگاه داده Cloud Firestore بازیابی‌شده شما با 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 با شناسه پایگاه داده‌تان
  • FIRESTORE_PROJECT با پروژه‌ای که می‌خواهید برای پایگاه داده Cloud Firestore استفاده کنید
  • FIRESTORE_LOCATION با مکان پایگاه داده Cloud Firestore
  • BACKUP_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 با شناسه پایگاه داده‌تان
  • FIRESTORE_PROJECT با پروژه‌ای که می‌خواهید برای پایگاه داده Cloud Firestore استفاده کنید
  • FIRESTORE_LOCATION با مکان پایگاه داده Cloud Firestore
  • BACKUP_ID با شناسه نسخه پشتیبان شما

همسانه‌سازی پایگاه داده محافظت‌شده با CMEK

قبل‌از شبیه‌سازی پایگاه داده محافظت‌شده با CMEK:

  • تصمیم بگیرید که می‌خواهید پایگاه داده را به رمزگذاری CMEK، به رمزگذاری پیش‌فرض Google (غیر CMEK)، یا به همان رمزگذاری پایگاه داده منبع شبیه‌سازی کنید.
  • کلید (نسخه اصلی) و نسخه کلیدی را که برای رمزگذاری پایگاه داده منبع استفاده کرده‌اید آماده کنید. هم کلید و هم نسخه کلید را فعال کنید.

gcloud

همسانه‌سازی پایگاه داده محافظت‌شده با CMEK در رمزگذاری CMEK

برای کلون کردن به رمزگذاری CMEK، فرمان gcloud firestore databases clone را با پرچم‌های اختیاری encryption-type و kms-key-name اجرا کنید تا نوع رمزگذاری را برای پایگاه داده کلون‌شده پیکربندی کنید. اگر نوع رمزگذاری را مشخص نکنید، پایگاه داده کلون‌شده از همان پیکربندی رمزگذاری پایگاه داده منبع استفاده خواهد کرد.

gcloud firestore databases clone \
--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 clone \
--encryption-type=google-default-encryption

کلون کردن پایگاه داده محافظت‌شده با CMEK به همان نوع رمزگذاری پایگاه داده منبع

برای کلون کردن به همان نوع رمزگذاری پایگاه داده منبع، پرچم encryption-type را به‌صورت زیر تنظیم کنید:

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

اگر --encryption-type نامشخص باشد، این رفتار پیش‌فرض است.

واسط خط فرمان Firebase

همسانه‌سازی پایگاه داده محافظت‌شده با CMEK در رمزگذاری CMEK

برای شبیه‌سازی به رمزگذاری CMEK، فرمان firebase firestore:databases:clone را با پرچم‌های اختیاری encryption-type و kms-key-name اجرا کنید تا نوع رمزگذاری را برای پایگاه داده شبیه‌سازی‌شده پیکربندی کنید. اگر نوع رمزگذاری را مشخص نکنید، پایگاه داده کلون‌شده از همان پیکربندی رمزگذاری پایگاه داده منبع استفاده خواهد کرد.

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--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 را به‌صورت زیر تنظیم کنید:

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

کلون کردن پایگاه داده محافظت‌شده با CMEK به همان نوع رمزگذاری پایگاه داده منبع

برای کلون کردن به همان نوع رمزگذاری پایگاه داده منبع، پرچم encryption-type را به‌صورت زیر تنظیم کنید:

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

اگر --encryption-type نامشخص باشد، این رفتار پیش‌فرض است.

مشاهده کلید درحال استفاده

gcloud

می‌توانید از فرمان databases describe gcloud CLI برای تأیید پیکربندی CMEK پایگاه داده استفاده کنید:

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

باید اطلاعات CMEK را در فیلد cmekConfig در پاسخ ببینید که مشابه موارد زیر است:

      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

درخواست اچ‌تی‌تی‌پی:

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

در بدنه درخواست، CMEK را در فیلد cmek_config.kms_key_name پیکربندی کنید. روی شناسه منبع کامل کلید Cloud KMS تنظیم شده است. فقط کلیدی که در همان مکان این پایگاه داده باشد مجاز است.

این مقدار باید شناسه منبع کلید Cloud KMS در قالب projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_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. منتظر بمانید تا تغییر اعمال شود و بررسی کنید که آیا داده‌ها دیگر دردسترس نیستند. تغییرات معمولاً ظرف چند دقیقه اعمال می‌شود، اما ممکن است تا ۳ ساعت طول بکشد.

وقتی کلید مورداستفاده پایگاه داده غیرفعال می‌شود، انتظار می‌رود که استثنای 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. منتظر بمانید تا تغییر اعمال شود و بررسی کنید که آیا داده‌ها دیگر دردسترس نیستند. تغییرات معمولاً ظرف چند دقیقه اعمال می‌شود، اما ممکن است تا ۳ ساعت طول بکشد.

مشاهده گزارش‌های ممیزی برای کلید Cloud KMS

قبل‌از فعال کردن گزارش‌های ممیزی «دسترسی به داده‌های Cloud KMS»، باید با گزارش‌های ممیزی Cloud آشنا باشید.

گزارش‌های ممیزی «دسترسی به داده‌های Cloud KMS» به شما نشان می‌دهد که چه زمانی Cloud Firestore یا هر محصول دیگری که برای استفاده از کلید CMEK شما پیکربندی شده است، فراخوانی‌های رمزگذاری/رمزگشایی را به Cloud KMS انجام می‌دهد. ‫Cloud Firestore برای هر درخواست داده، تماس رمزگذاری/رمزگشایی برقرار نمی‌کند، بلکه یک نظرسنجی‌کننده را حفظ می‌کند که کلید را به‌طور دوره‌ای بررسی می‌کند. نتایج نظرسنجی در گزارش‌های ممیزی نشان داده می‌شود.

می‌توانید گزارش‌های ممیزی را در کنسول Google Cloud راه‌اندازی کنید و با آن‌ها تعامل داشته باشید:

  1. مطمئن شوید که ثبت گزارش برای Cloud KMS API در پروژه‌تان فعال باشد.

  2. به Cloud Logging در کنسول Google Cloud بروید.

    رفتن به 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 با مکان کلید و حلقه‌کلید

    گزارش چند ورودی گزارش را تقریباً هر پنج دقیقه برای هر پایگاه داده نشان می‌دهد. ورودی‌های گزارش شبیه این نمونه‌ها است:

    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

برای مشخص کردن الزامات رعایت رمزگذاری برای پایگاه‌های داده Cloud Firestore در سازمانتان، از محدودیت خط‌مشی سازمان CMEK استفاده کنید.

الزامی کردن محافظت CMEK

constraints/gcp.restrictNonCmekServices را پیکربندی کنید تا برای ایجاد پایگاه داده Cloud Firestore، به CMEK نیاز باشد. محدودیت را روی 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

برای محدود کردن کلیدهای Cloud KMS که برای محافظت CMEK استفاده می‌شوند، محدودیت constraints/gcp.restrictCmekCryptoKeyProjects را پیکربندی کنید.

به‌عنوان محدودیت فهرست، مقادیر پذیرفته‌شده نشانگرهای سلسله‌مراتب منابع هستند (برای مثال، projects/PROJECT_ID، under:folders/FOLDER_ID، و under:organizations/ORGANIZATION_ID). با پیکربندی فهرستی از نشانگرهای سلسله‌مراتب منابع و تنظیم محدودیت روی مجاز کردن، از این محدودیت استفاده کنید. این پیکربندی سرویس‌های پشتیبانی‌شده را محدود می‌کند تا کلیدهای CMEK فقط از پروژه‌ها، پوشه‌ها، و سازمان‌های فهرست‌شده انتخاب شوند. درخواست‌های ایجاد منابع محافظت‌شده با CMEK در سرویس‌های پیکربندی‌شده بدون Cloud Firestore کلید از یکی از منابع مجاز موفقیت‌آمیز نخواهد بود.

مثال زیر فقط به کلیدهای ALLOWED_KEY_PROJECT_ID برای پایگاه‌های داده محافظت‌شده با CMEK در پروژه مشخص‌شده اجازه می‌دهد:

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

حالا چه می‌شود