Chiffrement côté client Amazon S3 avec la AWS SDK for PHP version 3 - AWS SDK for PHP

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.

Chiffrement côté client Amazon S3 avec la AWS SDK for PHP version 3

Avec le chiffrement côté client, les données sont chiffrées et déchiffrées directement dans votre environnement. Cela signifie que ces données sont chiffrées avant d'être transférées vers Amazon S3 et que vous ne comptez pas sur un service externe pour gérer le chiffrement à votre place. Pour les nouvelles implémentations, nous suggérons d'utiliser S3EncryptionClientV2 et de remplacer S3EncryptionMultipartUploaderV2 le obsolète S3EncryptionClient et. S3EncryptionMultipartUploader Il est recommandé que les anciennes implémentations utilisant toujours les versions obsolètes tentent de migrer. S3EncryptionClientV2maintient le support pour le déchiffrement des données chiffrées à l'aide de l'ancienne version. S3EncryptionClient

Le kit AWS SDK for PHP implémente le chiffrement d’enveloppe et utilise OpenSSL pour le chiffrement et le déchiffrement. L’implémentation est interopérable avec d’autres kits SDK qui correspondent à ses fonctions. Elle est également compatible avec le kit SDK du flux de travail asynchrone basé sur les promesses.

Guide de migration

Pour ceux qui essaient de migrer des clients obsolètes vers les nouveaux clients, il existe un guide de migration disponible ici.

Installation

Pour démarrer avec le chiffrement côté client, vous avez besoin des éléments suivants :

Avant d'exécuter un exemple de code, configurez vos AWS informations d'identification. Voir Informations d'identification pour la AWS SDK for PHP version 3.

Chiffrement

Le chargement d'un objet chiffré S3EncryptionClientV2 nécessite trois paramètres supplémentaires en plus des PutObject paramètres standard :

  • '@KmsEncryptionContext'est une paire clé-valeur qui peut être utilisée pour ajouter une couche de sécurité supplémentaire à votre objet chiffré. Le client de chiffrement doit transmettre la même clé, ce qu'il fera automatiquement lors d'un appel get. Si aucun contexte supplémentaire n'est souhaité, transmettez un tableau vide.

  • @CipherOptionssont des configurations supplémentaires pour le chiffrement, notamment le chiffrement à utiliser et la taille de la clé.

  • @MaterialsProviderest un fournisseur qui gère la génération d'une clé de chiffrement et d'un vecteur d'initialisation, ainsi que le chiffrement de votre clé de chiffrement.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV2; // Let's construct our S3EncryptionClient using an S3Client $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, // Additional configuration options ]; $result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
Note

Outre Amazon S3 et les erreurs de service AWS KMS basées sur Amazon, vous pouvez recevoir des InvalidArgumentException objets renvoyés si vous n''@CipherOptions'êtes pas correctement configuré.

Déchiffrement

Le téléchargement et le déchiffrement d'un objet comportent quatre paramètres supplémentaires, dont deux sont obligatoires, en plus des paramètres standard. GetObject Le client détectera les options de chiffrement de base pour vous.

  • '@SecurityProfile': si le paramètre est défini sur « V2 », seuls les objets chiffrés en version compatible avec la version v2

    le format peut être déchiffré. La définition de ce paramètre sur « V2_AND_LEGACY » permet également de déchiffrer les objets chiffrés dans un format compatible avec la version 1. Pour prendre en charge la migration, définissez @ sur « SecurityProfile V2_AND_LEGACY ». Utilisez « V2 » uniquement pour le développement de nouvelles applications.

  • '@MaterialsProvider'est un fournisseur qui gère la génération d'une clé de chiffrement et d'un vecteur d'initialisation, comme

    ainsi que le chiffrement de votre clé de chiffrement.

  • '@KmsAllowDecryptWithAnyCmk': (facultatif) La définition de ce paramètre sur true active le déchiffrement

    sans fournir d'identifiant de clé KMS au constructeur du MaterialsProvider. La valeur par défaut est false.

  • '@CipherOptions'(facultatif) sont des configurations supplémentaires pour le chiffrement, y compris lesquelles

    chiffrement à utiliser et taille de clé.

$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Note

Outre Amazon S3 et les erreurs de service AWS KMS basées sur Amazon, vous pouvez recevoir des InvalidArgumentException objets renvoyés si vous n''@CipherOptions'êtes pas correctement configuré.

Configuration du chiffrement

'Cipher' (chaîne)

Méthode de chiffrement que le client de chiffrement utilise lors du chiffrement. Seul « gcm » est pris en charge pour le moment.

Important

PHP est mis à jour dans la version 7.1 pour inclure les paramètres supplémentaires nécessaires pour chiffrer et déchiffrer à l’aide d’OpenSSL pour le chiffrement GCM. Pour les versions 7.0 et antérieures de PHP, un polyfill pour le support GCM est fourni et utilisé par les clients S3EncryptionClientV2 de chiffrement et. S3EncryptionMultipartUploaderV2 Cependant, les performances pour les entrées volumineuses seront beaucoup plus lentes en utilisant le polyfill qu'en utilisant l'implémentation native de PHP 7.1+. Il peut donc être nécessaire de mettre à niveau les environnements des anciennes versions de PHP pour les utiliser efficacement.

'KeySize' (int)

Longueur de la clé de chiffrement de contenu à générer pour le chiffrement. Valeur par défaut : 256 bits. Les options de configuration valides sont 256 et 128 bits.

'Aad' (chaîne)

« Données d'authentification supplémentaires » facultatives à inclure à votre charge utile chiffrée. Ces informations sont validées sur déchiffrement. Aad est disponible uniquement lorsque vous utilisez le chiffrement « gcm ».

Important

Les données d'authentification supplémentaires ne sont pas prises en charge par tous les AWS SDK et, par conséquent, les autres SDK peuvent ne pas être en mesure de déchiffrer les fichiers chiffrés à l'aide de ce paramètre.

Stratégies de métadonnées

Vous avez également la possibilité de fournir une instance d'une classe qui implémente Aws\Crypto\MetadataStrategyInterface. Cette interface simple gère l'enregistrement et le chargement de Aws\Crypto\MetadataEnvelope qui contient vos supports de chiffrement d'enveloppe. Le kit SDK fournit deux classes qui implémentent ceci : Aws\S3\Crypto\HeadersMetadataStrategy et Aws\S3\Crypto\InstructionFileMetadataStrategy. HeadersMetadataStrategy est utilisé par défaut.

$strategy = new InstructionFileMetadataStrategy( $s3Client ); $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => $strategy, '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V2', '@MetadataStrategy' => $strategy, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

Les constantes de nom de classe HeadersMetadataStrategy et InstructionFileMetadataStrategy peuvent également être fournies en appelant ::class.

$result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => HeadersMetadataStrategy::class, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
Note

En cas d'échec après chargement d'un fichier d'instructions, il ne sera pas automatiquement supprimé.

Téléchargements en plusieurs parties

Il est également possible d'exécuter un chargement partitionné avec un chiffrement côté client. Aws\S3\Crypto\S3EncryptionMultipartUploaderV2prépare le flux source pour le chiffrement avant le téléchargement. Sa création s'appuie sur une expérience similaire à l'utilisation de Aws\S3\MultipartUploader et de Aws\S3\Crypto\S3EncryptionClientV2. S3EncryptionMultipartUploaderV2 peut traiter la même option '@MetadataStrategy' que S3EncryptionClientV2, ainsi que toutes les configurations '@CipherOptions' disponibles.

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( new KmsClient([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-upload-key'; $cipherOptions = [ 'Cipher' => 'gcm' 'KeySize' => 256, // Additional configuration options ]; $multipartUploader = new S3EncryptionMultipartUploaderV2( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'bucket' => $bucket, 'key' => $key, ] ); $multipartUploader->upload();
Note

Outre Amazon S3 et les erreurs de service AWS KMS basées sur Amazon, vous pouvez recevoir des InvalidArgumentException objets renvoyés si vous n''@CipherOptions'êtes pas correctement configuré.