Auf dieser Seite wird beschrieben, wie Sie vom Kunden verwaltete Verschlüsselungsschlüssel (CMEKs) für Spanner.
Weitere Informationen zu CMEK finden Sie unter Vom Kunden verwaltete Verschlüsselungsschlüssel (CMEK):
CMEK-fähige Datenbank erstellen
Erstellen Sie einen Schlüssel im Cloud Key Management Service (Cloud KMS). Spanner unterstützt:
Der Schlüssel muss sich am selben Speicherort wie die Spanner-Instanz befinden. Lautet die Konfiguration Ihrer Spanner-Instanz beispielsweise
us-west1
, muss der Speicherort des Schlüsselbunds ebenfallsus-west1
sein.Nicht jeder Spanner Multiregionale Instanzkonfiguration hat eine entsprechende Schlüsselbund-Position in Cloud KMS Sie können keine CMEK-fähigen Datenbanken erstellen in diesen Spanner-Instanzen.
Wenn Sie bereits einen Cloud KMS-Schlüssel am richtigen Speicherort haben, können Sie diesen Schritt überspringen.
Weitere Informationen finden Sie in den folgenden Ressourcen:
Gewähren Sie Spanner Zugriff auf den Schlüssel.
Erstellen und zeigen Sie den Dienst-Agent in Cloud Shell an oder rufen Sie ihn auf Wenn das Konto bereits vorhanden ist:
gcloud beta services identity create --service=spanner.googleapis.com \ --project=my_spanner_project
Wenn Sie aufgefordert werden, die Komponente gcloud Beta Commands zu installieren, geben Sie
Y
ein. Nach der Installation wird der Befehl automatisch neu gestartet.Die gcloud services Identity -Befehl erstellt oder ruft den Dienst-Agent, der Spanner kann für den Zugriff auf den Cloud KMS-Schlüssel auf Ihrem
Die Dienstkonto-ID ist wie eine E-Mail-Adresse formatiert:
Service identity created: service-xxx@gcp-sa-spanner.iam.gserviceaccount.com
Dienst die Rolle
cloudkms.cryptoKeyEncrypterDecrypter
zuweisen Konto:gcloud kms keys add-iam-policy-binding my_kms_key \ --location my_kms_key_location \ --keyring my_kms_key_ring \ --project=my_kms_project \ --member serviceAccount:service-xxx@gcp-sa-spanner.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
Sie sehen dann Folgendes:
Updated IAM policy for key [my-kms-key]
Mit dieser Rolle wird sichergestellt, dass das Dienstkonto die Berechtigung hat, mit dem Cloud KMS-Schlüssel entschlüsseln Weitere Informationen finden Sie unter Cloud KMS-Berechtigungen und -Rollen
Erstellen Sie die Datenbank und geben Sie Ihren Cloud KMS-Schlüssel an.
Console
1. Rufen Sie in der Google Cloud Console die Seite Spanner-Instanzen auf.
2. Klicken Sie auf den Namen der Instanz, in der die Datenbank erstellt werden soll.
3. Klicken Sie auf Datenbank erstellen und füllen Sie die Pflichtfelder aus.
4. Klicken Sie auf Verschlüsselungsoptionen anzeigen.
5. Wählen Sie Vom Kunden verwalteten Verschlüsselungsschlüssel (CMEK) verwenden aus.
6. Wählen Sie Ihren Schlüssel aus der Drop-down-Liste aus.
Die Liste der Schlüssel ist auf das aktuelle Google Cloud-Projekt beschränkt. Wenn Sie einen Schlüssel aus einem anderen Google Cloud-Projekt verwenden möchten, erstellen Sie den mit gcloud anstelle der Google Cloud Console.
Sobald die Datenbank erstellt ist, können Sie prüfen, ob sie Für CMEK aktiviert. Rufen Sie dazu die Seite Datenbankdetails auf.
gcloud
gcloud spanner databases create example_db \ --project=my_spanner_project \ --instance=my_spanner_instance \ --ddl="CREATE TABLE Users (Id INT64 NOT NULL, FirstName STRING(100) NOT NULL, LastName STRING(100) NOT NULL,) PRIMARY KEY (Id)" \ --kms-project=my_kms_project \ --kms-location=my_kms_key_location \ --kms-keyring=my_kms_key_ring \ --kms-key=my_kms_key
So prüfen Sie, ob eine Datenbank CMEK-fähig ist:
gcloud spanner databases describe example_db \ --project=my_spanner_project \ --instance=my_spanner_instance
CMEK-fähige Datenbanken enthalten ein Feld für
encryptionConfig
, wie in diesem Beispiel gezeigt:encryptionConfig: kmsKeyName:projects/my-kms-project/locations/eur5/keyRings/my-kms-key-ring/cryptoKeys/my-kms-key name: projects/my-spanner-project/instances/my-instance/databases/my-db state: READY
C#
using Google.Cloud.Spanner.Admin.Database.V1; using Google.Cloud.Spanner.Common.V1; using System; using System.Threading.Tasks; public class CreateDatabaseWithEncryptionKeyAsyncSample { public async Task<Database> CreateDatabaseWithEncryptionKeyAsync(string projectId, string instanceId, string databaseId, CryptoKeyName kmsKeyName) { // Create a DatabaseAdminClient instance that can be used to execute a // CreateDatabaseRequest with custom encryption configuration options. DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.Create(); // Define create table statement for table #1. var createSingersTable = @"CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), ComposerInfo BYTES(MAX) ) PRIMARY KEY (SingerId)"; // Define create table statement for table #2. var createAlbumsTable = @"CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE"; // Create the CreateDatabase request with encryption configuration and execute it. var request = new CreateDatabaseRequest { ParentAsInstanceName = InstanceName.FromProjectInstance(projectId, instanceId), CreateStatement = $"CREATE DATABASE `{databaseId}`", ExtraStatements = { createSingersTable, createAlbumsTable }, EncryptionConfig = new EncryptionConfig { KmsKeyNameAsCryptoKeyName = kmsKeyName, }, }; var operation = await databaseAdminClient.CreateDatabaseAsync(request); // Wait until the operation has finished. Console.WriteLine("Waiting for the operation to finish."); var completedResponse = await operation.PollUntilCompletedAsync(); if (completedResponse.IsFaulted) { Console.WriteLine($"Error while creating database: {completedResponse.Exception}"); throw completedResponse.Exception; } var database = completedResponse.Result; Console.WriteLine($"Database {database.Name} created with encryption key {database.EncryptionConfig.KmsKeyName}"); return database; } }
C++
Go
Java
Node.js
PHP
Python
Ruby
# project_id = "Your Google Cloud project ID" # instance_id = "Your Spanner instance ID" # database_id = "Your Spanner database ID" # kms_key_name = "Database eencryption KMS key" require "google/cloud/spanner" spanner = Google::Cloud::Spanner.new project: project_id instance = spanner.instance instance_id job = instance.create_database database_id, statements: [ "CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX) ) PRIMARY KEY (SingerId)", "CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE" ], encryption_config: { kms_key_name: kms_key_name } puts "Waiting for create database operation to complete" job.wait_until_done! database = job.database puts "Database #{database.database_id} created with encryption key #{database.encryption_config.kms_key_name}"
Verwendete Schlüsselversionen aufrufen
Informationen zu Schlüsselversionen stammen aus dem Feld encryption_info
der Datenbank.
Wenn sich die Schlüsselversion einer Datenbank ändert, wird die Änderung nicht sofort übernommen
an encryption_info
. Es kann etwas dauern, bis die Änderung in den
das Info-Feld.
Console
Verschlüsselungsinformationen werden auf der Seite Datenbankdetails angezeigt.
gcloud
Rufen Sie die encryption_info
einer Datenbank durch folgenden Aufruf ab:
databases describe
oder
databases list
Beispiel:
gcloud spanner databases describe example_db \
--project=my_spanner_project \
--instance=my_spanner_instance
Hier ist die Ausgabe:
name: projects/my-project/instances/test-instance/databases/example-db
encryptionConfig:
kmsKeyName: projects/google.com:cloud-spanner-demo/locations/us-central1/keyRings/cmek_demo/cryptoKeys/backup-key
encryptionInfo:
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
Schlüssel deaktivieren
Deaktivieren Sie die verwendete(n) Schlüsselversion(en) so: dieser Anleitung für die jeweilige Schlüsselversion.
Warten Sie, bis die Änderung wirksam wird. Das Deaktivieren eines Schlüssels kann bis zu 3 Stunden wirksam werden.
Prüfen Sie, ob die Daten nicht mehr zugänglich sind:
gcloud spanner databases execute-sql example_db \ --project=my_spanner_project \ --instance=my_spanner_instance \ --sql='SELECT * FROM Users'
Sie sehen die folgende Fehlermeldung:
KMS key required by the Spanner resource is not accessible.
Schlüssel aktivieren
Aktivieren Sie die von der Datenbank verwendeten Schlüsselversionen, indem Sie dieser Anleitung für die einzelnen Tasten folgen. Version.
Warten Sie, bis die Änderung wirksam wird. Das Aktivieren eines Schlüssels kann bis zu 3 Stunden dauern weitergegeben werden soll.
Prüfen Sie, ob die Daten zugänglich sind:
gcloud spanner databases execute-sql example_db \ --project=my_spanner_project \ --instance=my_spanner_instance \ --sql='SELECT * FROM Users'
Wenn die Änderung wirksam ist, wird der Befehl erfolgreich ausgeführt.
Datenbank sichern
Standardmäßig verwenden Sicherungen, die aus einer Datenbank erstellt wurden, die gleichen Verschlüsselungskonfiguration wie die Datenbank selbst. Optional können Sie einen anderen Verschlüsselungskonfiguration für eine Sicherung.
So erstellen Sie eine Sicherung:
Console
Rufen Sie in der Google Cloud Console die Seite Datenbankdetails auf.
Klicken Sie auf dem Tab Sicherung/Wiederherstellung auf Erstellen.
Geben Sie einen Namen für die Sicherung ein und wählen Sie ein Ablaufdatum aus.
Wählen Sie Vom Kunden verwalteten Verschlüsselungsschlüssel (CMEK) verwenden und einen Schlüssel aus. in der Drop-down-Liste aus.
Klicken Sie auf Erstellen.
Die Tabelle Sicherungen enthält Verschlüsselungsinformationen für jede Sicherung.
gcloud
gcloud spanner backups create my_backup \
--project=my_spanner_project \
--instance=my_spanner_instance \
--database=example_db \
--retention-period=1y \
--encryption-type=customer_managed_encryption \
--kms-project=my_kms_project \
--kms-location=my_kms_key_location \
--kms-keyring=my_kms_key_ring \
--kms-key=my_kms_key
--async
So prüfen Sie, ob die erstellte Sicherung mit CMEK verschlüsselt ist:
gcloud spanner backups describe my_backup \
--project=my_spanner_project \
--instance=my_spanner_instance
C#
using Google.Cloud.Spanner.Admin.Database.V1;
using Google.Cloud.Spanner.Common.V1;
using Google.Protobuf.WellKnownTypes;
using System;
using System.Threading.Tasks;
public class CreateBackupWithEncryptionKeyAsyncSample
{
public async Task<Backup> CreateBackupWithEncryptionKeyAsync(string projectId, string instanceId, string databaseId, string backupId, CryptoKeyName kmsKeyName)
{
// Create a DatabaseAdminClient instance.
DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.Create();
// Create the CreateBackupRequest with encryption configuration.
CreateBackupRequest request = new CreateBackupRequest
{
ParentAsInstanceName = InstanceName.FromProjectInstance(projectId, instanceId),
BackupId = backupId,
Backup = new Backup
{
DatabaseAsDatabaseName = DatabaseName.FromProjectInstanceDatabase(projectId, instanceId, databaseId),
ExpireTime = DateTime.UtcNow.AddDays(14).ToTimestamp(),
},
EncryptionConfig = new CreateBackupEncryptionConfig
{
EncryptionType = CreateBackupEncryptionConfig.Types.EncryptionType.CustomerManagedEncryption,
KmsKeyNameAsCryptoKeyName = kmsKeyName,
},
};
// Execute the CreateBackup request.
var operation = await databaseAdminClient.CreateBackupAsync(request);
Console.WriteLine("Waiting for the operation to finish.");
// Poll until the returned long-running operation is complete.
var completedResponse = await operation.PollUntilCompletedAsync();
if (completedResponse.IsFaulted)
{
Console.WriteLine($"Error while creating backup: {completedResponse.Exception}");
throw completedResponse.Exception;
}
var backup = completedResponse.Result;
Console.WriteLine($"Backup {backup.Name} of size {backup.SizeBytes} bytes " +
$"was created at {backup.CreateTime} " +
$"using encryption key {kmsKeyName}");
return backup;
}
}
C++
Go
Java
<ph type="x-smartling-placeholder">
Node.js
<ph type="x-smartling-placeholder">
PHP
<ph type="x-smartling-placeholder">
Python
<ph type="x-smartling-placeholder">
Ruby
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
# database_id = "Your Spanner database ID"
# backup_id = "Your Spanner backup ID"
# kms_key_name = "Your backup encryption database KMS key"
require "google/cloud/spanner"
spanner = Google::Cloud::Spanner.new project: project_id
client = spanner.client instance_id, database_id
instance = spanner.instance instance_id
database = instance.database database_id
expire_time = Time.now + 14 * 24 * 3600 # 14 days from now
encryption_config = {
encryption_type: :CUSTOMER_MANAGED_ENCRYPTION,
kms_key_name: kms_key_name
}
job = database.create_backup backup_id, expire_time, version_time: version_time, encryption_config: encryption_config
puts "Backup operation in progress"
job.wait_until_done!
backup = instance.backup backup_id
puts "Backup #{backup.backup_id} of size #{backup.size_in_bytes} bytes was created at #{backup.create_time} using encryption key #{kms_key_name}"
Aus einer Sicherung wiederherstellen
Standardmäßig verwenden Datenbanken, die aus einer Sicherung wiederhergestellt werden, die gleichen Verschlüsselungskonfiguration als Sicherung selbst. Sie können dieses Verhalten jedoch überschreiben, indem Sie eine andere Verschlüsselungskonfiguration für die wiederhergestellte Datenbank angeben. Wenn die Sicherung durch einen CMEK geschützt ist, muss die zum Erstellen der Sicherung verwendete Schlüsselversion verfügbar sein, damit sie entschlüsselt werden kann.
So stellen Sie eine Datenbank wieder her:
Console
Rufen Sie in der Cloud Console die Seite Instanzdetails auf.
Wählen Sie auf dem Tab Sicherung/Wiederherstellung eine Sicherung aus und klicken Sie auf Wiederherstellen.
Wählen Sie die wiederherzustellende Instanz aus und benennen Sie die wiederhergestellte Datenbank.
Wenn Sie einen CMEK mit der wiederhergestellten Datenbank verwenden möchten, wählen Sie Verwenden Sie einen vom Kunden verwalteten Verschlüsselungsschlüssel (CMEK) und wählen Sie einen Schlüssel aus in der Drop-down-Liste.
gcloud
gcloud spanner databases restore --async \
--project=my_spanner_project \
--destination-instance=destination_instance \
--destination-database=example_db_restored \
--source-instance=my_spanner_instance \
--source-backup=my_backup
Prüfen Sie, ob die wiederhergestellte Datenbank CMEK-verschlüsselt ist:
gcloud spanner databases describe example_db_restored \
--project=my_spanner_project \
--instance=destination_instance
Weitere Informationen finden Sie unter Datenbank aus einer Sicherung wiederherstellen.
C#
using Google.Cloud.Spanner.Admin.Database.V1;
using Google.Cloud.Spanner.Common.V1;
using System;
using System.Threading.Tasks;
public class RestoreDatabaseWithEncryptionAsyncSample
{
public async Task<Database> RestoreDatabaseWithEncryptionAsync(string projectId, string instanceId, string databaseId, string backupId, CryptoKeyName kmsKeyName)
{
// Create a DatabaseAdminClient instance.
DatabaseAdminClient databaseAdminClient = DatabaseAdminClient.Create();
// Create the RestoreDatabaseRequest with encryption configuration.
RestoreDatabaseRequest request = new RestoreDatabaseRequest
{
ParentAsInstanceName = InstanceName.FromProjectInstance(projectId, instanceId),
DatabaseId = databaseId,
BackupAsBackupName = BackupName.FromProjectInstanceBackup(projectId, instanceId, backupId),
EncryptionConfig = new RestoreDatabaseEncryptionConfig
{
EncryptionType = RestoreDatabaseEncryptionConfig.Types.EncryptionType.CustomerManagedEncryption,
KmsKeyNameAsCryptoKeyName = kmsKeyName,
}
};
// Execute the RestoreDatabase request.
var operation = await databaseAdminClient.RestoreDatabaseAsync(request);
Console.WriteLine("Waiting for the operation to finish.");
// Poll until the returned long-running operation is complete.
var completedResponse = await operation.PollUntilCompletedAsync();
if (completedResponse.IsFaulted)
{
Console.WriteLine($"Error while restoring database: {completedResponse.Exception}");
throw completedResponse.Exception;
}
var database = completedResponse.Result;
var restoreInfo = database.RestoreInfo;
Console.WriteLine($"Database {restoreInfo.BackupInfo.SourceDatabase} " +
$"restored to {database.Name} " +
$"from backup {restoreInfo.BackupInfo.Backup} " +
$"using encryption key {database.EncryptionConfig.KmsKeyName}");
return database;
}
}
C++
Go
Java
<ph type="x-smartling-placeholder">
Node.js
<ph type="x-smartling-placeholder">
PHP
<ph type="x-smartling-placeholder">
Python
<ph type="x-smartling-placeholder">
Ruby
# project_id = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"
# database_id = "Your Spanner database ID of where to restore"
# backup_id = "Your Spanner backup ID"
# kms_key_name = "Your backup encryption database KMS key"
require "google/cloud/spanner"
spanner = Google::Cloud::Spanner.new project: project_id
instance = spanner.instance instance_id
backup = instance.backup backup_id
encryption_config = {
encryption_type: :CUSTOMER_MANAGED_ENCRYPTION,
kms_key_name: kms_key_name
}
job = backup.restore database_id, encryption_config: encryption_config
puts "Waiting for restore backup operation to complete"
job.wait_until_done!
database = job.database
restore_info = database.restore_info
puts "Database #{restore_info.backup_info.source_database_id} was restored to #{database.database_id} from backup #{restore_info.backup_info.backup_id} using encryption key #{database.encryption_config.kms_key_name}"
Audit-Logs für den Cloud KMS-Schlüssel ansehen
Stellen Sie sicher, dass Logging ist aktiviert für die Cloud KMS API in Ihrem Projekt.
Rufen Sie in der Cloud Console den Log-Explorer auf.
Begrenzen Sie die Logeinträge auf Ihren Cloud KMS-Schlüssel, indem Sie Folgendes hinzufügen: zu Query Builder hinzufügen:
resource.type="cloudkms_cryptokey" resource.labels.location="my_kms_key_location" resource.labels.key_ring_id="my_kms_key_ring" resource.labels.crypto_key_id="my_kms_key"
Im normalen Betrieb werden Verschlüsselungs- und Entschlüsselungsaktionen mit
INFO
protokolliert. Schweregrad. Diese Einträge werden als Zonen in Ihrem Spanner protokolliert Instanz den Cloud KMS-Schlüssel etwa alle 5 Minuten abfragt.Wenn Spanner nicht auf den Schlüssel zugreifen kann, werden die Vorgänge als protokolliert
ERROR