Migration des Amazon S3 S3-Verschlüsselungsclients (V2 auf V3) - AWS SDK für C++

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Migration des Amazon S3 S3-Verschlüsselungsclients (V2 auf V3)

Anmerkung

Wenn Sie Version 1 des Amazon S3 S3-Verschlüsselungsclients verwenden, müssen Sie zuerst zu V2 migrieren, bevor Sie zu V3 migrieren. Siehe Migration des Amazon S3 S3-Verschlüsselungsclients (V1 auf V2).

In diesem Thema erfahren Sie, wie Sie Ihre Anwendungen von Version 2 (V2) auf Version 3 (V3) des Amazon Simple Storage Service (Amazon S3) -Verschlüsselungsclients migrieren und die Anwendungsverfügbarkeit während des gesamten Migrationsprozesses sicherstellen. In Version 3 werden der ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus und die Commitment-Richtlinien eingeführt, um die Sicherheit zu erhöhen, indem sie vor der Manipulation von Datenschlüsseln in den Befehlsdateien schützen.

Überblick über die Migration

Diese Migration erfolgt in zwei Phasen:

1. Aktualisieren Sie bestehende Clients, damit sie neue Formate lesen können. Stellen Sie zunächst eine aktualisierte Version von AWS SDK für C++ für Ihre Anwendung bereit. Dadurch können bestehende V2-Verschlüsselungsclients Objekte entschlüsseln, die von den neuen V3-Clients geschrieben wurden. Wenn Ihre Anwendung mehrere verwendet AWS SDKs, müssen Sie jedes SDK separat aktualisieren.

2. Migrieren Sie Verschlüsselungs- und Entschlüsselungsclients auf V3. Sobald alle Ihre V2-Verschlüsselungsclients neue Formate lesen können, können Sie Ihre vorhandenen Verschlüsselungs- und Entschlüsselungsclients auf ihre jeweiligen V3-Versionen migrieren.

V3-Konzepte verstehen

Version 3 des Amazon S3 S3-Verschlüsselungsclients bietet neue Sicherheitsfunktionen, die den Schutz vor Manipulation von Datenschlüsseln verbessern. Das Verständnis dieser Konzepte ist für eine erfolgreiche Migration unerlässlich.

Politik des Engagements

Commitment-Richtlinien steuern, wie der Verschlüsselungsclient bei Verschlüsselungs- und Entschlüsselungsvorgängen mit der Schlüsselzusage umgeht. V3 bietet drei Richtlinienoptionen zur Unterstützung verschiedener Migrationsszenarien und Sicherheitsanforderungen:

FORBID_ENCRYPT_ALLOW_DECRYPT

Verschlüsselungsverhalten: Verschlüsselt Objekte ohne Schlüsselbindung und verwendet dieselben Algorithmen wie V2.

Entschlüsselungsverhalten: Ermöglicht die Entschlüsselung von Objekten, die mit und ohne Schlüsselbindung verschlüsselt wurden.

Auswirkungen auf die Sicherheit: Diese Richtlinie erzwingt keine Schlüsselbindung und ermöglicht möglicherweise die Manipulation des verschlüsselten Datenschlüssels in den Befehlsdateien. Verwenden Sie diese Richtlinie nur in der ersten Migrationsphase, wenn Sie V2-Clients benötigen, um neu verschlüsselte Objekte zu lesen.

Versionskompatibilität: Mit dieser Richtlinie verschlüsselte Objekte können von allen V2- und V3-Implementierungen gelesen werden.

REQUIRE_ENCRYPT_ALLOW_DECRYPT (Standard)

Verschlüsselungsverhalten: Verschlüsselt Objekte mit Schlüsselzusage mithilfe des ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus.

Entschlüsselungsverhalten: Ermöglicht die Entschlüsselung sowohl von Objekten, die mit Key Commitment verschlüsselt wurden, als auch von Objekten, die ohne Key Commitment verschlüsselt wurden.

Auswirkungen auf die Sicherheit: Diese Richtlinie bietet hohe Sicherheit für neu verschlüsselte Objekte und gewährleistet gleichzeitig die Abwärtskompatibilität beim Lesen älterer Objekte. Dies ist die empfohlene Richtlinie für die meisten Migrationsszenarien.

Versionskompatibilität: Mit dieser Richtlinie verschlüsselte Objekte können nur von V3 und den neuesten V2-Implementierungen gelesen werden. V2-Clients können diese Objekte nicht entschlüsseln. V3-Clients, die diese Richtlinie verwenden, können jedoch weiterhin Objekte entschlüsseln, die von V2-Clients verschlüsselt wurden.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Verschlüsselungsverhalten: Verschlüsselt Objekte mit Schlüsselzusage mithilfe des ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus.

Entschlüsselungsverhalten: Erlaubt nur die Entschlüsselung von Objekten, die mit Schlüsselzuweisung verschlüsselt wurden. Weist Objekte ab, die ohne Schlüsselzuweisung verschlüsselt wurden.

Auswirkungen auf die Sicherheit: Diese Richtlinie bietet ein Höchstmaß an Sicherheit, indem sie bei allen Vorgängen eine Schlüsselbindung erzwingt. Verwenden Sie diese Richtlinie erst, nachdem alle Objekte mit der Schlüsselzuweisung erneut verschlüsselt wurden und Sie keine älteren V1- oder V2-verschlüsselten Objekte mehr lesen müssen.

Versionskompatibilität: Mit dieser Richtlinie verschlüsselte Objekte können nur von V3 und den neuesten V2-Implementierungen gelesen werden. Darüber hinaus können Clients, die diese Richtlinie verwenden, keine Objekte entschlüsseln, die von V1- oder V2-Clients verschlüsselt wurden.

Überlegungen zur Migration: Beginnen Sie bei der Migration damit, FORBID_ENCRYPT_ALLOW_DECRYPT ob V2-Clients neue Objekte lesen müssen, und wechseln Sie dann zu, REQUIRE_ENCRYPT_ALLOW_DECRYPT sobald alle Clients auf Version 3 aktualisiert wurden. Schließlich sollten Sie dies REQUIRE_ENCRYPT_REQUIRE_DECRYPT erst in Betracht ziehen, nachdem alle Legacy-Objekte erneut verschlüsselt wurden.

ALG_AES_256_GCM_HKDF_ _COMMIT_KEY-Algorithmus SHA512

Der ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus ist ein neuer Verschlüsselungsalgorithmus, der in Version 3 eingeführt wurde und verbesserte Sicherheit für verschlüsselte Datenschlüssel bietet, die in Befehlsdateien gespeichert sind.

Auswirkung auf die Befehlsdatei: Der ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus wirkt sich nur auf Befehlsdateien aus, bei denen es sich um separate S3-Objekte handelt, die Verschlüsselungsmetadaten einschließlich des verschlüsselten Datenschlüssels speichern. Objekte, die Verschlüsselungsmetadaten in Objektmetadaten (der Standardspeichermethode) speichern, sind von dieser Algorithmusänderung nicht betroffen.

Schutz vor Manipulation: Der ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus schützt vor Manipulation von Datenschlüsseln, indem er den verschlüsselten Datenschlüssel kryptografisch an den Verschlüsselungskontext bindet. Dadurch wird verhindert, dass Angreifer einen anderen verschlüsselten Datenschlüssel in der Befehlsdatei einsetzen, was möglicherweise zur Entschlüsselung durch einen unbeabsichtigten Schlüssel führen könnte.

Versionskompatibilität: Mit dem ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus verschlüsselte Objekte können nur mit V3-Implementierungen und den neuesten V2-Übergangsversionen des SDK entschlüsselt werden, die V3-Entschlüsselung unterstützen.

Warnung

Wichtig: Bevor Sie die Verschlüsselung mit dem ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Algorithmus aktivieren (mithilfe von Richtlinien REQUIRE_ENCRYPT_ALLOW_DECRYPT oder REQUIRE_ENCRYPT_REQUIRE_DECRYPT Commitment-Richtlinien), müssen Sie sicherstellen, dass alle Clients, die diese Objekte lesen, auf Version 3 oder die neueste V2-Übergangsversion aktualisiert wurden, die V3-Entschlüsselung unterstützt. Wenn Sie nicht zuerst alle Lesegeräte aktualisieren, schlägt die Entschlüsselung neu verschlüsselter Objekte fehl.

Aktualisieren Sie bestehende Clients, um neue Formate zu lesen

Sie müssen zuerst Ihre vorhandenen Clients auf die neueste SDK-Version aktualisieren. Nach Abschluss dieses Schritts können die V2-Clients Ihrer Anwendung Objekte entschlüsseln, die mit V3-Verschlüsselungsclients verschlüsselt wurden, ohne die Codebasis Ihrer Anwendung aktualisieren zu müssen.

Erstellen und installieren Sie die neueste Version von AWS SDK für C++

Anwendungen, die das SDK aus der Quelle nutzen

Wenn Sie die Quelle erstellen und installieren, laden Sie die SDK-Quelle AWS SDK für C++ von aws/aws-sdk-cppon herunter oder klonen Sie sie GitHub. Wiederholen Sie dann Ihre normalen Build- und Installationsschritte.

Wenn Sie ein Upgrade AWS SDK für C++ von einer Version vor 1.11.x durchführen, finden Sie in diesem CHANGELOG die wichtigsten Änderungen, die in den einzelnen Hauptversionen eingeführt wurden. Weitere Informationen zum Erstellen und Installieren von finden Sie unter AWS SDK für C++. Den AWS SDK für C++ aus dem Quellcode holen

Anwendungen, die das SDK von Vcpkg nutzen

Wenn Ihre Anwendung Vcpkg zur Nachverfolgung von SDK-Updates verwendet, verwenden Sie einfach Ihre bestehende Vcpkg-Upgrade-Methode, um das SDK auf die neueste Version zu aktualisieren. Beachten Sie, dass es zwischen der Veröffentlichung einer Version und der Verfügbarkeit über einen Paketmanager eine Verzögerung gibt. Die neueste Version ist immer über die Installation aus dem Quellcode verfügbar.

Sie können den folgenden Befehl ausführen, um das Paket zu aktualisierenaws-sdk-cpp:

vcpkg upgrade aws-sdk-cpp

Und überprüfen Sie die Version des Paketsaws-sdk-cpp:

vcpkg list aws-sdk-cpp

Die Version sollte mindestens 1.11.x sein, um die Entschlüsselung von V3-verschlüsselten Objekten zu unterstützen.

Weitere Hinweise zur Verwendung von Vcpkg mit dem finden Sie unter. AWS SDK für C++AWS SDK für C++ Von einem Paketmanager bekommen

Erstellen, installieren und implementieren Sie Ihre Anwendungen

Wenn Ihre Anwendung statisch mit dem verknüpft wird AWS SDK für C++, sind keine Codeänderungen in Ihrer Anwendung erforderlich. Sie müssen Ihre Anwendung jedoch erneut erstellen, um die neuesten SDK-Änderungen zu verwenden. Dieser Schritt ist für dynamisches Verknüpfen nicht erforderlich.

Nachdem Sie die Abhängigkeitsversion Ihrer Anwendung aktualisiert und die Funktionalität der Anwendung überprüft haben, fahren Sie mit der Bereitstellung Ihrer Anwendung in Ihrer Flotte fort. Sobald die Anwendungsbereitstellung abgeschlossen ist, können Sie mit der nächsten Phase der Migration Ihrer Anwendung zur Verwendung der V3-Verschlüsselungs- und Entschlüsselungsclients fortfahren.

Migrieren Sie die Verschlüsselungs- und Entschlüsselungsclients zu V3

Die folgenden Schritte zeigen Ihnen, wie Sie Ihren Code erfolgreich von V2 auf V3 des Amazon S3 S3-Verschlüsselungsclients migrieren. Da Codeänderungen erforderlich sind, müssen Sie Ihre Anwendung neu erstellen, unabhängig davon, ob sie statisch oder dynamisch mit dem AWS SDK für C++ verknüpft wird.

Verwenden von V3-Verschlüsselungsclients

V3 führt die S3EncryptionClientV3 Klasse ein und ersetzt CryptoConfigurationV3 die V2-Äquivalente. Die wichtigsten Unterschiede in V3 sind:

  • V3 verwendet KMSWithContextEncryptionMaterials (wie V2), erfordert jedoch eine explizite Konfiguration inCryptoConfigurationV3.

  • Alle PutObject Operationen erfordern eine Verschlüsselungskontextmap (kann leer sein).

  • V3 führt Commitment-Richtlinien ein, um das Verhalten bei der Verschlüsselung und Entschlüsselung zu kontrollieren.

  • Standardmäßig verschlüsselt V3 mithilfe des Algorithmus mit Key Commitment. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

  • Die bisherige API zur Konfiguration der Algorithmus-Entschlüsselung ändert sich von bisconfig.SetSecurityProfile(SecurityProfile::V2_AND_LEGACY);. config.AllowLegacy();

Beispiel: Migration von V2 zu V3 mit KMS-Verschlüsselung

Vor der Migration (V2)

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID); // Create V2 crypto configuration CryptoConfigurationV2 cryptoConfig(materials); // Create V2 encryption client S3EncryptionClientV2 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Während der Migration (V3 mit Abwärtskompatibilität)

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration with materials CryptoConfigurationV3 cryptoConfig(materials); // Set commitment policy to maintain compatibility with V2 encrypted objects // This allows V3 clients to decrypt objects encrypted by the V2 client cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Nach der Migration (V3 mit zentraler Verpflichtung)

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration with materials CryptoConfigurationV3 cryptoConfig(materials); // Use the default commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects // cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Weitere Beispiele

Dieser Abschnitt enthält weitere Beispiele für die Konfiguration der V3-Verschlüsselungsclient-Optionen zur Unterstützung verschiedener Migrationsszenarien und -anforderungen.

Legacy-Support aktivieren

V3-Clients können von V2-Clients verschlüsselte Objekte nur dann entschlüsseln, wenn sie die Richtlinien REQUIRE_ENCRYPT_ALLOW_DECRYPT oder FORBID_ENCRYPT_ALLOW_DECRYPT Commitment verwenden. Wenn Sie jedoch Objekte entschlüsseln müssen, die mit V1-Clients verschlüsselt wurden, müssen Sie die Legacy-Unterstützung mit dieser Methode explizit aktivieren. AllowLegacy()

Wann sollte die Unterstützung für ältere Versionen verwendet werden:

  • Sie haben Objekte in S3, die mit Version 1 des S3 Encryption Client verschlüsselt wurden.

  • Sie müssen diese V1-verschlüsselten Objekte während des Migrationsprozesses mit Ihrem V3-Client lesen.

  • Sie verwenden die Richtlinie REQUIRE_ENCRYPT_ALLOW_DECRYPT oder FORBID_ENCRYPT_ALLOW_DECRYPT Commitment.

Warnung

Legacy-Support sollte während der Migration nur vorübergehend aktiviert werden. Sobald alle V1-Objekte mit V2 oder V3 erneut verschlüsselt wurden, deaktivieren Sie die Legacy-Unterstützung, um maximale Sicherheit zu gewährleisten.

Beispiel: Legacy-Unterstützung aktivieren

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration CryptoConfigurationV3 cryptoConfig(materials); // Enable legacy support to read V1 encrypted objects cryptoConfig.AllowLegacy(); // Set commitment policy (default is REQUIRE_ENCRYPT_REQUIRE_DECRYPT but we need to allow decryption) cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client with legacy support enabled S3EncryptionClientV3 encryptionClient(cryptoConfig); // Now you can decrypt objects encrypted by V1, V2, and V3 clients GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(LEGACY_OBJECT_KEY); Aws::Map<Aws::String, Aws::String> encryptionContext; auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);

Speichermethode konfigurieren

Der S3 Encryption Client kann Verschlüsselungsmetadaten auf zwei Arten speichern: als Objektmetadaten (Standard) oder in einer separaten Befehlsdatei. Sie können die Speichermethode mit der SetStorageMethod() Methode on konfigurierenCryptoConfigurationV3.

Optionen für die Speichermethode:

METADATA (Standard)

Verschlüsselungsmetadaten werden in den Metadaten-Headern des Objekts gespeichert. Dies ist die gebräuchlichste und praktischste Methode, da alle Verschlüsselungsinformationen zusammen mit dem Objekt selbst gespeichert werden.

Verwendungszweck: Verwenden Sie diese Methode für die meisten Szenarien. Sie vereinfacht die Objektverwaltung, da Verschlüsselungsmetadaten zusammen mit dem Objekt übertragen werden.

INSTRUCTION_FILE

Verschlüsselungsmetadaten werden in einem separaten S3-Objekt (der Befehlsdatei) mit dem Suffix .instruction gespeichert.

Verwendungszweck: Verwenden Sie diese Methode, wenn die Größe der Objektmetadaten ein Problem darstellt oder wenn Sie Verschlüsselungsmetadaten vom verschlüsselten Objekt trennen müssen. Beachten Sie, dass für die Verwendung von Befehlsdateien zwei S3-Objekte (das verschlüsselte Objekt und die zugehörige Befehlsdatei) statt eines verwaltet werden müssen.

Beispiel: Konfiguration der Speichermethode

// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration CryptoConfigurationV3 cryptoConfig(materials); // Option 1: Use metadata storage (default, can be omitted) cryptoConfig.SetStorageMethod(StorageMethod::METADATA); // Option 2: Use instruction file storage cryptoConfig.SetStorageMethod(StorageMethod::INSTRUCTION_FILE); // Create V3 encryption client with the configured storage method S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object - encryption metadata will be stored according to the configured method Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // If using INSTRUCTION_FILE, a separate object with key "OBJECT_KEY.instruction" will be created
Anmerkung

Denken Sie bei der Verwendung der INSTRUCTION_FILE Speichermethode daran, dass beim Löschen des verschlüsselten Objekts die Befehlsdatei nicht automatisch gelöscht wird. Sie müssen beide Objekte getrennt verwalten.