View a markdown version of this page

Migrazione del client di crittografia Amazon S3 (da V2 a V3) nel AWS SDK per PHP Versione 3 - AWS SDK per PHP

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Migrazione del client di crittografia Amazon S3 (da V2 a V3) nel AWS SDK per PHP Versione 3

Nota

Se utilizzi la versione 1 (V1) del client di crittografia Amazon S3, devi prima migrare alla versione 2 (V2) prima di migrare alla versione 3 (V3). Consulta Migrazione del client di crittografia Amazon S3 (da V1 a V2) nel AWS SDK per PHP Versione 3.

Questo argomento mostra come migrare le applicazioni dalla versione 2 (V2) del client di crittografia Amazon Simple Storage Service (Amazon S3) alla versione 3 (V3) e garantire la disponibilità delle applicazioni durante tutto il processo di migrazione. La versione 3 introduce AES GCM con Key Commitment and Commitment Policies per migliorare la sicurezza e proteggere dalla manomissione delle chiavi di dati.

Panoramica sulla migrazione

Questa migrazione avviene in due fasi:

1. Aggiorna i client esistenti per leggere nuovi formati. Innanzitutto, distribuisci una versione aggiornata dell' AWS SDK per PHP applicazione. Ciò consente ai client di crittografia V2 esistenti di decrittografare gli oggetti scritti dai nuovi client V3. Se l'applicazione utilizza più AWS SDK, è necessario aggiornare ciascun SDK separatamente.

2. Esegui la migrazione dei client di crittografia e decrittografia alla V3. Una volta che tutti i client di crittografia V2 sono in grado di leggere i nuovi formati, è possibile migrare i client di crittografia e decrittografia esistenti alle rispettive versioni V3.

Comprensione dei concetti di V3

La versione 3 del client di crittografia Amazon S3 introduce due principali miglioramenti della sicurezza: Commitment Policies e l'algoritmo AES GCM with Key Commitment. La comprensione di questi concetti è essenziale per una migrazione di successo.

Politica di impegno

Una politica di impegno controlla il modo in cui il client di crittografia gestisce l'impegno delle chiavi durante le operazioni di crittografia e decrittografia. La versione 3 offre tre opzioni politiche:

FORBID_ENCRYPT_ALLOW_DECRYPT

Comportamento di crittografia: crittografa gli oggetti senza impegno della chiave.

Comportamento di decrittografia: consente la decrittografia di oggetti crittografati con o senza l'impegno della chiave.

Implicazioni sulla sicurezza: questa politica non impone l'impegno della chiave sui nuovi oggetti crittografati, il che potrebbe consentire la manomissione della chiave di dati. Utilizza questa policy solo durante la fase iniziale di migrazione quando devi mantenere la compatibilità con i client V2.

Compatibilità delle versioni: gli oggetti crittografati con questa policy possono essere letti da tutte le implementazioni V2 e V3.

REQUIRE_ENCRYPT_ALLOW_DECRYPT

Comportamento di crittografia: crittografa gli oggetti con key commit utilizzando l'algoritmo. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Comportamento di decrittografia: consente la decrittografia di oggetti crittografati con o senza impegno della chiave.

Implicazioni sulla sicurezza: questa policy fornisce una maggiore sicurezza per i nuovi oggetti crittografati, pur mantenendo la capacità di leggere gli oggetti esistenti. Questa è la politica consigliata per la maggior parte degli scenari di migrazione.

Compatibilità delle versioni: gli oggetti crittografati con questa policy possono essere letti solo dalla V3 e dalle ultime implementazioni V2.

Considerazioni sulla migrazione: prima di utilizzare questa policy, assicurati che tutti i client che devono leggere gli oggetti crittografati siano stati aggiornati alla V3 o alla V2 più recente.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Comportamento di crittografia: crittografa gli oggetti con key commit utilizzando l'algoritmo. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Comportamento di decrittografia: consente la decrittografia solo di oggetti crittografati con l'impegno della chiave. Gli oggetti crittografati senza l'impegno della chiave non verranno decrittografati.

Implicazioni sulla sicurezza: questa policy fornisce il massimo livello di sicurezza applicando l'impegno delle chiavi sia per la crittografia che per la decrittografia. Utilizza questa policy solo dopo che tutti gli oggetti sono stati migrati per utilizzare il key commitment.

Compatibilità delle versioni: solo le implementazioni V3 possono utilizzare questa politica. Il tentativo di decrittografare oggetti crittografati V1 o V2 con questa politica avrà esito negativo.

Considerazioni sulla migrazione: questa policy deve essere utilizzata solo dopo aver completato la migrazione completa e aver nuovamente crittografato tutti gli oggetti esistenti con un impegno chiave.

AES GCM con Key Commitment

L'algoritmo AES GCM with Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) è un nuovo algoritmo di crittografia introdotto nella V3 che fornisce protezione dagli attacchi di manomissione delle chiavi di dati.

Miglioramento della sicurezza: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY protegge dalla manomissione della chiave di dati legando crittograficamente la chiave dati al contenuto crittografato. Ciò impedisce agli aggressori di sostituire una chiave di dati diversa durante la decrittografia, il che potrebbe portare alla decrittografia di dati non intenzionali.

Compatibilità delle versioni: gli oggetti crittografati con ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY possono essere decrittografati solo dalla V3 e dalle più recenti implementazioni V2 del client di crittografia Amazon S3. I client V1 non possono decrittografare oggetti crittografati con questo algoritmo.

Importante

Requisiti di aggiornamento: prima di abilitare la crittografia con ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (utilizzando le politiche REQUIRE_ENCRYPT_ALLOW_DECRYPT o REQUIRE_ENCRYPT_REQUIRE_DECRYPT), è necessario assicurarsi che tutti i client che devono leggere gli oggetti crittografati siano stati aggiornati alla V3. Il mancato aggiornamento di tutti i lettori comporterà errori di decrittografia per gli oggetti crittografati con l'impegno della chiave.

Aggiorna i client esistenti per leggere nuovi formati

Il client di crittografia V3 utilizza algoritmi di crittografia e funzionalità di impegno chiave che le versioni precedenti del client non supportano. Il primo passaggio della migrazione consiste nell'aggiornare i client di decrittografia V2 all'ultima versione SDK. Dopo aver completato questo passaggio, i client V2 dell'applicazione saranno in grado di decrittografare gli oggetti crittografati dai client di crittografia V3. Vedi i dettagli di seguito per ogni metodo di installazione di. AWS SDK per PHP

Creazione e installazione della versione SDK più recente

Per completare questa migrazione, è necessario utilizzare la versione più recente del aws/aws-sdk-php pacchetto che include il supporto per i client di crittografia V3.

Installazione da Composer

Per i progetti installati tramite Composer, nel file Composer, aggiorna il pacchetto SDK alla versione più recente dell'SDK e quindi esegui il seguente comando.

composer update aws/aws-sdk-php

Installazione utilizzando il file Phar o Zip

Utilizzare uno dei seguenti metodi. Assicurati di inserire il file SDK aggiornato nella posizione richiesta dal codice, determinata dall'istruzione require.

Per i progetti installati utilizzando il file Phar, scarica il file aggiornato:. aws.phar

<?php require '/path/to/aws.phar'; ?>

Per i progetti installati utilizzando il file Zip, scarica il file aggiornato: .

<?php require '/path/to/aws-autoloader.php'; ?>

Creazione, installazione e distribuzione di applicazioni

Dopo aver aggiornato l'SDK, ricostruisci e ridistribuisci l'applicazione per assicurarti che tutti i componenti utilizzino la versione aggiornata. Questo passaggio è fondamentale per garantire che i client V2 possano leggere gli oggetti crittografati dai client V3.

Segui le procedure di distribuzione standard della tua organizzazione per implementare l'applicazione aggiornata. Assicurati che tutte le istanze dell'applicazione siano aggiornate prima di procedere alla migrazione dei client di crittografia e decrittografia alla V3.

Dopo la distribuzione, verificate che l'applicazione sia ancora in grado di decrittografare gli oggetti esistenti e che non si verifichino errori durante le normali operazioni. Ciò conferma che l'aggiornamento dell'SDK è andato a buon fine e che l'applicazione è pronta per la fase successiva della migrazione.

Esegui la migrazione dei client di crittografia e decrittografia alla V3

Dopo aver aggiornato i client per leggere i nuovi formati di crittografia, è possibile aggiornare le applicazioni ai client di crittografia e decrittografia V3. Gli esempi seguenti mostrano come migrare correttamente il codice dalla V2 alla V3.

Utilizzo dei client di crittografia V3

La V3 introduce la S3EncryptionClientV3 classe e sostituisce gli KmsMaterialsProviderV3 equivalenti V2. Le principali differenze in V3 sono:

  • V3 utilizza KmsMaterialsProviderV3 (come V2) ma verifica il contesto di crittografia durante la decrittografia degli oggetti nelle chiamate. GetObject

  • La V3 introduce le Commitment Policies per controllare il comportamento di crittografia e decrittografia.

Esempio: migrazione da V2 a V3 con crittografia KMS

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, ]);

Durante la migrazione (V3 con compatibilità con le versioni precedenti)

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 con impegno chiave)

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, ]);

Differenze chiave in V3:

  • Utilizza KmsMaterialsProviderV3 al posto di KmsMaterialsProviderV2

  • Il @KmsEncryptionContext parametro è ancora obbligatorio per le operazioni putObject

  • Il @KmsEncryptionContext parametro è facoltativo per getObject le operazioni e verificherà che il contesto di crittografia fornito corrisponda a quello dell'oggetto.

  • Il @SecurityProfile parametro controlla quali versioni di crittografia possono essere decrittografate. Impostato per 'V3_AND_LEGACY' supportare la lettura di oggetti crittografati V1 e V2 durante la migrazione

  • Il @CommitmentPolicy parametro controlla la politica di impegno per questa operazione. Impostato per 'FORBID_ENCRYPT_ALLOW_DECRYPT' supportare la lettura di oggetti crittografati senza impegno durante la migrazione

Esempi aggiuntivi

Gli esempi seguenti illustrano le opzioni di configurazione aggiuntive disponibili in V3 che possono aiutarti a gestire il processo di migrazione e controllare il comportamento di crittografia.

Abilitazione del supporto legacy

Durante la migrazione, potrebbe essere necessario decrittografare gli oggetti crittografati con la versione V1 o V2 del client di crittografia Amazon S3. Il @SecurityProfile parametro controlla quali versioni di crittografia il tuo client V3 può decrittografare.

Quando utilizzare questa configurazione: utilizza il profilo di 'V3_AND_LEGACY' sicurezza quando l'applicazione deve leggere oggetti crittografati dai client V1 o V2. Questo è comune durante il periodo di migrazione, quando hai un mix di vecchi e nuovi oggetti crittografati nei tuoi bucket.

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, ]);

Il parametro @SecurityProfile accetta i seguenti valori:

  • 'V3'(impostazione predefinita): decrittografa solo gli oggetti crittografati con V3 utilizzando key commitment

  • 'V3_AND_LEGACY': decrittografa gli oggetti crittografati con V1, V2 o V3

Importante

Dopo aver completato la migrazione e aver nuovamente crittografato tutti gli oggetti con V3, è necessario rimuovere il @SecurityProfile parametro o impostarlo per garantire la massima sicurezza. 'V3'

Configurazione del metodo di archiviazione

Il client di crittografia Amazon S3 può archiviare i metadati di crittografia in due modi: nelle intestazioni dei metadati dell'oggetto o in un file di istruzioni separato. Il @MetadataStrategy parametro controlla il metodo di archiviazione utilizzato.

Quando usare questa configurazione: da utilizzare 'INSTRUCTION_FILE' quando è necessario conservare i metadati dell'oggetto originale o quando si lavora con oggetti con vincoli di dimensione dei metadati. Usa 'METADATA' (impostazione predefinita) per distribuzioni più semplici in cui i metadati di crittografia possono essere archiviati insieme all'oggetto.

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'), ]);

Il parametro @MetadataStrategy accetta i seguenti valori:

  • 'METADATA'(impostazione predefinita): memorizza i metadati di crittografia nelle intestazioni dei metadati dell'oggetto

  • 'INSTRUCTION_FILE': memorizza i metadati di crittografia in un file di istruzioni separato con il suffisso .instruction

Nota

Quando viene utilizzato'INSTRUCTION_FILE', l'algoritmo AES GCM with Key Commitment fornisce una protezione aggiuntiva contro la manomissione delle chiavi di dati. Gli oggetti che utilizzano l''METADATA'archiviazione non beneficiano di questa protezione aggiuntiva.