Migrazione del client di crittografia Amazon S3 (da V2 a V4) - AWS SDK per .NET (V3)

È stata rilasciata la versione 4 (V4) di! AWS SDK per .NET

Per iniziare a utilizzare la nuova versione dell'SDK, consulta la Guida per gli sviluppatori AWS SDK per .NET (V4), in particolare l'argomento relativo alla migrazione alla versione 4.

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 V4)

Nota

Se si utilizza la V1 e si desidera migrare alla V4, è necessario prima migrare alla V2. Per informazioni, consulta Migrazione del client di crittografia Amazon S3 (da V1 a V2).

Questo argomento mostra come migrare le applicazioni dalla versione 2 (V2) del client di crittografia Amazon Simple Storage Service (Amazon S3) alla versione 4 (V4) e garantire la disponibilità delle applicazioni durante tutto il processo di migrazione. V4 utilizza AES-GCM con impegno fondamentale per la crittografia dei contenuti e introduce Commitment Policies per migliorare la sicurezza contro gli attacchi di sostituzione delle chiavi.

Il client V4 è disponibile nel pacchetto Amazon.Extensions.S3.Encryption. NuGet

Importante

Ultime modifiche: i client V4 configurati con REQUIRE_ENCRYPT_REQUIRE_DECRYPT policy non possono decrittografare oggetti crittografati con client V1 o V2. Solo i client V2 più recenti possono decrittografare gli oggetti crittografati V4 con impegno chiave. Prima di passare alla REQUIRE_ENCRYPT_REQUIRE_DECRYPT policy, è necessario crittografare nuovamente tutti i dati esistenti utilizzando client V4 con key commit abilitato.

Comprensione dei concetti della V4

V4 utilizza AES-GCM con un impegno fondamentale per la crittografia dei contenuti e introduce concetti chiave di sicurezza che migliorano la protezione dei dati crittografati:

Politica di impegno

La politica di impegno controlla il modo in cui il client di crittografia gestisce l'impegno delle chiavi durante le operazioni di crittografia e decrittografia. V4 supporta tre politiche di impegno:

FORBID_ENCRYPT_ALLOW_DECRYPT

Crittografia: senza impegno

Decrittografia: consente oggetti non impegnativi

Sicurezza: non impone l'impegno e può consentire la manomissione

Compatibilità: tutte le implementazioni V2 e V4 possono leggere oggetti crittografati con questa politica

REQUIRE_ENCRYPT_ALLOW_DECRYPT

Crittografia: con impegno fondamentale

Decrittografia: consente sia il commit che il non commit di oggetti

Sicurezza: i nuovi oggetti sono protetti dagli attacchi di sostituzione delle chiavi, i vecchi oggetti sono ancora leggibili

Compatibilità: solo la V4 supporta questa politica

REQUIRE_ENCRYPT_REQUIRE_DECRYPT(Impostazione predefinita per V4)

Crittografia: con impegno chiave

Decrittografia: solo invio di oggetti

Sicurezza: applicazione del pieno impegno per la massima sicurezza

Compatibilità: solo la versione V4 supporta questa politica

AES GCM con impegno chiave

V4 utilizza AES-GCM con un impegno fondamentale per la crittografia dei contenuti, che offre una maggiore sicurezza:

  • Protezione da manomissioni: protegge dagli attacchi di sostituzione delle chiavi legando crittograficamente la chiave ai dati crittografati.

  • Compatibilità delle versioni: gli oggetti crittografati con l'impegno della chiave possono essere decrittografati solo dai client V4 e dalle versioni più recenti.

avvertimento

Prima di abilitare la crittografia Key Commitment in produzione, assicuratevi che tutte le applicazioni che devono decrittografare gli oggetti siano state aggiornate alla versione 4 o successiva, poiché il client V2 è diventato obsoleto.

Aggiorna i client esistenti per leggere i formati V4

Il client di crittografia V4 utilizza algoritmi di crittografia che le versioni precedenti del client non supportano. Il primo passo della migrazione consiste nell'aggiornare i client V2 in modo che possano leggere il nuovo formato V4.

Aggiorna le dipendenze dei NuGet pacchetti

Aggiorna le tue applicazioni per utilizzare la versione più recente del pacchetto NuGet Amazon.Extensions.S3.Encryption che include il supporto V4. Esegui i seguenti passaggi su ciascuna delle tue applicazioni:

  1. Esegui l'aggiornamento al pacchetto Amazon.Extensions.S3.Encryption più recente. Se il tuo progetto dipende direttamente dal file.S3 o. AWSSDK AWSSDK KeyManagementServicepacchetti, è necessario aggiornare tali dipendenze o rimuoverle in modo che le loro versioni aggiornate vengano inserite in questo nuovo pacchetto.

  2. Assicurati che le tue using istruzioni facciano riferimento al namespace corretto:

    using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives;
  3. Ricostruisci e ridistribuisci l'applicazione.

I client V2 esistenti continueranno a funzionare con il pacchetto aggiornato e saranno in grado di decrittografare gli oggetti crittografati dai client V4 (a seconda della politica di impegno utilizzata).

Crea e distribuisci applicazioni

Dopo aver aggiornato le dipendenze dei NuGet pacchetti:

  1. Crea la tua applicazione per assicurarti che tutte le dipendenze vengano risolte correttamente.

  2. Testa l'applicazione in un ambiente di sviluppo per verificare che le funzionalità esistenti continuino a funzionare.

  3. Implementa l'applicazione aggiornata nel tuo ambiente di produzione.

Questo aggiornamento consente ai client V2 esistenti di decrittografare gli oggetti che verranno crittografati dai client V4, garantendo la compatibilità durante il processo di migrazione.

Esegui la migrazione ai client V4

Dopo aver aggiornato i client esistenti per leggere il nuovo formato di crittografia, è possibile procedere all'aggiornamento sicuro delle applicazioni per utilizzare i client di crittografia e decrittografia V4. Il client V4 offre una maggiore sicurezza grazie all'impegno delle chiavi, pur mantenendo la compatibilità con gli oggetti crittografati esistenti.

Processo di migrazione in 4 fasi

La migrazione dalla V2 alla V4 segue un processo strutturato in 4 fasi per garantire compatibilità e sicurezza. Ogni passaggio rappresenta una configurazione specifica che deve essere implementata in tutte le applicazioni prima di procedere al passaggio successivo.

  1. Fase 0: Client V2 (punto di partenza) - Implementazione V2 esistente

  2. Fase 1: compatibilità V4 con V2 - Migrazione al client V4 mantenendo un comportamento di crittografia compatibile con V2

  3. Fase 2: V4 con Key Commitment Writes - Inizia a crittografare con key commit, permettendo al contempo la decrittografia degli oggetti legacy

  4. Fase 3: V4 con applicazione completa: è necessario un impegno fondamentale sia per la crittografia che per la decrittografia

Fase 0: V2 Client (punto di partenza)

Rappresenta la configurazione del client V2 esistente. Questo passaggio dimostra lo stato iniziale prima della migrazione.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 0: V2 Client - Starting configuration var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV2(kmsKeyId, KmsType.KmsContext, encryptionContext); #pragma warning disable 0618 var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2); #pragma warning enable 0618 var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Fase 1: compatibilità V4 con V2

Esegui la migrazione al client V4 mantenendo un comportamento identico a quello della V2. Questo passaggio utilizza una FORBID_ENCRYPT_ALLOW_DECRYPT politica per crittografare senza impegno e consentire la decrittografia di tutti gli oggetti.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 1: V4 Client with V2 compatibility var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT, ContentEncryptionAlgorithm.AesGcm); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Comportamento: cripta senza impegno, può decrittografare sia gli oggetti che effettuano il commit che quelli che non effettuano il commit. Identico al comportamento della V2.

Fase 2: V4 con Key Commitment Writes

Inizia a crittografare con un impegno chiave, mantenendo al contempo la compatibilità con le versioni precedenti per la decrittografia. Questo passaggio utilizza la politica. REQUIRE_ENCRYPT_ALLOW_DECRYPT

avvertimento

Prima di implementare la Fase 2, assicuratevi che tutti i lettori siano stati aggiornati alla Fase 1 o successiva per gestire la crittografia con impegno chiave.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 2: V4 Client with key commitment writes var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT, ContentEncryptionAlgorithm.AesGcmWithCommitment); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Comportamento: cripta con impegno, può decrittografare sia gli oggetti che effettuano il commit che quelli che non effettuano il commit. I nuovi oggetti sono protetti dagli attacchi di sostituzione delle chiavi.

Fase 3: V4 con applicazione completa

Richiede un impegno fondamentale sia per la crittografia che per la decrittografia. Questo passaggio utilizza una REQUIRE_ENCRYPT_REQUIRE_DECRYPT politica per la massima sicurezza.

avvertimento

Prima di implementare la Fase 3, assicuratevi che tutti gli oggetti del sistema siano stati ricrittografati con Key Commitment (Fase 2). Questo passaggio non riuscirà a decrittografare gli oggetti crittografati senza impegno.

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 3: V4 Client with full key commitment enforcement var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT, ContentEncryptionAlgorithm.AesGcmWithCommitment); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });

Comportamento: crittografa con impegno, decrittografa solo gli oggetti crittografati con impegno. Massima sicurezza contro gli attacchi di sostituzione delle chiavi.

Esempi di configurazione aggiuntivi

Questa sezione fornisce esempi aggiuntivi per la configurazione dei client V4 con diverse opzioni durante la migrazione.

Attivazione del supporto Legacy

Per consentire ai client V4 di leggere gli oggetti crittografati dai client V1 e V2, configura il client con una politica di impegno che consenta la decrittografia legacy:

using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; // Configure V4 client to read V1/V2 objects var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.ObjectMetadata }; // This configuration allows: // - Encryption: With commitment (secure) // - Decryption: Both V2 (non-committing) and V4 (committing) objects

Utilizza questa configurazione durante la migrazione quando devi decrittografare oggetti crittografati da client precedenti, garantendo al contempo che i nuovi oggetti siano crittografati con una maggiore sicurezza.

Configurazione del metodo di archiviazione

V4 supporta due metodi di archiviazione per i metadati di crittografia. Scegli il metodo più adatto al tuo caso d'uso:

Metadati degli oggetti (impostazione predefinita)

var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.ObjectMetadata }; // Encryption metadata is stored in S3 object metadata

File di istruzioni

var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.InstructionFile }; // Encryption metadata is stored in a separate S3 object (instruction file)

Da utilizzare InstructionFile quando è necessario conservare i metadati degli oggetti per altri scopi o quando si lavora con oggetti con limitazioni di dimensione dei metadati.

Configurazione della politica di impegno

Scegliete la politica di impegno appropriata in base ai requisiti di sicurezza e alla fase di migrazione:

Fase di migrazione (compatibilità V2)

// For migration: encrypt without commitment, allow all decryption var migrationConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT);

Fase di transizione (consigliata)

// For transition: encrypt with commitment, allow legacy decryption var transitionConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);

Fase di sicurezza completa

// For maximum security: require commitment for both encryption and decryption var secureConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT);

Inizia con FORBID_ENCRYPT_ALLOW_DECRYPT la migrazione iniziale, passa alla fase REQUIRE_ENCRYPT_ALLOW_DECRYPT di transizione e infine utilizza REQUIRE_ENCRYPT_REQUIRE_DECRYPT quando tutti i client sono stati aggiornati e tutti gli oggetti sono stati ricrittografati con impegno.