Müşteri tarafından yönetilen şifreleme anahtarlarını (CMEK) kullanma

Bu sayfada, Cloud Firestore için müşteri tarafından yönetilen şifreleme anahtarları (CMEK) ile ilgili görevlerin nasıl gerçekleştirileceği açıklanmaktadır. CMEK'in ne zaman ve neden etkinleştirileceği de dahil olmak üzere genel olarak CMEK hakkında daha fazla bilgi için Cloud KMS belgelerine bakın.

CMEK anahtarlarınızı hazırlama

CMEK korumalı bir Cloud Firestore veritabanı oluşturabilmek için aşağıdaki adımları tamamlamanız gerekir:

  1. Cloud Firestore CMEK özelliğine erişim isteyin.
  2. Cloud Firestore hizmet aracısı oluşturun (veya alın).
  3. CMEK anahtarı oluşturun.
  4. Bu anahtar için IAM ayarlarını yapılandırın.

CMEK korumalı veritabanları içerecek her proje için bu adımları tamamlayın. Cloud Firestore Daha sonra yeni bir CMEK anahtarı oluşturursanız bu anahtar için IAM ayarlarını yapılandırmanız gerekir.

Erişim iste

Cloud Firestore hizmet aracısı oluşturmadan önce bu formu doldurarak CMEK özelliğine erişim isteğinde bulunun.

Cloud Firestore hizmet aracısı oluşturma

CMEK anahtarı oluşturmadan önce bir Cloud Firestore hizmet aracınız olmalıdır. Hizmet aracısı, Cloud Firestore tarafından anahtara erişmek için kullanılan, Google tarafından yönetilen bir hizmet hesabı türüdür.

Cloud Firestore hizmetinin sizin adınıza CMEK anahtarına erişmek için kullandığı hizmet aracısını oluşturmak üzere services identity create komutunu çalıştırın. Bu komut, hizmet hesabını oluşturur (henüz oluşturulmamışsa) ve ardından görüntüler.

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

FIRESTORE_PROJECT yerine Cloud Firestore veritabanlarınız için kullanmayı planladığınız projeyi yazın.

Komut, e-posta adresi biçiminde olan hizmet aracısı kimliğini gösterir. Çıkış e-posta dizesini kaydedin. Bu dizeyi sonraki adımlarda kullanacaksınız.

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

Anahtar oluştur

Doğrudan Cloud KMS'de oluşturulan bir anahtarı veya Cloud External Key Manager ile kullanılabilir hale getirdiğiniz harici olarak yönetilen bir anahtarı kullanabilirsiniz.

Cloud KMS anahtar konumu, kullanılacağı Cloud Firestore veritabanının konumuyla aynı olmalıdır.

  • Bölgesel veritabanı konumları için anahtarlık, anahtar ve veritabanında aynı konum adını kullanın. Konum adları bire bir eşlenir.

    Örneğin, us-west1 bölgesinde CMEK korumalı bir veritabanı oluşturmak istiyorsanız us-west1 bölgesinde bir anahtarlık ve anahtar oluşturun.

  • Çok bölgeli veritabanı konumları için KMS çok bölgeli konumunun konum adını kullanın:

    • Cloud Firestore nam5 çok bölgeli konumu için Cloud KMS us çok bölgeli konumunu kullanın.
    • Cloud Firestore eur3 çok bölgeli konumu için Cloud KMS europe çok bölgeli konumunu kullanın.

Anahtarlarınızı yönetmek istediğiniz Google Cloud projesinde aşağıdakileri yapın:

  1. Cloud KMS API'yi etkinleştirin.

  2. Aşağıdaki seçeneklerden birini kullanarak anahtarlık ve anahtar oluşturun:

Anahtar için IAM ayarlarını yapılandırma

Console

Hizmet aracınıza Cloud KMS rolü vermek için aşağıdaki adımları uygulayın. Daha düşük ayrıntı düzeyi istiyorsanız anahtar veya anahtarlık düzeyinde de izin verebilirsiniz.

  1. Google Cloud Console'da IAM sayfasına gidin.

    IAM sayfasına gidin

  2. Ekle'yi tıklayın.

  3. Cloud Firestore hizmet aracınızın e-posta biçimindeki kimliğini girin.

  4. Cloud KMS CryptoKey Şifreleyici/Şifre Çözücü rolünü seçin.

  5. Kaydet'i tıklayın.

gcloud

Hizmet aracınıza cloudkms.cryptoKeyEncrypterDecrypter rolünü verin:

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

Aşağıdakini değiştirin:

  • KMS_KEY yerine anahtara atadığınız adı yazın.
  • KMS_KEYRING yerine anahtarı içeren KMS anahtarlığını yazın.
  • KMS_LOCATION yerine anahtarlığı içeren bölgeyi yazın.
  • SERVICE_AGENT_EMAIL, erişim izni verdiğiniz hizmet aracısının e-posta biçimli tanımlayıcısıdır.
  • Anahtarı içeren projeyle KMS_PROJECT

Terminalde aşağıdakine benzer bir yanıt gösterilir:

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

CMEK özellikli veritabanı oluşturma

CMEK anahtarlarınız oluşturulup yapılandırıldıktan sonra CMEK korumalı bir veritabanı oluşturabilirsiniz. Google'ın varsayılan şifrelemesiyle korunan mevcut Cloud Firestore veritabanları, CMEK kullanacak şekilde dönüştürülemez.

Şifreleme türünü ve anahtarını yalnızca CMEK özellikli bir veritabanı oluştururken seçebilirsiniz.

Console

  1. Google Cloud Console'da Veritabanları sayfasına gidin.

    Veritabanları sayfasına gidin.

  2. Veritabanı oluştur'u tıklayın.

  3. Veritabanı modunuzu seçin. Devam'ı tıklayın.

  4. Veritabanınızı yapılandırın sayfasında bir veritabanı kimliği girin.

  5. Bir yer seçin.

  6. Şifreleme Seçeneklerini Göster'i tıklayın ve Cloud KMS anahtarı'nı seçin.

  7. Veritabanı için kullanmak istediğiniz CMEK anahtarının kaynak adını seçin veya girin.

  8. Anahtar listesi, mevcut Google Cloud projesi ve seçtiğiniz veritabanı konumuyla sınırlıdır. Farklı bir Google Cloud projesindeki anahtarı kullanmak için Projeyi Değiştir veya Anahtarı Manuel Olarak Gir'i tıklayın.

  9. Cloud Firestore hizmet hesabına anahtar izni vermeniz istenirse İzin ver'i tıklayın. CMEK veritabanı oluşturmak için Cloud Firestore hizmet hesabınıza cloudkms.cryptoKeyEncrypterDecrypter rolü verilmelidir.

  10. Mobil ve web istemcileri için güvenlik kuralları seçin.

  11. Veritabanı oluştur'u tıklayın.

Veritabanı oluşturulduktan sonra Veritabanı ayrıntıları'nı görüntüleyerek veritabanında CMEK'nin etkinleştirildiğini doğrulayabilirsiniz:

  • Veritabanınız CMEK ile korunuyorsa Şifreleme türü alanı Müşteri tarafından yönetilen olarak gösterilir ve Şifreleme anahtarı alanında, ilgili Cloud KMS ve bu veritabanını korumak için kullanılan anahtar sürümü listelenir.
  • Veritabanınız CMEK ile korunmuyorsa Şifreleme türü alanı Google tarafından yönetilen olarak gösterilir.

gcloud

Google Cloud CLI ile CMEK özellikli bir veritabanı oluşturmadan önce en yeni sürümü yükleyin ve gcloud CLI'i yetkilendirin. Daha fazla bilgi için gcloud CLI'yi yükleme başlıklı makaleyi inceleyin.

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

Aşağıdakini değiştirin:

  • Veritabanı için FIRESTORE_DATABASE_LOCATION değerini Cloud Firestore konumuyla değiştirin.
  • Veritabanı kimliğiyle DATABASE_ID
  • KMS_KEY_NAME ifadesini, anahtara atadığınız adla değiştirin. Anahtar için aşağıdaki biçimde tam kaynak adını kullanın:

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

  • Cloud Firestore veritabanınız için kullanılacak proje ile FIRESTORE_PROJECT

REST API

HTTP isteği:

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

İstek gövdesinde, CMEK'yi cmek_config.kms_key_name alanında yapılandırın.

Cloud KMS anahtarının tam kaynak kimliğine ayarlanır. Yalnızca bu veritabanıyla aynı konumda bulunan bir anahtara izin verilir.

Bu değer, şu biçimdeki Cloud KMS anahtarı kaynak kimliği olmalıdır: projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Diğer alanlar hakkında daha fazla bilgi için database create sayfasını inceleyin.

Örnek istek:

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

Firebase CLI

CMEK özellikli bir veritabanı oluşturmak için KMS Anahtar Adı alanını kullanın. --kms-key-name parametresini belirtmezseniz Cloud Firestore varsayılan olarak CMEK olmayan bir veritabanı oluşturur.

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

Aşağıdakini değiştirin:

  • DATABASE_ID yerine veritabanınızın kimliğini yazın.
  • LOCATION yerine veritabanınızın konumunu yazın.
  • CMEK anahtarınızı içeren projeyle KMS_PROJECT
  • KMS_LOCATION yerine CMEK anahtarınızı ve anahtarlığınızı içeren konum
  • KMS_KEYRING_ID yerine CMEK anahtar halkanızın kimliğini girin.
  • Cloud Firestore veritabanınız için kullanılacak proje ile FIRESTORE_PROJECT

Cloud Firestore veritabanınızın Firebase CLI ile korunduğunu onaylayın:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Yanıt mesajında aşağıdaki CMEK bilgileri görünür:

  • KMS Anahtar Adı alanı, Cloud Firestore CMEK veritabanınızı şifrelemek için kullanılan tam anahtar kaynak adını sağlar.
  • Etkin Anahtar Sürümleri alanı, bu CMEK veritabanı tarafından kullanılan tüm anahtar sürümlerinin listesini sağlar. Anahtar rotasyonu sırasında birden fazla etkin anahtar sürümünüz olabilir.

Terraform

CMEK özellikli bir veritabanı oluşturmak için google_firestore_database kaynağını kullanın. Daha fazla bilgi ve örnek için google_firestore_database başlıklı makaleyi inceleyin.

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

Aşağıdakini değiştirin:

  • Cloud Firestore veritabanınız için kullanılacak proje ile FIRESTORE_PROJECT
  • Veritabanı kimliğiyle DATABASE_ID
  • Veritabanı için FIRESTORE_DATABASE_LOCATION değerini Cloud Firestore konumuyla değiştirin.
  • DATABASE_TYPE değerini, yerel mod için FIRESTORE_NATIVE veya Datastore modu için DATASTORE_MODE ile değiştirin.
  • KMS_KEY_NAME ifadesini, anahtara atadığınız adla değiştirin. Anahtar için şu biçimde tam kaynak adını kullanın:

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

CMEK korumalı bir veritabanına erişme

CMEK korumalı bir veritabanına gönderilen tüm okuma, yazma ve sorgu işlemleri, Google'ın varsayılan şifrelenmiş veritabanıyla aynı şekilde çalışmalıdır. Örneğin, her istek için bir anahtar sağlamanız gerekmez.

CMEK korumalı bir veritabanını geri yükleme

CMEK korumalı veritabanını bir yedekten geri yüklemeden önce:

  • Veritabanını CMEK şifrelemesine, Google'ın varsayılan şifrelemesine (CMEK olmayan) veya yedeklemeyle aynı şifrelemeye geri yüklemek isteyip istemediğinize karar verin.
  • Yedeği şifrelemek için kullandığınız anahtarı (birincil sürüm) ve anahtar sürümünü hazırlayın. Hem anahtarı hem de anahtar sürümünü etkinleştirin.

gcloud

CMEK korumalı bir veritabanını CMEK şifrelemesine geri yükleme

CMEK şifrelemesine geri yüklemek için isteğe bağlı encryption-type ve kms-key-name işaretleriyle gcloud firestore databases restore komutunu çalıştırarak geri yüklenen veritabanının şifreleme türünü yapılandırın. Şifreleme türünü belirtmezseniz geri yüklenen veritabanı, yedeklemeyle aynı şifreleme yapılandırmasını kullanır.

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

KMS_KEY_NAME ifadesini anahtara atadığınız adla değiştirin. Anahtar için aşağıdaki biçimde tam kaynak adını kullanın:

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

CMEK korumalı bir veritabanını varsayılan şifrelemeye geri yükleme

Google'ın varsayılan şifrelemesine (CMEK olmayan) geri yüklemek için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

CMEK korumalı bir veritabanını, yedeklemeyle aynı şifreleme türüne geri yükleme

Yedeklemeyle aynı şifreleme türüne geri yüklemek için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

Firebase CLI

CMEK korumalı bir veritabanını CMEK şifrelemesine geri yükleme

CMEK şifrelemesine geri yüklemek için isteğe bağlı encryption-type ve kms-key-name işaretini kullanın. Şifreleme türünü belirtmezseniz geri yüklenen veritabanı, yedeklemeyle aynı şifreleme yapılandırmasını kullanır.

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

Aşağıdakini değiştirin:

  • DATABASE_ID yerine veritabanınızın kimliğini yazın.
  • Cloud Firestore veritabanınız için kullanılacak proje ile FIRESTORE_PROJECT
  • FIRESTORE_LOCATION ifadesini Cloud Firestore veritabanınızın konumuyla değiştirin.
  • BACKUP_ID yerine yedeğinizin kimliğini yazın.
  • CMEK anahtarınızı içeren projeyle KMS_PROJECT
  • KMS_LOCATION yerine CMEK anahtarınızı ve anahtarlığınızı içeren konum
  • KMS_KEYRING_ID yerine CMEK anahtar halkanızın kimliğini girin.

Geri yüklenen Cloud Firestore veritabanınızın CMEK ile şifrelendiğini onaylayın:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

CMEK korumalı bir veritabanını varsayılan şifrelemeye geri yükleme

Google'ın varsayılan şifrelemesine (CMEK olmayan) geri yüklemek için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

Aşağıdakini değiştirin:

  • DATABASE_ID yerine veritabanınızın kimliğini yazın.
  • Cloud Firestore veritabanınız için kullanılacak proje ile FIRESTORE_PROJECT
  • FIRESTORE_LOCATION ifadesini Cloud Firestore veritabanınızın konumuyla değiştirin.
  • BACKUP_ID yerine yedeğinizin kimliğini yazın.

CMEK korumalı bir veritabanını, yedeklemeyle aynı şifreleme türüne geri yükleme

Yedeklemeyle aynı şifreleme türüne geri yüklemek için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

Aşağıdakini değiştirin:

  • DATABASE_ID yerine veritabanınızın kimliğini yazın.
  • Cloud Firestore veritabanınız için kullanılacak proje ile FIRESTORE_PROJECT
  • FIRESTORE_LOCATION ifadesini Cloud Firestore veritabanınızın konumuyla değiştirin.
  • BACKUP_ID yerine yedeğinizin kimliğini yazın.

CMEK korumalı bir veritabanını klonlama

CMEK korumalı bir veritabanını klonlamadan önce:

  • Veritabanını CMEK şifrelemesine, Google'ın varsayılan şifrelemesine (CMEK olmayan) veya kaynak veritabanıyla aynı şifrelemeye kopyalamak isteyip istemediğinize karar verin.
  • Kaynak veritabanını şifrelemek için kullandığınız anahtarı (birincil sürüm) ve anahtar sürümünü hazırlayın. Hem anahtarı hem de anahtar sürümünü etkinleştirin.

gcloud

CMEK korumalı bir veritabanını CMEK şifrelemesine klonlama

CMEK şifrelemesine klonlamak için klonlanan veritabanının şifreleme türünü yapılandırmak üzere isteğe bağlı encryption-type ve kms-key-name işaretleriyle gcloud firestore databases clone komutunu çalıştırın. Şifreleme türünü belirtmezseniz klonlanan veritabanı, kaynak veritabanıyla aynı şifreleme yapılandırmasını kullanır.

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

KMS_KEY_NAME ifadesini anahtara atadığınız adla değiştirin. Anahtar için aşağıdaki biçimde tam kaynak adını kullanın:

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

CMEK korumalı bir veritabanını varsayılan şifrelemeye kopyalama

Google'ın varsayılan şifrelemesine (CMEK olmayan) klonlamak için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

CMEK korumalı bir veritabanını kaynak veritabanıyla aynı şifreleme türüne kopyalama

Kaynak veritabanıyla aynı şifreleme türüne klonlamak için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

--encryption-type belirtilmediyse de varsayılan davranış budur.

Firebase CLI

CMEK korumalı bir veritabanını CMEK şifrelemesine klonlama

CMEK şifrelemesine klonlamak için isteğe bağlı encryption-type ve kms-key-name işaretleriyle firebase firestore:databases:clone komutunu çalıştırarak klonlanan veritabanının şifreleme türünü yapılandırın. Şifreleme türünü belirtmezseniz klonlanan veritabanı, kaynak veritabanıyla aynı şifreleme yapılandırmasını kullanır.

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

KMS_KEY_NAME ifadesini anahtara atadığınız adla değiştirin. Anahtar için aşağıdaki biçimde tam kaynak adını kullanın:

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

CMEK korumalı bir veritabanını varsayılan şifrelemeye kopyalama

Google'ın varsayılan şifrelemesine (CMEK olmayan) klonlamak için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

CMEK korumalı bir veritabanını kaynak veritabanıyla aynı şifreleme türüne kopyalama

Kaynak veritabanıyla aynı şifreleme türüne klonlamak için encryption-type işaretini aşağıdaki şekilde ayarlayın:

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

--encryption-type belirtilmediyse de varsayılan davranış budur.

Kullanımdaki anahtarı görüntüleme

gcloud

Veritabanı CMEK yapılandırmasını onaylamak için databases describe gcloud CLI komutunu kullanabilirsiniz:

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

Yanıttaki cmekConfig alanında aşağıdakine benzer CMEK bilgilerini göreceksiniz:

      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

Yanıtta aşağıdaki bilgiler yer alır:

  • kmsKeyName: CMEK korumalı veritabanınızı şifrelemek için kullanılan anahtarın tam kaynak adı.
  • activeKeyVersion: CMEK korumalı veritabanı tarafından şu anda kullanılan tüm anahtar sürümlerinin listesi. Anahtar rotasyonu sırasında birden fazla etkin anahtar sürümünüz olabilir. Anahtar rotasyonu sırasında hem eski anahtar sürümünün hem de yeni anahtar sürümünün kullanılabilir olması gerekir. Eski anahtar sürümünü, activeKeyVersion alanında görünmeyene kadar devre dışı bırakmayın.

REST API

HTTP isteği:

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

İstek gövdesinde, CMEK'yi cmek_config.kms_key_name alanında yapılandırın. Cloud KMS anahtarının tam kaynak kimliğine ayarlanır. Yalnızca bu veritabanıyla aynı konumda bulunan bir anahtara izin verilir.

Bu değer, şu biçimdeki Cloud KMS anahtarı kaynak kimliği olmalıdır: projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Diğer alanlar hakkında daha fazla bilgi için database create sayfasına bakın.

Örnek istek ve yanıt:

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

Anahtarı devre dışı bırakma

Bir veritabanıyla ilişkili anahtarı devre dışı bırakmak için aşağıdakileri yapın:

  1. Bir veritabanı için kullanılan anahtar sürümlerini görüntüleme
  2. Kullanımdaki bu anahtar sürümlerini devre dışı bırakın.
  3. Değişikliğin geçerlilik kazanmasını bekleyin ve verilere artık erişilemediğini kontrol edin. Değişiklikler genellikle birkaç dakika içinde geçerlilik kazansa da bu süre 3 saati bulabilir.

Veritabanı tarafından kullanılan bir anahtar devre dışı bırakıldığında, hata mesajında ek ayrıntılar içeren bir FAILED_PRECONDITION istisnası alırsınız. Örneğin:

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

Anahtarı etkinleştirme

Veritabanıyla ilişkili bir anahtarı yeniden etkinleştirmek için aşağıdaki adımları uygulayın:

  1. Bir veritabanı için kullanılan anahtar sürümlerini görüntüleme
  2. Kullanımdaki bu anahtar sürümlerini etkinleştirme
  3. Değişikliğin geçerlilik kazanmasını bekleyin ve verilere artık erişilemediğini kontrol edin. Değişiklikler genellikle birkaç dakika içinde geçerlilik kazansa da bu süre 3 saati bulabilir.

Cloud KMS anahtarı için denetleme günlüklerini görüntüleme

Cloud KMS Veri Erişimi denetleme günlüklerini etkinleştirmeden önce Cloud Denetleme Günlükleri hakkında bilgi sahibi olmanız gerekir.

Cloud KMS veri erişimi denetleme günlükleri, Cloud Firestore veya CMEK anahtarınızı kullanacak şekilde yapılandırılmış diğer ürünlerin Cloud KMS'ye ne zaman şifreleme/şifre çözme çağrıları yaptığını gösterir. Cloud Firestore, her veri isteğinde şifreleme/şifre çözme çağrısı yapmaz. Bunun yerine, anahtarı düzenli olarak kontrol eden bir yoklayıcı kullanır. Anket sonuçları denetleme günlüklerinde görünür.

Google Cloud Console'da denetleme günlüklerini ayarlayabilir ve bunlarla etkileşim kurabilirsiniz:

  1. Projenizdeki Cloud KMS API için günlük kaydının etkinleştirildiğinden emin olun.

  2. Google Cloud Console'da Cloud Logging sayfasına gidin.

    Cloud Logging sitesine gidin

  3. Sorgu Oluşturucu'ya aşağıdaki satırları ekleyerek günlük girişlerini Cloud KMS anahtarınızla sınırlayın:

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

    Aşağıdakini değiştirin:

    • KMS_KEY, CMEK anahtarının adıyla değiştirilir.
    • KMS_KEYRING yerine anahtarı içeren KMS anahtarlığını yazın.
    • KMS_LOCATION, anahtarın ve anahtarlığın konumuyla değiştirilir.

    Günlükte, veritabanı başına yaklaşık her beş dakikada bir birkaç günlük girişi gösterilir. Günlük girişleri aşağıdaki örneklere benzer:

    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"
    

Denetleme günlüklerini yorumlama hakkında ayrıntılı bilgi için Denetleme günlüklerini anlama başlıklı makaleyi inceleyin.

CMEK kuruluş politikası yapılandırma

Kuruluşunuzdaki Cloud Firestore veritabanları için şifreleme uygunluk şartlarını belirtmek üzere CMEK kuruluş politikası kısıtlaması kullanın.

CMEK korumasını zorunlu kılma

Cloud Firestore veritabanı oluşturma işlemi için CMEK gerektirecek şekilde constraints/gcp.restrictNonCmekServices hizmetini yapılandırın. Kısıtlamayı deny olarak ayarlayın ve reddetme listesine firestore.googleapis.com ekleyin. Örneğin:

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

FIRESTORE_PROJECT yerine kısıtlanacak projeyi yazın.

Kuruluş politikalarını yapılandırma hakkında daha fazla bilgi edinmek için Politika oluşturma ve düzenleme başlıklı makaleyi inceleyin.

Politika yürürlüğe girdikten sonra, etkilenen proje altında CMEK olmayan bir veritabanı oluşturmaya çalışırsanız FAILED_PRECONDITION istisnası ve hata mesajı alırsınız. Örneğin, bir istisna şu şekilde görünür:

{
  "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 için anahtar kullanımını sınırlama

CMEK koruması için hangi Cloud KMS anahtarlarının kullanılacağını sınırlamak istiyorsanız constraints/gcp.restrictCmekCryptoKeyProjects kısıtlamasını yapılandırın.

Liste kısıtlaması olarak kabul edilen değerler, kaynak hiyerarşisi göstergeleridir (ör. projects/PROJECT_ID, under:folders/FOLDER_ID ve under:organizations/ORGANIZATION_ID). Bu kısıtlamayı kullanmak için kaynak hiyerarşisi göstergelerinin listesini yapılandırın ve kısıtlamayı İzin ver olarak ayarlayın. Bu yapılandırma, desteklenen hizmetleri kısıtlar. Böylece CMEK anahtarları yalnızca listelenen projeler, klasörler ve kuruluşlardan seçilebilir. Yapılandırılmış hizmetlerde CMEK korumalı kaynaklar oluşturma istekleri, izin verilen kaynaklardan birinin Cloud Firestore anahtarı olmadan başarılı olmaz.

Aşağıdaki örnekte, belirtilen projede CMEK korumalı veritabanları için yalnızca ALLOWED_KEY_PROJECT_ID anahtarlarına izin verilmektedir:

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

Politika yürürlüğe girdikten sonra kısıtlamayı ihlal ederseniz FAILED_PRECONDITION istisnası ve hata mesajı alırsınız. İstisna aşağıdaki gibi görünür:

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

Sırada ne var?