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ıyla (CMEK) ilgili görevlerin nasıl gerçekleştirileceği açıklanmaktadır. 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 ile korunan bir Cloud Firestore veritabanı oluşturmadan önce aşağıdaki adımları tamamlamanız gerekir:

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

CMEK korumalı Cloud Firestore veritabanları içerecek her proje için bu adımları tamamlayın. 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 temsilcisi oluşturmadan önce bu formu doldurarak CMEK özelliğine erişim isteğinde bulunun.

Cloud Firestore hizmet temsilcisi oluşturma

CMEK anahtarı oluşturmadan önce, Cloud Firestoreanahtara erişmek için kullandığı bir tür Google yönetilen hizmet hesabı olan hizmet aracınız olmalıdır.Cloud Firestore

Cloud Firestore'nin 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, henüz mevcut değilse hizmet hesabını oluşturur ve ardından gösterir.

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 gibi biçimlendirilmiş olan hizmet temsilcisi kimliğini gösterir. Çıkıştaki e-posta dizesini kaydedin. Bu dizeyi sonraki bir adımda 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ıma sunduğunuz 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 anahtar zinciri, anahtar ve veritabanı için aynı konum adını kullanın. Çünkü konum adları bire bir eşlenir.

    Örneğin, us-west1 içinde CMEK ile korunan bir veritabanı oluşturmak istiyorsanız us-west1 içinde bir anahtar çantası ve anahtar oluşturun.

  • Çoklu bölge veritabanı konumları için KMS çoklu bölge 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 tamamlayın:

  1. Cloud KMS API'yi etkinleştirin.

  2. Aşağıdaki seçeneklerden birini kullanarak bir 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ğıdakileri yapın. Daha düşük ayrıntı düzeyi istiyorsanız anahtar veya anahtar zinciri 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çimli kimliğini girin.

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

  5. Kaydet'i tıklayın.

gcloud

Hizmet temsilcinize 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:

  • Anahtara atadığınız adla KMS_KEY
  • KMS_KEYRING ile anahtarı içeren KMS anahtarlığı
  • KMS_LOCATION anahtarlığı içeren bölge
  • SERVICE_AGENT_EMAIL, erişim izni verdiğiniz müşteri temsilcisinin e-posta biçimli tanımlayıcısıyla
  • KMS_PROJECT anahtarı içeren projeyle

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 ile korunan bir veritabanı oluşturabilirsiniz. Google varsayılan şifrelemesiyle korunan mevcut Cloud Firestore veritabanları CMEK'yi kullanacak şekilde dönüştürülemez.

Yalnızca CMEK özellikli bir veritabanı oluştururken şifreleme türü ve anahtar 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ı yapılandırın sayfasında bir veritabanı kimliği girin.

  5. Bir yer seçin.

  6. Şifreleme Seçenekleri'ni Göster'i tıklayın ve ardından 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, geçerli Google Cloud projesi ve seçtiğiniz veritabanı konumuyla sınırlıdır. Farklı bir Google Cloud projesindeki bir anahtarı kullanmak için Proje Değiştir veya Anahtarı Manuel Olarak Gir'i tıklayın.

  9. Cloud Firestore hizmet hesabına anahtar izni vermeniz istenirse 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ını seçin.

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

Veri tabanı oluşturulduktan sonra Veritabanı ayrıntıları'nı görüntüleyerek veritabanının CMEK'yi etkinleştirdiğini doğrulayabilirsiniz:

  • Veritabanınıza CMEK uygulanmışsa Şifreleme türü alanı Müşteri tarafından yönetilen olarak gösterilir ve Şifreleme anahtarı alanında ilgili Cloud KMS ile bu veritabanını korumak için kullanılan anahtar sürümü listelenir.
  • Veritabanınıza CMEK uygulanmamışsa Ş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 son sürümü yükleyin ve gcloud CLI'ı 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 Cloud Firestore konumlu FIRESTORE_DATABASE_LOCATION
  • Veritabanı kimliği içeren DATABASE_ID
  • KMS_KEY_NAME anahtara atadığınız adla. 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

  • FIRESTORE_PROJECT veritabanınız için kullanacağınız projeyleCloud Firestore

REST API

HTTP isteği:

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

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

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

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

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

Ö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 veritabanınızın konumunu içeren
  • KMS_PROJECT ile CMEK anahtarınızı içeren proje
  • KMS_LOCATION ile CMEK anahtarınızı ve anahtarlığınızı içeren konum
  • KMS_KEYRING_ID ile CMEK anahtar zincirinizin kimliği
  • FIRESTORE_PROJECT veritabanınız için kullanacağınız projeyleCloud Firestore

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österilir:

  • KMS Anahtarı Adı alanı, Cloud Firestore CMEK veritabanınızı şifrelemek için kullanılan tam anahtar kaynağı adını sağlar.
  • Etkin Anahtar Sürümleri alanı, bu CMEK veritabanı tarafından şu anda 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 konusuna bakın.

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:

  • FIRESTORE_PROJECT veritabanınız için kullanacağınız projeyleCloud Firestore
  • Veritabanı kimliği içeren DATABASE_ID
  • Veritabanı için Cloud Firestore konumlu FIRESTORE_DATABASE_LOCATION
  • DATABASE_TYPE ile Yerel mod için FIRESTORE_NATIVE veya Datastore modu için DATASTORE_MODE.
  • KMS_KEY_NAME anahtara atadığınız adla. 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 ile korunan bir veritabanına erişme

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

CMEK ile korunan bir veritabanını geri yükleme

CMEK ile korunan veritabanını yedekten geri yüklemeden önce:

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

gcloud

CMEK ile korunan bir veritabanını CMEK şifrelemesiyle geri yükleme

CMEK şifrelemesiyle geri yükleme yapmak için gcloud firestore databases restore komutunu isteğe bağlı encryption-type ve kms-key-name işaretleriyle çalıştırın. Böylece, geri yüklenen veritabanının şifreleme türünü yapılandırabilirsiniz. Ş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 yerine anahtara atadığınız adı yazın. 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 ile korunan 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 ile korunan bir veritabanını yedekle aynı şifreleme türüne geri yükleme

Yedekle 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 ile korunan bir veritabanını CMEK şifrelemesiyle geri yükleme

CMEK şifrelemesine geri dönmek 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ı, yedekle 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.
  • FIRESTORE_PROJECT veritabanınız için kullanacağınız projeyleCloud Firestore
  • FIRESTORE_LOCATION veritabanınızın konumunu içeren Cloud Firestore
  • BACKUP_ID ile yedeğinizin kimliğini
  • KMS_PROJECT ile CMEK anahtarınızı içeren proje
  • KMS_LOCATION ile CMEK anahtarınızı ve anahtarlığınızı içeren konum
  • KMS_KEYRING_ID ile CMEK anahtar zincirinizin kimliğini girin.

Geri yüklenen Cloud Firestore veritabanınızın CMEK ile şifrelenmiş olduğunu onaylayın:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

CMEK ile korunan 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.
  • FIRESTORE_PROJECT veritabanınız için kullanacağınız projeyleCloud Firestore
  • FIRESTORE_LOCATION veritabanınızın konumunu içeren Cloud Firestore
  • BACKUP_ID ile yedeğinizin kimliğini

CMEK ile korunan bir veritabanını yedekle aynı şifreleme türüne geri yükleme

Yedekle 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.
  • FIRESTORE_PROJECT veritabanınız için kullanacağınız projeyleCloud Firestore
  • FIRESTORE_LOCATION veritabanınızın konumunu içeren Cloud Firestore
  • BACKUP_ID ile yedeğinizin kimliğini

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örürsünüz:

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ıt aşağıdaki bilgileri içerir:

  • kmsKeyName: CMEK korumalı veritabanınızı şifrelemek için kullanılan anahtarın tam anahtar kaynağı 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ü, activeKeyVersion alanında görünmeyi bırakana kadar devre dışı bırakılmamalıdır.

REST API

HTTP isteği:

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

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

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

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 bir anahtarı devre dışı bırakmak için aşağıdakileri tamamlayın:

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

Bir 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

Bir veritabanıyla ilişkili bir anahtarı yeniden etkinleştirmek için aşağıdakileri tamamlayın:

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

Cloud KMS anahtarının 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 denetim günlükleri, Cloud Firestore veya CMK anahtarınızı kullanmak üzere yapılandırılan diğer ürünlerin Cloud KMS'ye şifreleme/şifre çözme çağrıları yaptığı durumları gösterir. Cloud Firestore her veri isteği için şifreleme/şifre çözme çağrısı göndermez. Bunun yerine, anahtarı düzenli olarak kontrol eden bir toplayıcı kullanır. Anket sonuçları denetleme günlüklerinde görünür.

Denetleme günlüklerini Google Cloud Console'da ayarlayabilir ve bu günlüklerle 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 bölümüne gidin.

    Cloud Logging adresine 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:

    • CMEK anahtarının adının yer aldığı KMS_KEY
    • KMS_KEYRING ile anahtarı içeren KMS anahtarlığı
    • KMS_LOCATION anahtar ve anahtarlığın konumu

    Günlükte, veritabanı başına yaklaşık 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 Firestoreveritabanları için şifreleme uygunluk şartlarını belirtmek üzere CMEK kuruluş politikası kısıtlaması kullanın.

CMEK koruması zorunluluğu

constraints/gcp.restrictNonCmekServices veritabanı oluşturma işlemi için CMEK'yi zorunlu kılacak şekilde Cloud Firestore yapılandırın. Kısıtlamayı deny olarak ayarlayın ve firestore.googleapis.com değerini reddetme listesine 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, istisnalar ş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 üzere 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). Kaynak hiyerarşisi göstergelerinin listesini yapılandırıp kısıtlamayı İzin ver olarak ayarlayarak bu kısıtlamayı kullanın. Bu yapılandırma, desteklenen hizmetleri kısıtlayarak CMEK anahtarlarının yalnızca listelenen projeler, klasörler ve kuruluşlardan seçilmesini sağlar. Yapılandırılmış hizmetlerde CMEK korumalı kaynak oluşturma istekleri, izin verilen kaynaklardan birinde Cloud Firestore anahtarı olmadan başarılı olmaz.

Aşağıdaki örnekte, belirtilen projedeki CMEK korumalı veritabanları için yalnızca ALLOWED_KEY_PROJECT_ID içindeki anahtarlara izin verilir:

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 bir FAILED_PRECONDITION istisnası ve hata mesajı alırsınız. İstisnalar 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?