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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

یک کلید ایجاد کنید

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

مکان کلید 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 را برای کلید پیکربندی کنید

کنسول gcloud

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

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

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

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

  3. شناسه فرمت شده ایمیل برای عامل سرویس Cloud Firestore خود را وارد کنید.

  4. نقش Cloud KMS CryptoKey Encrypter/Decrypter را انتخاب کنید.

  5. روی ذخیره کلیک کنید.

نقش 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. حالت پایگاه داده خود را انتخاب کنید. روی Continue کلیک کنید.

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

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

  6. روی Show Encryption Options کلیک کنید و سپس کلید Cloud KMS را انتخاب کنید.

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

  8. فهرست کلیدها به پروژه فعلی Google Cloud و مکان پایگاه داده ای که انتخاب کرده اید محدود می شود. برای استفاده از کلیدی از پروژه Google Cloud دیگر، روی Switch Project یا Enter Key به صورت دستی کلیک کنید.

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

  10. قوانین امنیتی را برای مشتریان موبایل و وب انتخاب کنید.

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

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

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

قبل از ایجاد یک پایگاه داده با 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 خود

درخواست HTTP:

ارسال 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"
  }
}'

برای ایجاد یک پایگاه داده با CMEK فعال، از قسمت KMS Key Name استفاده کنید. اگر پارامتر --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 CLI محافظت می شود:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

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

  • فیلد KMS Key Name نام کامل منبع کلید را ارائه می‌کند که برای رمزگذاری پایگاه داده Cloud Firestore CMEK شما استفاده می‌شود.
  • قسمت Active Key Versions فهرستی از تمام نسخه‌های کلیدی که در حال حاضر توسط این پایگاه داده CMEK استفاده می‌شود، ارائه می‌کند. در طول چرخش کلید ، می توانید چندین نسخه کلید فعال داشته باشید.

برای ایجاد یک پایگاه داده با 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 برای حالت 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)، یا به همان رمزگذاری پشتیبان بازیابی کنید.
  • کلید (نسخه اصلی) و نسخه کلیدی را که برای رمزگذاری پشتیبان استفاده کرده اید، آماده کنید. هم نسخه کلید و هم نسخه کلید را فعال کنید.

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

برای بازگردانی به رمزگذاری CMEK، دستور بازگردانی پایگاه‌های داده آتش‌نشانی gcloud را با پرچم‌های اختیاری 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

یک پایگاه داده محافظت شده با 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 با شناسه پشتیبان شما

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

gcloud REST API

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

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 ظاهر نشود غیرفعال نکنید.

درخواست HTTP:

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. منتظر بمانید تا تغییر اعمال شود و بررسی کنید که آیا داده ها دیگر در دسترس نیستند. تغییرات معمولاً در عرض چند دقیقه اعمال می شوند، اما ممکن است تا 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 Data Access را فعال کنید، باید با Cloud Audit Logs آشنا باشید.

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

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

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

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

    به Cloud Logging بروید

  3. با افزودن خطوط زیر به سازنده Query، ورودی‌های گزارش را به کلید 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 را برای نیاز به CMEK برای ایجاد پایگاه داده Cloud Firestore پیکربندی کنید. محدودیت را برای 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 ). از این محدودیت با پیکربندی فهرستی از شاخص های سلسله مراتب منابع و تنظیم محدودیت روی Allow استفاده کنید. این پیکربندی خدمات پشتیبانی شده را محدود می کند به طوری که کلیدهای 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."
          }
        ]
      }
    ]
  }
}

بعدش چی