Migration du client de chiffrement Amazon S3 (V2 vers V3) - AWS SDK pour C++

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Migration du client de chiffrement Amazon S3 (V2 vers V3)

Note

Si vous utilisez la version V1 du client de chiffrement Amazon S3, vous devez d'abord migrer vers la V2 avant de migrer vers la V3. Consultez Migration du client de chiffrement Amazon S3 (V1 vers V2).

Cette rubrique explique comment migrer vos applications de la version 2 (V2) à la version 3 (V3) du client de chiffrement Amazon Simple Storage Service (Amazon S3) et comment garantir la disponibilité des applications tout au long du processus de migration. La version 3 introduit l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme et les politiques d'engagement pour améliorer la sécurité en protégeant contre la falsification des clés de données dans les fichiers d'instructions.

Présentation de la migration

Cette migration s'effectue en deux phases :

1. Mettez à jour les clients existants pour lire les nouveaux formats. Déployez d'abord une version mise AWS SDK pour C++ à jour du dans votre application. Cela permet aux clients de chiffrement V2 existants de déchiffrer les objets écrits par les nouveaux clients V3. Si votre application en utilise plusieurs AWS SDKs, vous devez mettre à niveau chaque SDK séparément.

2. Migrez les clients de chiffrement et de déchiffrement vers la version 3. Une fois que tous vos clients de chiffrement V2 peuvent lire les nouveaux formats, vous pouvez migrer vos clients de chiffrement et de déchiffrement existants vers leurs versions V3 respectives.

Comprendre les concepts de la V3

La version 3 du client de chiffrement Amazon S3 introduit de nouvelles fonctionnalités de sécurité qui améliorent la protection contre la falsification des clés de données. Comprendre ces concepts est essentiel pour une migration réussie.

Politique d'engagement

Les politiques d'engagement contrôlent la manière dont le client de chiffrement gère l'engagement des clés lors des opérations de chiffrement et de déchiffrement. La version 3 propose trois options de politique pour prendre en charge différents scénarios de migration et exigences de sécurité :

FORBID_ENCRYPT_ALLOW_DECRYPT

Comportement de chiffrement : chiffre les objets sans engagement de clé, en utilisant les mêmes algorithmes que la version 2.

Comportement de déchiffrement : permet le déchiffrement d'objets chiffrés avec ou sans clé d'engagement.

Implications en matière de sécurité : cette politique n'impose pas l'engagement des clés et peut autoriser la falsification de la clé de données cryptée dans les fichiers d'instructions. Utilisez cette politique uniquement pendant la phase de migration initiale lorsque vous avez besoin de clients V2 pour lire les objets nouvellement chiffrés.

Compatibilité des versions : les objets chiffrés avec cette politique peuvent être lus par toutes les implémentations V2 et V3.

REQUIRE_ENCRYPT_ALLOW_DECRYPT (par défaut)

Comportement de chiffrement : chiffre les objets avec un engagement clé à l'aide de l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme.

Comportement de déchiffrement : permet de déchiffrer à la fois les objets chiffrés avec clé d'engagement et les objets chiffrés sans engagement clé.

Implications en matière de sécurité : cette politique assure une sécurité renforcée pour les objets récemment chiffrés tout en maintenant la rétrocompatibilité pour la lecture d'objets plus anciens. Il s'agit de la politique recommandée pour la plupart des scénarios de migration.

Compatibilité des versions : les objets chiffrés avec cette politique ne peuvent être lus que par la version 3 et les dernières implémentations de la version 2. Les clients V2 ne peuvent pas déchiffrer ces objets. Toutefois, les clients V3 utilisant cette politique peuvent toujours déchiffrer les objets chiffrés par les clients V2.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Comportement de chiffrement : chiffre les objets avec un engagement clé à l'aide de l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme.

Comportement de déchiffrement : autorise uniquement le déchiffrement des objets chiffrés avec une clé d'engagement. Rejette les objets chiffrés sans engagement de clé.

Implications en matière de sécurité : cette politique fournit le plus haut niveau de sécurité en appliquant un engagement clé pour toutes les opérations. Utilisez cette politique uniquement une fois que tous les objets ont été rechiffrés avec clé d'engagement et que vous n'avez plus besoin de lire les anciens objets chiffrés V1 ou V2.

Compatibilité des versions : les objets chiffrés avec cette politique ne peuvent être lus que par la version 3 et les dernières implémentations de la version 2. En outre, les clients utilisant cette politique ne peuvent pas déchiffrer les objets chiffrés par les clients V1 ou V2.

Considérations relatives à la migration : pendant la migration, commencez par déterminer FORBID_ENCRYPT_ALLOW_DECRYPT si vous avez besoin de clients V2 pour lire de nouveaux objets, puis passez à la version V3 REQUIRE_ENCRYPT_ALLOW_DECRYPT une fois que tous les clients sont passés à la version V3. Enfin, considérez-le REQUIRE_ENCRYPT_REQUIRE_DECRYPT uniquement une fois que tous les anciens objets ont été rechiffrés.

Alg_AES_256_GCM_HKDF_ _COMMIT_KEY SHA512 Algorithme

L'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme est un nouvel algorithme de chiffrement introduit dans la version 3 qui fournit une sécurité renforcée pour les clés de données cryptées stockées dans les fichiers d'instructions.

Impact sur le fichier d'instructions : l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme n'affecte que les fichiers d'instructions, qui sont des objets S3 distincts qui stockent les métadonnées de chiffrement, y compris la clé de données cryptée. Les objets qui stockent des métadonnées de chiffrement dans des métadonnées d'objet (méthode de stockage par défaut) ne sont pas affectés par cette modification d'algorithme.

Protection contre la falsification : l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme protège contre la falsification des clés de données en liant cryptographiquement la clé de données chiffrée au contexte de chiffrement. Cela empêche les attaquants de substituer une autre clé de données cryptée dans le fichier d'instructions, ce qui pourrait mener au déchiffrement par une clé involontaire.

Compatibilité des versions : les objets chiffrés avec l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme ne peuvent être déchiffrés que par les implémentations V3 et les dernières versions de transition V2 du SDK qui incluent le support de déchiffrement V3.

Avertissement

Important : Avant d'activer le chiffrement à l'aide de l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme (en utilisant REQUIRE_ENCRYPT_ALLOW_DECRYPT ou en appliquant des politiques d'REQUIRE_ENCRYPT_REQUIRE_DECRYPTengagement), vous devez vous assurer que tous les clients qui liront ces objets ont été mis à niveau vers la version 3 ou vers la dernière version de transition V2 prenant en charge le déchiffrement V3. Si tous les lecteurs ne sont pas mis à niveau au préalable, le déchiffrement des objets nouvellement chiffrés échouera.

Mettre à jour les clients existants pour lire les nouveaux formats

Vous devez d'abord mettre à jour vos clients existants avec la dernière version du SDK. Une fois cette étape terminée, les clients V2 de votre application seront en mesure de déchiffrer les objets chiffrés par les clients de chiffrement V3 sans mettre à jour le code de base de votre application.

Créez et installez la dernière version du AWS SDK pour C++

Applications consommant le SDK à la source

Si vous créez et installez la source AWS SDK pour C++ à partir de la source, téléchargez ou clonez la source du SDK à partir aws/aws-sdk-cppde GitHub. Répétez ensuite les étapes habituelles de compilation et d'installation.

Si vous effectuez une mise à niveau à AWS SDK pour C++ partir d'une version antérieure à la version 1.11.x, consultez ce CHANGELOG pour connaître les principales modifications apportées à chaque version majeure. Pour plus d'informations sur la création et l'installation du AWS SDK pour C++, consultez Obtenir AWS SDK pour C++ le code source.

Applications consommant le SDK depuis Vcpkg

Si votre application utilise Vcpkg pour suivre les mises à jour du SDK, utilisez simplement votre méthode de mise à niveau Vcpkg existante pour mettre à niveau le SDK vers la dernière version. N'oubliez pas qu'il existe un délai entre le moment où une version est publiée et le moment où elle est disponible via un gestionnaire de packages. La version la plus récente est toujours disponible via l'installation depuis le code source.

Vous pouvez exécuter la commande suivante pour mettre à jour le package aws-sdk-cpp :

vcpkg upgrade aws-sdk-cpp

Et vérifiez la version du package aws-sdk-cpp :

vcpkg list aws-sdk-cpp

La version doit être au moins 1.11.x pour prendre en charge le déchiffrement des objets chiffrés en version 3.

Pour plus d'informations sur l'utilisation de Vcpkg avec le AWS SDK pour C++, consultez. Obtenir le AWS SDK pour C++ depuis un gestionnaire de packages

Créez, installez et déployez vos applications

Si votre application établit un lien statique avec le AWS SDK pour C++, il n'est pas nécessaire de modifier le code de votre application, mais vous devez créer à nouveau votre application pour utiliser les dernières modifications du SDK. Cette étape n'est pas nécessaire pour les liens dynamiques.

Après avoir mis à niveau la version de dépendance de votre application et vérifié le fonctionnement de l'application, procédez au déploiement de votre application dans votre parc. Une fois le déploiement de l'application terminé, vous pouvez passer à la phase suivante de migration de votre application afin d'utiliser les clients de chiffrement et de déchiffrement V3.

Migrer les clients de chiffrement et de déchiffrement vers la version 3

Les étapes suivantes vous montrent comment migrer avec succès votre code de la V2 à la V3 du client de chiffrement Amazon S3. Étant donné que des modifications de code sont nécessaires, vous devrez reconstruire votre application, qu'elle soit liée de manière statique ou dynamique au AWS SDK pour C++.

Utilisation de clients de chiffrement V3

La V3 introduit la S3EncryptionClientV3 classe et remplace CryptoConfigurationV3 les équivalents V2. Les principales différences de la V3 sont les suivantes :

  • La V3 utilise KMSWithContextEncryptionMaterials (comme la V2) mais nécessite une configuration explicite dansCryptoConfigurationV3.

  • Toutes les PutObject opérations nécessitent une carte contextuelle de chiffrement (elle peut être vide).

  • La version 3 introduit des politiques d'engagement pour contrôler le comportement de chiffrement et de déchiffrement.

  • Par défaut, la V3 chiffre avec un engagement clé à l'aide de l'ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgorithme.

  • L'API de configuration de déchiffrement des algorithmes héritée passe de config.SetSecurityProfile(SecurityProfile::V2_AND_LEGACY); àconfig.AllowLegacy();.

Exemple : migration de la V2 vers la V3 avec le chiffrement KMS

Pré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);

Pendant la migration (V3 avec rétrocompatibilité)

// 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);

Après la migration (V3 avec engagement clé)

// 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);

Exemples supplémentaires

Cette section fournit des exemples supplémentaires de configuration des options du client de chiffrement V3 afin de prendre en charge différents scénarios et exigences de migration.

Permettre le support existant

Les clients V3 peuvent déchiffrer les objets chiffrés par les clients V2 uniquement lorsqu'ils utilisent les politiques d'FORBID_ENCRYPT_ALLOW_DECRYPTengagement REQUIRE_ENCRYPT_ALLOW_DECRYPT ou. Toutefois, si vous devez déchiffrer des objets chiffrés par des clients V1, vous devez activer explicitement le support existant à l'aide de AllowLegacy() cette méthode.

Quand utiliser le support existant :

  • Vous avez des objets dans S3 qui ont été chiffrés à l'aide de la version 1 du client de chiffrement S3.

  • Vous devez lire ces objets chiffrés en version 1 avec votre client V3 pendant le processus de migration.

  • Vous utilisez FORBID_ENCRYPT_ALLOW_DECRYPT notre politique REQUIRE_ENCRYPT_ALLOW_DECRYPT d'engagement.

Avertissement

Le support existant ne doit être activé que temporairement pendant la migration. Une fois que tous les objets V1 ont été rechiffrés avec les versions V2 ou V3, désactivez le support existant pour garantir une sécurité maximale.

Exemple : activation du support existant

// 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);

Configuration de la méthode de stockage

Le client de chiffrement S3 peut stocker les métadonnées de chiffrement de deux manières : sous forme de métadonnées d'objet (par défaut) ou dans un fichier d'instructions distinct. Vous pouvez configurer la méthode de stockage à l'aide de la SetStorageMethod() méthode activéeCryptoConfigurationV3.

Options de méthode de stockage :

METADATA (par défaut)

Les métadonnées de chiffrement sont stockées dans les en-têtes de métadonnées de l'objet. Il s'agit de la méthode la plus courante et la plus pratique, car toutes les informations de chiffrement sont stockées avec l'objet lui-même.

Quand utiliser : utilisez cette méthode pour la plupart des scénarios. Cela simplifie la gestion des objets puisque les métadonnées de chiffrement voyagent avec l'objet.

INSTRUCTION_FILE

Les métadonnées de chiffrement sont stockées dans un objet S3 distinct (le fichier d'instructions) avec le suffixe.instruction.

Quand utiliser : utilisez cette méthode lorsque la taille des métadonnées d'un objet pose problème ou lorsque vous devez séparer les métadonnées de chiffrement de l'objet chiffré. Notez que l'utilisation des fichiers d'instructions nécessite de gérer deux objets S3 (l'objet chiffré et son fichier d'instructions) au lieu d'un.

Exemple : configuration de la méthode de stockage

// 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
Note

Lorsque vous utilisez la méthode INSTRUCTION_FILE de stockage, n'oubliez pas que la suppression de l'objet chiffré ne supprime pas automatiquement le fichier d'instructions. Vous devez gérer les deux objets séparément.