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-Verschlüsselungsclients (V2 auf V3) im AWS SDK für PHP Version 3
Anmerkung
Wenn Sie Version 1 (V1) des Amazon S3-Verschlüsselungsclients verwenden, müssen Sie zuerst auf Version 2 (V2) migrieren, bevor Sie auf Version 3 (V3) migrieren. Siehe Migration des Amazon S3-Verschlüsselungsclients (V1 auf V2) im AWS SDK für PHP Version 3.
In diesem Thema wird gezeigt, wie Sie Ihre Anwendungen von Version 2 (V2) des Amazon Simple Storage Service (Amazon S3) -Verschlüsselungsclients auf Version 3 (V3) migrieren und die Anwendungsverfügbarkeit während des gesamten Migrationsprozesses sicherstellen. Version 3 führt AES GCM mit Key Commitment und Commitment Policies ein, um die Sicherheit zu erhöhen und vor Manipulation von Datenschlüsseln zu 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 PHP in Ihrer Anwendung bereit. Auf diese Weise können bestehende V2-Verschlüsselungsclients Objekte entschlüsseln, die von den neuen V3-Clients geschrieben wurden. Wenn Ihre Anwendung mehrere AWS SDKs verwendet, müssen Sie jedes SDK separat aktualisieren.
2. Migrieren Sie die Verschlüsselungs- und Entschlüsselungsclients auf Version 3. 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-Verschlüsselungsclients führt zwei wichtige Sicherheitsverbesserungen ein: Commitment Policies und den AES-GCM mit Key Commitment-Algorithmus. Das Verständnis dieser Konzepte ist für eine erfolgreiche Migration unerlässlich.
Politik des Engagements
Eine Verpflichtungsrichtlinie steuert, wie der Verschlüsselungsclient bei Verschlüsselungs- und Entschlüsselungsvorgängen mit der Schlüsselbindung umgeht. Version 3 bietet drei Richtlinienoptionen:
FORBID_ENCRYPT_ALLOW_DECRYPT-
Verschlüsselungsverhalten: Verschlüsselt Objekte, ohne dass ein Schlüssel erforderlich ist.
Entschlüsselungsverhalten: Ermöglicht die Entschlüsselung von Objekten, die mit oder ohne Schlüsselbindung verschlüsselt wurden.
Auswirkungen auf die Sicherheit: Diese Richtlinie erzwingt bei neu verschlüsselten Objekten keine Schlüsselbindung, wodurch Datenschlüssel manipuliert werden können. Verwenden Sie diese Richtlinie nur in der ersten Migrationsphase, wenn Sie die Kompatibilität mit V2-Clients aufrechterhalten müssen.
Versionskompatibilität: Mit dieser Richtlinie verschlüsselte Objekte können von allen V2- und V3-Implementierungen gelesen werden.
REQUIRE_ENCRYPT_ALLOW_DECRYPT-
Verschlüsselungsverhalten: Verschlüsselt Objekte mit Schlüsselbindung mithilfe des
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYAlgorithmus.Entschlüsselungsverhalten: Ermöglicht die Entschlüsselung von Objekten, die mit oder ohne Schlüsselbindung verschlüsselt wurden.
Auswirkungen auf die Sicherheit: Diese Richtlinie bietet erhöhte Sicherheit für neu verschlüsselte Objekte und gewährleistet gleichzeitig die Lesbarkeit vorhandener Objekte. Dies ist die empfohlene Richtlinie für die meisten Migrationsszenarien.
Versionskompatibilität: Objekte, die mit dieser Richtlinie verschlüsselt wurden, können nur von V3 und den neuesten V2-Implementierungen gelesen werden.
Überlegungen zur Migration: Stellen Sie vor der Verwendung dieser Richtlinie sicher, dass alle Clients, die die verschlüsselten Objekte lesen müssen, auf Version 3 oder die neueste Version 2 aktualisiert wurden.
REQUIRE_ENCRYPT_REQUIRE_DECRYPT-
Verschlüsselungsverhalten: Verschlüsselt Objekte mit Schlüsselbindung mithilfe des
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYAlgorithmus.Entschlüsselungsverhalten: Ermöglicht nur die Entschlüsselung von Objekten, die mit Schlüsselbindung verschlüsselt wurden. Objekte, die ohne Schlüsselbindung verschlüsselt wurden, können nicht entschlüsselt werden.
Auswirkungen auf die Sicherheit: Diese Richtlinie bietet ein Höchstmaß an Sicherheit, da sowohl für die Verschlüsselung als auch für die Entschlüsselung eine Schlüsselbindung erzwungen wird. Verwenden Sie diese Richtlinie erst, nachdem alle Objekte zur Verwendung von Key Commitment migriert wurden.
Versionskompatibilität: Nur V3-Implementierungen können diese Richtlinie verwenden. Der Versuch, V1- oder V2-verschlüsselte Objekte mit dieser Richtlinie zu entschlüsseln, schlägt fehl.
Überlegungen zur Migration: Diese Richtlinie sollte erst verwendet werden, nachdem die vollständige Migration abgeschlossen und alle vorhandenen Objekte mit Schlüsselbindung erneut verschlüsselt wurden.
AES GCM mit Key Commitment
Der AES-GCM mit Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) -Algorithmus ist ein neuer Verschlüsselungsalgorithmus, der in Version 3 eingeführt wurde und Schutz vor Angriffen mit der Manipulation von Datenschlüsseln bietet.
Sicherheitsverbesserung: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY Schützt vor Manipulation von Datenschlüsseln, indem der Datenschlüssel kryptografisch an den verschlüsselten Inhalt gebunden wird. Dadurch wird verhindert, dass Angreifer bei der Entschlüsselung einen anderen Datenschlüssel verwenden, was zur Entschlüsselung unbeabsichtigter Daten führen könnte.
Versionskompatibilität: Mit verschlüsselte Objekte ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY können nur mit Version 3 und den neuesten V2-Implementierungen des Amazon S3-Verschlüsselungsclients entschlüsselt werden. V1-Clients können mit diesem Algorithmus verschlüsselte Objekte nicht entschlüsseln.
Wichtig
Upgrade-Anforderung: Bevor Sie die Verschlüsselung mit aktivieren ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (mithilfe der Richtlinien REQUIRE_ENCRYPT_ALLOW_DECRYPT oder REQUIRE_ENCRYPT_REQUIRE_DECRYPT), müssen Sie sicherstellen, dass alle Clients, die die verschlüsselten Objekte lesen müssen, auf Version 3 aktualisiert wurden. Wenn nicht alle Lesegeräte aktualisiert werden, führt dies zu Fehlern bei der Entschlüsselung von Objekten, die mit Schlüsselbindung verschlüsselt wurden.
Aktualisieren Sie bestehende Clients so, dass sie neue Formate lesen
Der V3-Verschlüsselungsclient verwendet Verschlüsselungsalgorithmen und wichtige Commitment-Funktionen, die ältere Versionen des Clients nicht unterstützen. Der erste Schritt der Migration besteht darin, Ihre V2-Entschlüsselungsclients auf die neueste SDK-Version zu aktualisieren. Nach Abschluss dieses Schritts können die V2-Clients Ihrer Anwendung Objekte entschlüsseln, die mit V3-Verschlüsselungsclients verschlüsselt wurden. Im Folgenden finden Sie Einzelheiten zu den einzelnen Installationsmethoden von. AWS SDK für PHP
Erstellen und Installieren der neuesten SDK-Version
Um diese Migration abzuschließen, müssen Sie die neueste Version des aws/aws-sdk-php Pakets verwenden, das die Unterstützung des V3-Verschlüsselungsclients enthält.
Installation über Composer
Aktualisieren Sie für Projekte, die mit Composer installiert wurden, in der Composer-Datei das SDK-Paket auf die neueste Version des SDK und führen Sie dann den folgenden Befehl aus.
composer update aws/aws-sdk-php
Installation mithilfe der Phar- oder Zip-Datei
Verwenden Sie eine der folgenden Methoden: Stellen Sie sicher, dass Sie die aktualisierte SDK-Datei an dem Ort platzieren, der für Ihren Code erforderlich ist. Dieser wird in der Requre-Anweisung festgelegt.
Laden Sie für Projekte, die mithilfe der Phar-Datei installiert wurden, die aktualisierte Datei herunter: aws.phar.
<?php require '/path/to/aws.phar'; ?>
Laden Sie für Projekte, die mithilfe der Zip-Datei installiert wurden, die aktualisierte Datei herunter: .
<?php require '/path/to/aws-autoloader.php'; ?>
Anwendungen erstellen, installieren und bereitstellen
Nachdem Sie das SDK aktualisiert haben, erstellen Sie Ihre Anwendung neu und stellen Sie sie erneut bereit, um sicherzustellen, dass alle Komponenten die aktualisierte Version verwenden. Dieser Schritt ist wichtig, um sicherzustellen, dass Ihre V2-Clients Objekte lesen können, die von V3-Clients verschlüsselt wurden.
Folgen Sie den standardmäßigen Bereitstellungsverfahren Ihres Unternehmens, um die aktualisierte Anwendung bereitzustellen. Stellen Sie sicher, dass alle Instanzen Ihrer Anwendung aktualisiert sind, bevor Sie mit der Migration Ihrer Verschlüsselungs- und Entschlüsselungsclients auf Version 3 fortfahren.
Stellen Sie nach der Bereitstellung sicher, dass Ihre Anwendung immer noch vorhandene Objekte entschlüsseln kann und dass während des normalen Betriebs keine Fehler auftreten. Dies bestätigt, dass das SDK-Update erfolgreich war und Ihre Anwendung für die nächste Phase der Migration bereit ist.
Migrieren Sie Verschlüsselungs- und Entschlüsselungsclients auf Version 3
Nachdem Sie Ihre Clients auf die neuen Verschlüsselungsformate aktualisiert haben, können Sie Ihre Anwendungen auf die V3-Verschlüsselungs- und Entschlüsselungsclients aktualisieren. Die folgenden Beispiele zeigen Ihnen, wie Sie Ihren Code erfolgreich von V2 auf V3 migrieren.
Verwenden von V3 Encryption Clients
V3 führt die S3EncryptionClientV3 Klasse ein und ersetzt KmsMaterialsProviderV3 die V2-Äquivalente. Die wichtigsten Unterschiede in V3 sind:
-
V3 verwendet
KmsMaterialsProviderV3(wie V2), überprüft aber den Verschlüsselungskontext, wenn Objekte inGetObjectAufrufen entschlüsselt werden. -
V3 führt Commitment Policies ein, um das Verschlüsselungs- und Entschlüsselungsverhalten zu kontrollieren.
Beispiel: Migration von V2 auf V3 mit KMS-Verschlüsselung
Pre-migration (V2)
use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV2; use Aws\Kms\KmsClient; $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@CommitmentPolicy' => 'FORBID_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Während der Migration (V3 mit Abwärtskompatibilität)
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; // Create V3 encryption client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); // Create encryption materials $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Post-migration (V3 mit wichtiger Verpflichtung)
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; // Create V3 encryption client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); // Create encryption materials $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, // Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3', // Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Die wichtigsten Unterschiede in V3:
-
Verwenden Sie
KmsMaterialsProviderV3anstelle vonKmsMaterialsProviderV2. -
Der
@KmsEncryptionContextParameter wird weiterhin fürputObjectOperationen benötigt -
Der
@KmsEncryptionContextParameter ist fürgetObjectOperationen optional und überprüft, ob der angegebene Verschlüsselungskontext mit dem im Objekt übereinstimmt. -
Der
@SecurityProfileParameter steuert, welche Verschlüsselungsversionen entschlüsselt werden können. Auf gesetzt,'V3_AND_LEGACY'um das Lesen von V1- und V2-verschlüsselten Objekten während der Migration zu unterstützen -
Der
@CommitmentPolicyParameter steuert die Verpflichtungsrichtlinie für diesen Vorgang. Wird auf gesetzt,'FORBID_ENCRYPT_ALLOW_DECRYPT'um das Lesen von verschlüsselten Objekten ohne Verpflichtungen während der Migration zu unterstützen
Weitere Beispiele
Die folgenden Beispiele zeigen zusätzliche Konfigurationsoptionen, die in Version 3 verfügbar sind und Ihnen helfen können, den Migrationsprozess zu verwalten und das Verschlüsselungsverhalten zu kontrollieren.
Aktivieren des Legacy-System--Supports
Während der Migration müssen Sie möglicherweise Objekte entschlüsseln, die mit V1 oder V2 des Amazon S3-Verschlüsselungsclients verschlüsselt wurden. Der @SecurityProfile Parameter steuert, welche Verschlüsselungsversionen Ihr V3-Client entschlüsseln kann.
Wann Sie diese Konfiguration verwenden sollten: Verwenden Sie das 'V3_AND_LEGACY' Sicherheitsprofil, wenn Ihre Anwendung Objekte lesen muss, die von V1- oder V2-Clients verschlüsselt wurden. Dies ist häufig während der Migrationsphase der Fall, wenn Sie eine Mischung aus alten und neuen verschlüsselten Objekten in Ihren Buckets haben.
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; // Decrypt objects encrypted with V1, V2, or V3 $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Der Parameter @SecurityProfile akzeptiert die folgenden Werte:
-
'V3'(Standard): Entschlüsseln Sie nur Objekte, die mit V3 verschlüsselt wurden, indem Sie Key Commitment verwenden -
'V3_AND_LEGACY': Entschlüsselt Objekte, die mit V1, V2 oder V3 verschlüsselt wurden
Wichtig
Nachdem Sie Ihre Migration abgeschlossen und alle Objekte mit V3 erneut verschlüsselt haben, sollten Sie den @SecurityProfile Parameter entfernen oder auf einen Wert einstellen, um maximale Sicherheit 'V3' zu gewährleisten.
Speichermethode konfigurieren
Der Amazon S3-Verschlüsselungsclient kann Verschlüsselungsmetadaten auf zwei Arten speichern: in den Metadaten-Headern des Objekts oder in einer separaten Anweisungsdatei. Der @MetadataStrategy Parameter steuert, welche Speichermethode verwendet wird.
Wann Sie diese Konfiguration verwenden sollten: Verwenden Sie 'INSTRUCTION_FILE' sie, wenn Sie die ursprünglichen Objektmetadaten beibehalten müssen oder wenn Sie mit Objekten arbeiten, für die Metadatengrößenbeschränkungen gelten. Verwenden Sie 'METADATA' (die Standardeinstellung) für einfachere Bereitstellungen, bei denen Verschlüsselungsmetadaten zusammen mit dem Objekt gespeichert werden können.
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; // Store encryption metadata in a separate instruction file $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => 'INSTRUCTION_FILE', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); // Store encryption metadata in object headers (default) $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => 'METADATA', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
Der Parameter @MetadataStrategy akzeptiert die folgenden Werte:
-
'METADATA'(Standard): Speichern Sie Verschlüsselungsmetadaten in den Metadaten-Headern des Objekts -
'INSTRUCTION_FILE': Speichern Sie Verschlüsselungsmetadaten in einer separaten Anweisungsdatei mit dem Suffix.instruction
Anmerkung
Bei Verwendung 'INSTRUCTION_FILE' bietet der AES-GCM mit Key Commitment-Algorithmus zusätzlichen Schutz vor der Manipulation von Datenschlüsseln. Objekte, die 'METADATA' Speicher nutzen, profitieren nicht von diesem zusätzlichen Schutz.