Spécification du chiffrement Amazon S3 - Amazon Simple Storage Service

Spécification du chiffrement Amazon S3

Lorsque vous créez un objet, vous pouvez spécifier l'utilisation du chiffrement côté serveur avec des clés de chiffrement gérées par Amazon S3 pour chiffrer vos données. Cela est vrai lorsque vous chargez un nouvel objet ou copiez un objet existant. Ce chiffrement est connu sous le nom de SSE-S3.

Vous pouvez spécifier SSE-S3 à l'aide de la console S3, des API REST, des kits SDK AWS et d'AWS CLI. Pour plus d'informations, consultez les rubriques ci-dessous.

Pour obtenir un exemple pratique sur la façon de copier un objet sans chiffrement, consultez Copie d'objets.

Cette rubrique décrit comment définir ou modifier le type de chiffrement qu'un objet utilise à l'aide de la AWS Management Console. Lorsque vous copiez un objet à l'aide de la console, celle-ci copie l'objet en l'état. Cela signifie que si la source est chiffrée, l'objet cible est également chiffré. La console vous permet également d'ajouter ou de modifier le chiffrement d'un objet.

Note

Si vous modifiez le chiffrement d'un objet, un nouvel objet est créé pour remplacer l'ancien. Si la gestion des versions S3 est activée, une nouvelle version de l'objet est créée et l'objet existant devient une version plus ancienne. Le rôle qui modifie la propriété devient également le propriétaire du nouvel objet ou (version de l'objet).

Pour ajouter ou modifier le chiffrement d'un objet

  1. Connectez-vous à la AWS Management Console et ouvrez la console Amazon S3 à la page https://console.aws.amazon.com/s3/.

  2. Dans la liste Buckets (Compartiments), choisissez le nom du compartiment qui contient l'objet.

  3. Dans la liste Objets, choisissez le nom de l'objet pour lequel vous souhaitez ajouter ou modifier le chiffrement.

    La Présentation de l'objet s'ouvre et affiche les propriétés de votre objet.

  4. Sous Paramètres de chiffrement côté serveur, choisissez Modifier.

    La page Modifier le chiffrement côté serveur s'ouvre.

  5. Pour activer le chiffrement côté serveur pour votre objet, sous Chiffrement côté serveur, choisissez Activer.

  6. Pour activer le chiffrement côté serveur à l'aide d'une clé gérée par Amazon S3, sous Encryption key type (Type de clé de chiffrement), choisissez Amazon S3 key (SSE-S3) (Clé Amazon S3 (SSE-S3)).

    Pour en savoir plus sur l'utilisation du chiffrement côté serveur Amazon S3 pour chiffrer vos données, consultez Protection des données à l'aide du chiffrement côté serveur avec des clés de chiffrement gérées par Amazon S3 (SSE-S3).

  7. Sélectionnez Save Changes (Enregistrer les modifications).

Note

Cette action applique le chiffrement à tous les objets spécifiés. Lors du chiffrement de dossiers, attendez la fin de l'opération d'enregistrement pour ajouter de nouveaux objets au dossier.

Lors de la création d'un objet (c'est-à-dire lorsque vous chargez un nouvel objet ou effectuez une copie d'un objet existant), vous pouvez spécifier si vous souhaitez qu'Amazon S3 chiffre vos données en ajoutant l'en-tête x-amz-server-side-encryption à la demande. Définissez la valeur de l'en-tête sur l'algorithme de chiffrement AES256 pris en charge par Amazon S3. Amazon S3 confirme que l'objet est stocké avec un chiffrement côté serveur en renvoyant l'en-tête de réponse x-amz-server-side-encryption.

Les API de chargement REST suivantes acceptent l'en-tête de demande x-amz-server-side-encryption.

Lors du chargement d'objets volumineux à l'aide de l'API de chargement partitionné, vous pouvez spécifier un chiffrement côté serveur en ajoutant l'en-tête x-amz-server-side-encryption à la demande de lancement de chargement partitionné. Lorsque vous copiez un objet existant, que l'objet source soit chiffré ou non, l'objet cible n'est pas chiffré sauf si vous demandez explicitement un chiffrement côté serveur.

Les en-têtes de réponse des API REST suivantes renvoient l'en-tête x-amz-server-side-encryption lorsqu'un objet est stocké grâce au chiffrement côté serveur.

Note

Les en-têtes de demande de chiffrement ne doivent pas être envoyés pour les demandes GET et HEAD si l'objet utilise SSE-S3 ou vous obtiendrez une erreur HTTP 400 (Demande erronée).

Lorsque vous utilisez des kits AWS SDK, vous pouvez demander à Amazon S3 d'utiliser des clés de chiffrement gérées par Amazon S3. Cette section fournit des exemples d'utilisation des kits AWS SDK dans plusieurs langues. Pour de plus amples informations sur les autres kits SDK, veuillez consulter Exemples de code et de bibliothèques.

Java

Lorsque vous chargez un objet à l'aide du kit AWS SDK for Java, vous pouvez utiliser le chiffrement côté serveur pour le chiffrer. Pour demander un chiffrement côté serveur, utilisez la propriété ObjectMetadata de la demande PutObjectRequest pour définir l'en-tête de demande x-amz-server-side-encryption. Lorsque vous appelez la méthode putObject() du AmazonS3Client, Amazon S3 chiffre et enregistre les données.

Vous pouvez également demander le chiffrement côté serveur lors du chargement d'objet avec l'API de chargement partitionné :

  • Lorsque vous utilisez l'API de chargement partitionné de haut niveau, vous utilisez les méthodes TransferManager pour appliquer le chiffrement côté serveur aux objets à mesure que vous les chargez. Vous pouvez utiliser n'importe quelle méthode de chargement qui accepte ObjectMetadata comme paramètre. Pour de plus amples informations, veuillez consulter Chargement d'un objet à l'aide du chargement partitionné.

  • Lorsque vous utilisez l'API de chargement partitionné de bas niveau, vous spécifiez le chiffrement côté serveur quand vous lancez le chargement partitionné. Vous ajoutez la propriété ObjectMetadata en appelant la méthode InitiateMultipartUploadRequest.setObjectMetadata(). Pour de plus amples informations, veuillez consulter Utilisation des kits AWS SDK (API de bas niveau).

Vous ne pouvez pas modifier directement l'état de chiffrement d'un objet (chiffrer un objet non chiffré ou déchiffrer un objet chiffré). Pour modifier l'état de chiffrement d'un objet, vous effectuez une copie de l'objet, en spécifiant l'état de chiffrement voulu pour la copie, puis supprimez l'objet d'origine. Amazon S3 chiffre l'objet copié uniquement si vous demandez explicitement un chiffrement côté serveur. Pour demander le chiffrement de l'objet copié via l'API Java, utilisez la propriété ObjectMetadata pour spécifier le chiffrement côté serveur dans la demande CopyObjectRequest.

Exemple Example (Exemple)

L'exemple suivant illustre comment définir le chiffrement côté serveur à l'aide du kit AWS SDK for Java. Il explique comment effectuer les tâches suivantes :

  • Charger un nouvel objet à l'aide du chiffrement côté serveur.

  • Modifier l'état de chiffrement d'un objet (dans cet exemple, chiffrer un objet précédemment non chiffré) en effectuant une copie de l'objet.

  • Vérifier l'état de chiffrement de l'objet.

Pour de plus amples informations sur le chiffrement côté serveur, veuillez consulter Utilisation de l'API REST. Pour obtenir les instructions sur la création et le test d'un exemple pratique, consultez Test des exemples de code Java Amazon S3.

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.internal.SSEResultBase; import com.amazonaws.services.s3.model.*; import java.io.ByteArrayInputStream; public class SpecifyServerSideEncryption { public static void main(String[] args) { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String keyNameToEncrypt = "*** Key name for an object to upload and encrypt ***"; String keyNameToCopyAndEncrypt = "*** Key name for an unencrypted object to be encrypted by copying ***"; String copiedObjectKeyName = "*** Key name for the encrypted copy of the unencrypted object ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withRegion(clientRegion) .withCredentials(new ProfileCredentialsProvider()) .build(); // Upload an object and encrypt it with SSE. uploadObjectWithSSEEncryption(s3Client, bucketName, keyNameToEncrypt); // Upload a new unencrypted object, then change its encryption state // to encrypted by making a copy. changeSSEEncryptionStatusByCopying(s3Client, bucketName, keyNameToCopyAndEncrypt, copiedObjectKeyName); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } private static void uploadObjectWithSSEEncryption(AmazonS3 s3Client, String bucketName, String keyName) { String objectContent = "Test object encrypted with SSE"; byte[] objectBytes = objectContent.getBytes(); // Specify server-side encryption. ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(objectBytes.length); objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION); PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, new ByteArrayInputStream(objectBytes), objectMetadata); // Upload the object and check its encryption status. PutObjectResult putResult = s3Client.putObject(putRequest); System.out.println("Object \"" + keyName + "\" uploaded with SSE."); printEncryptionStatus(putResult); } private static void changeSSEEncryptionStatusByCopying(AmazonS3 s3Client, String bucketName, String sourceKey, String destKey) { // Upload a new, unencrypted object. PutObjectResult putResult = s3Client.putObject(bucketName, sourceKey, "Object example to encrypt by copying"); System.out.println("Unencrypted object \"" + sourceKey + "\" uploaded."); printEncryptionStatus(putResult); // Make a copy of the object and use server-side encryption when storing the copy. CopyObjectRequest request = new CopyObjectRequest(bucketName, sourceKey, bucketName, destKey); ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION); request.setNewObjectMetadata(objectMetadata); // Perform the copy operation and display the copy's encryption status. CopyObjectResult response = s3Client.copyObject(request); System.out.println("Object \"" + destKey + "\" uploaded with SSE."); printEncryptionStatus(response); // Delete the original, unencrypted object, leaving only the encrypted copy in Amazon S3. s3Client.deleteObject(bucketName, sourceKey); System.out.println("Unencrypted object \"" + sourceKey + "\" deleted."); } private static void printEncryptionStatus(SSEResultBase response) { String encryptionStatus = response.getSSEAlgorithm(); if (encryptionStatus == null) { encryptionStatus = "Not encrypted with SSE"; } System.out.println("Object encryption status is: " + encryptionStatus); } }
.NET

Lorsque vous chargez un objet, vous pouvez indiquer à Amazon S3 de le chiffrer. Pour modifier l'état de chiffrement d'un objet existant, vous effectuez une copie de l'objet et supprimez l'objet source. Par défaut, l'opération de copie ne chiffre la cible que si vous demandez explicitement un chiffrement côté serveur de l'objet cible. Pour spécifier le chiffrement côté serveur dans la demande CopyObjectRequest, ajoutez ce qui suit :

ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256

Pour obtenir un exemple pratique sur la façon de copier un objet, consultez Utilisation de SDK AWS.

L'exemple suivant permet de charger un objet. Dans la demande, l'exemple indique à Amazon S3 de chiffrer l'objet. L'exemple récupère ensuite les métadonnées de l'objet et vérifie la méthode de chiffrement utilisée. Pour obtenir des informations sur la façon de créer et de tester un exemple pratique, consultez Exécution des exemples de code .NET Amazon S3.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class SpecifyServerSideEncryptionTest { private const string bucketName = "*** bucket name ***"; private const string keyName = "*** key name for object created ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); WritingAnObjectAsync().Wait(); } static async Task WritingAnObjectAsync() { try { var putRequest = new PutObjectRequest { BucketName = bucketName, Key = keyName, ContentBody = "sample text", ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256 }; var putResponse = await client.PutObjectAsync(putRequest); // Determine the encryption state of an object. GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest { BucketName = bucketName, Key = keyName }; GetObjectMetadataResponse response = await client.GetObjectMetadataAsync(metadataRequest); ServerSideEncryptionMethod objectEncryption = response.ServerSideEncryptionMethod; Console.WriteLine("Encryption method used: {0}", objectEncryption.ToString()); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } } }
PHP

Cette rubrique explique comment utiliser les classes de la version 3 du kit AWS SDK for PHP pour ajouter un chiffrement côté serveur aux objets que vous chargez vers Amazon Simple Storage Service (Amazon S3). Nous partons du principe que vous suivez déjà les instructions pour Utilisation du kit AWS SDK for PHP et exécution d'exemples PHP et que le kit AWS SDK for PHP est correctement installé.

Pour charger un objet dans Amazon S3, utilisez la méthode Aws\S3\S3Client::putObject(). Pour ajouter l'en-tête de demande x-amz-server-side-encryption à votre demande de chargement, spécifiez le paramètre ServerSideEncryption avec la valeur AES256 comme illustré dans l'exemple de code suivant. Pour plus d'informations sur les demandes de chiffrement côté serveur, consultez Utilisation de l'API REST.

require 'vendor/autoload.php'; use Aws\S3\S3Client; $bucket = '*** Your Bucket Name ***'; $keyname = '*** Your Object Key ***'; // $filepath should be an absolute path to a file on disk. $filepath = '*** Your File Path ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); // Upload a file with server-side encryption. $result = $s3->putObject([ 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => $filepath, 'ServerSideEncryption' => 'AES256', ]);

En réponse, Amazon S3 renvoie l'en-tête x-amz-server-side-encryption avec la valeur de l'algorithme de chiffrement qui a été utilisé pour chiffrer les données de l'objet.

Lorsque vous chargez des objets volumineux à l'aide de l'API de chargement partitionné, vous pouvez spécifier un chiffrement côté serveur pour les objets que vous chargez, comme suit :

  • Lorsque vous utilisez l'API de chargement partitionné de bas niveau, spécifiez le chiffrement côté serveur lorsque vous appelez la méthode Aws\S3\S3Client::createMultipartUpload(). Pour ajouter l'en-tête x-amz-server-side-encryption à la demande, spécifiez le paramètre array avec la clé ServerSideEncryption en lui donnant la valeur AES256. Pour de plus amples informations sur l'API de chargement partitionné de bas niveau, veuillez consulter Utilisation des kits AWS SDK (API de bas niveau).

  • Si vous utilisez l'API de chargement partitionné de haut niveau, spécifiez le chiffrement côté serveur à l'aide du paramètre ServerSideEncryption de la méthode CreateMultipartUpload. Pour obtenir un exemple d'utilisation de la méthode setOption() avec l'API de chargement partitionné de haut niveau, veuillez consulter Chargement d'un objet à l'aide du chargement partitionné.

Pour déterminer l'état de chiffrement d'un objet existant, récupérez les métadonnées d'objet en appelant la méthode Aws\S3\S3Client::headObject() comme illustré dans l'exemple de code PHP suivant.

require 'vendor/autoload.php'; use Aws\S3\S3Client; $bucket = '*** Your Bucket Name ***'; $keyname = '*** Your Object Key ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); // Check which server-side encryption algorithm is used. $result = $s3->headObject([ 'Bucket' => $bucket, 'Key' => $keyname, ]); echo $result['ServerSideEncryption'];

Pour changer l'état de chiffrement dans un objet existant, faites une copie de l'objet grâce à la méthode Aws\S3\S3Client::copyObject() et supprimez l'objet source. Par défaut copyObject() ne chiffre pas la cible, sauf si vous demandez explicitement un chiffrement côté serveur de l'objet de destination à l'aide du paramètre ServerSideEncryption avec la valeur AES256. L'exemple de code PHP suivant fait une copie d'un objet et ajoute un chiffrement côté serveur à l'objet copié.

require 'vendor/autoload.php'; use Aws\S3\S3Client; $sourceBucket = '*** Your Source Bucket Name ***'; $sourceKeyname = '*** Your Source Object Key ***'; $targetBucket = '*** Your Target Bucket Name ***'; $targetKeyname = '*** Your Target Object Key ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); // Copy an object and add server-side encryption. $s3->copyObject([ 'Bucket' => $targetBucket, 'Key' => $targetKeyname, 'CopySource' => "{$sourceBucket}/{$sourceKeyname}", 'ServerSideEncryption' => 'AES256', ]);
Ruby

Lorsque vous utilisez le kit AWS SDK for Ruby pour charger un objet, vous pouvez spécifier que l'objet soit stocké chiffré au repos avec le chiffrement côté serveur (SSE). Lorsque vous relisez l'objet, il est automatiquement déchiffré.

L'exemple de script AWS SDK for Ruby – Version 3 suivant montre comment spécifier qu'un fichier chargé sur Amazon S3 soit chiffré au repos.

require "aws-sdk-s3" # Wraps Amazon S3 object actions. class ObjectPutSseWrapper attr_reader :object # @param object [Aws::S3::Object] An existing Amazon S3 object. def initialize(object) @object = object end def put_object_encrypted(object_content, encryption) @object.put(body: object_content, server_side_encryption: encryption) true rescue Aws::Errors::ServiceError => e puts "Couldn't put your content to #{object.key}. Here's why: #{e.message}" false end end def run_demo bucket_name = "doc-example-bucket" object_key = "my-encrypted-content" object_content = "This is my super-secret content." encryption = "AES256" wrapper = ObjectPutSseWrapper.new(Aws::S3::Object.new(bucket_name, object_content)) return unless wrapper.put_object_encrypted(object_content, encryption) puts "Put your content into #{bucket_name}:#{object_key} and encrypted it with #{encryption}." end run_demo if $PROGRAM_NAME == __FILE__

Pour obtenir un exemple pratique illustrant la façon de charger un objet sans SSE, consultez Chargement d'objets.

L'exemple de code suivant montre comment déterminer l'état de chiffrement d'un objet existant.

require "aws-sdk-s3" # Wraps Amazon S3 object actions. class ObjectGetEncryptionWrapper attr_reader :object # @param object [Aws::S3::Object] An existing Amazon S3 object. def initialize(object) @object = object end # Gets the object into memory. # # @return [Aws::S3::Types::GetObjectOutput, nil] The retrieved object data if successful; otherwise nil. def get_object @object.get rescue Aws::Errors::ServiceError => e puts "Couldn't get object #{@object.key}. Here's why: #{e.message}" end end # Replace bucket name and object key with an existing bucket and object that you own. def run_demo bucket_name = "doc-example-bucket" object_key = "my-object.txt" wrapper = ObjectGetEncryptionWrapper.new(Aws::S3::Object.new(bucket_name, object_key)) obj_data = wrapper.get_object return unless obj_data encryption = obj_data.server_side_encryption.nil? ? "no" : obj_data.server_side_encryption puts "Object #{object_key} uses #{encryption} encryption." end run_demo if $PROGRAM_NAME == __FILE__

Si un chiffrement côté serveur n'est pas utilisé pour l'objet stocké dans Amazon S3, la méthode renvoie null.

Pour modifier l'état de chiffrement d'un objet existant, effectuez une copie de l'objet et supprimez l'objet source. Par défaut, les méthodes de copie ne chiffrent la cible que si vous demandez explicitement un chiffrement côté serveur. Vous pouvez demander le chiffrement de l'objet cible en spécifiant la valeur server_side_encryption dans l'argument de hachage d'options, comme illustré dans l'exemple de code Ruby suivant. L'exemple de code suivant montre comment copier un objet et chiffrer la copie.

require "aws-sdk-s3" # Wraps Amazon S3 object actions. class ObjectCopyEncryptWrapper attr_reader :source_object # @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for # copy actions. def initialize(source_object) @source_object = source_object end # Copy the source object to the specified target bucket, rename it with the target key, and encrypt it. # # @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied. # @param target_object_key [String] The key to give the copy of the object. # @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil. def copy_object(target_bucket, target_object_key, encryption) @source_object.copy_to(bucket: target_bucket.name, key: target_object_key, server_side_encryption: encryption) target_bucket.object(target_object_key) rescue Aws::Errors::ServiceError => e puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}" end end # Replace the source and target bucket names with existing buckets you own and replace the source object key # with an existing object in the source bucket. def run_demo source_bucket_name = "doc-example-bucket1" source_key = "my-source-file.txt" target_bucket_name = "doc-example-bucket2" target_key = "my-target-file.txt" target_encryption = "AES256" source_bucket = Aws::S3::Bucket.new(source_bucket_name) wrapper = ObjectCopyEncryptWrapper.new(source_bucket.object(source_key)) target_bucket = Aws::S3::Bucket.new(target_bucket_name) target_object = wrapper.copy_object(target_bucket, target_key, target_encryption) return unless target_object puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key} and "\ "encrypted the target with #{target_object.server_side_encryption} encryption." end run_demo if $PROGRAM_NAME == __FILE__

Pour spécifier SSE-S3 lorsque vous chargez un objet à l'aide d'AWS CLI, utilisez l'exemple suivant.

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET1 --key object-key-name --server-side-encryption AES256 --body file path

Pour plus d'informations, consultez la section put-object dans la Référence de la AWS CLI. Pour spécifier SSE-S3 lorsque vous copiez un objet à l'aide de la AWS CLI, veuillez consulter la section copy-object.

Pour obtenir des exemples de configuration du chiffrement à l'aide de AWS CloudFormation, veuillez consulter les sections Créer un compartiment avec chiffrement par défaut et Créer un compartiment à l'aide du chiffrement côté serveur AWS KMS avec une clé de compartiment S3 du Guide de l'utilisateur AWS CloudFormation.