Especificación del cifrado del servidor con claves administradas por Amazon S3 (SSE-S3) - Amazon Simple Storage Service

Especificación del cifrado del servidor con claves administradas por Amazon S3 (SSE-S3)

Todos los buckets de Amazon S3 tienen el cifrado configurado de forma predeterminada y todos los objetos nuevos cargados en un bucket de S3 se cifran automáticamente en reposo. El cifrado del lado del servidor con claves administradas de Amazon S3 (SSE-S3) es la configuración de cifrado predeterminada para cada bucket de Amazon S3. Para usar otro tipo de cifrado, puede especificar el tipo de cifrado del servidor que se utilizará en las solicitudes PUT de S3 o puede establecer la configuración de cifrado predeterminada en el bucket de destino.

Si desea especificar un tipo de cifrado diferente en sus solicitudes PUT, puede utilizar el cifrado del servidor con claves de AWS Key Management Service (AWS KMS) (SSE-KMS), el cifrado del servidor de doble capa con claves de AWS KMS (DSSE-KMS) o el cifrado del servidor con claves proporcionadas por el cliente (SSE-C). Si desea establecer una configuración de cifrado predeterminada diferente en el bucket de destino, puede usar SSE-KMS o DSSE-KMS.

Puede especificar SSE-S3 mediante la consola de S3, las API de REST, los SDK de AWS y la AWS Command Line Interface (AWS CLI). Para obtener más información, consulte Establecer el comportamiento del cifrado predeterminado del lado del servidor para los buckets de Amazon S3.

En este tema se describe cómo configurar o cambiar el tipo de cifrado que utiliza un objeto mediante la AWS Management Console. Cuando copia un objeto con la consola, Amazon S3 copia el objeto tal cual. Esto significa que si el objeto de origen está cifrado, el objeto de destino también lo está. También puede usar la consola para agregar o cambiar el cifrado de un objeto.

nota
  • Puede cambiar el cifrado de un objeto si el objeto es menor de 5 GB. Si el objeto es mayor de 5 GB, debe usar la AWS CLI o los AWS SDK para cambiar el cifrado de un objeto.

  • Para obtener una lista de los permisos adicionales necesarios para cambiar el cifrado de un objeto, consulte Permisos necesarios para las operaciones de la API de Amazon S3. Para ver políticas de ejemplo que conceden estos permisos, consulte Ejemplos de políticas basadas en identidad para Amazon S3.

  • Si cambia el cifrado de un objeto, se crea un nuevo objeto para reemplazar el antiguo. Si el control de versiones de S3 está activado, se crea una nueva versión del objeto y el objeto existente se convierte en una versión anterior. El rol que cambia la propiedad también se convierte en el propietario del nuevo objeto o (versión del objeto).

Para cambiar el cifrado de un objeto
  1. Inicie sesión AWS Management Console Management Console y abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. En el panel de navegación, elija Buckets y, a continuación, la pestaña Buckets de uso general. Desplácese hasta el bucket o la carpeta de Amazon S3 que contiene los objetos que desea cambiar.

  3. Seleccione la casilla de verificación de los objetos que desea cambiar.

  4. En el menú Acciones, elija Editar cifrado del servidor en la lista de opciones que aparece.

  5. Desplácese hasta la sección Cifrado del servidor.

  6. En Configuración del cifrado, elija Usar la configuración del bucket para el cifrado predeterminado o Anular la configuración del bucket para el cifrado predeterminado.

  7. Si elige Anular la configuración del bucket para el cifrado predeterminado, debe configurar los siguientes ajustes de cifrado.

    1. En Tipo de cifrado, elija Cifrado del servidor con claves administradas por Amazon S3 (SSE-S3). SSE-S3 utiliza uno de los cifrados de bloques más seguros, Advanced Encryption Standard de 256 bits (AES-256), para cifrar cada objeto. Para obtener más información, consulte Uso del cifrado del servidor con claves administradas por Amazon S3 (SSE-S3).

  8. En Configuración de copia adicional, elija si desea Copiar la configuración de origen, No especificar la configuración o Especificar la configuración. Copiar la configuración de origen es la opción predeterminada. Si solo desea copiar el objeto sin los atributos de configuración de origen, elija No especificar la configuración. Elija Especificar la configuración para especificar la configuración de la clase de almacenamiento, las ACL, las etiquetas de objetos, los metadatos, el cifrado del servidor y las sumas de comprobación adicionales.

  9. Elija Guardar cambios.

nota

En esta acción se aplica el cifrado a todos los objetos especificados. Al cifrar carpetas, espere a que finalice la operación de guardado para agregar nuevos objetos a la carpeta.

Al crear un objeto, es decir, cuando carga un objeto nuevo o hace una copia de un objeto existente, puede especificar si desea que Amazon S3 cifre los datos con claves administradas de Amazon S3 (SSE-S3) al agregar el encabezado x-amz-server-side-encryption en la solicitud. Configure el valor del encabezado para el algoritmo de cifrado AES256 que admite Amazon S3. Amazon S3 confirma que su objeto se ha almacenado con SSE-S3 al devolver el encabezado de respuesta x-amz-server-side-encryption.

Las siguientes operaciones de la API de carga de REST aceptan el encabezado de solicitud x-amz-server-side-encryption.

Cuando cargue objetos grandes con la operación de la API de carga multiparte, puede especificar el cifrado del lado del servidor añadiendo el encabezado x-amz-server-side-encryption a la solicitud Iniciar carga multiparte. Cuando copie un objeto existente, independientemente de si el objeto de origen está cifrado o no, el objeto de destino no estará cifrado, a no ser que solicite explícitamente el cifrado del lado del servidor.

Los encabezados de respuesta de las siguientes operaciones de la API de REST devuelven el encabezado x-amz-server-side-encryption cuando un objeto se almacena con SSE-S3.

nota

No envíe encabezados de solicitud de cifrado para las solicitudes GET y HEAD si el objeto utiliza SSE-S3, porque recibirá un error de código de error HTTP 400 (Solicitud errónea).

Si utiliza los SDK de AWS, puede solicitar a Amazon S3 que utilice el cifrado del lado del servidor con claves de cifrado administradas por Amazon S3 (SSE-S3). En esta sección, se proporcionan ejemplos de uso de los AWS SDK en diferentes lenguajes. Para obtener información acerca de otros SDK, consulte Código de muestra y bibliotecas.

Java

Cuando use el AWS SDK for Java para cargar un objeto, puede usar SSE-S3 para cifrarlo. Para solicitar cifrado del lado del servidor utilice la propiedad ObjectMetadata de la PutObjectRequest para establecer el encabezado de solicitud x-amz-server-side-encryption. Cuando llama al método putObject() del AmazonS3Client, Amazon S3 cifra y guarda los datos.

También puede solicitar el cifrado SSE-S3 cuando cargue objetos con la operación de la API de carga multiparte:

  • Al usar la operación de la API de carga multiparte de nivel alto, utiliza los métodos TransferManager para aplicar cifrado del lado del servidor a los objetos a medida que los carga. Puede utilizar cualquier método de carga que tome ObjectMetadata como parámetro. Para obtener más información, consulte Carga de un objeto con la carga multiparte.

  • Cuando utiliza la operación de la API de carga multiparte de nivel bajo, especifica el cifrado del lado del servidor al iniciar la carga multiparte. Añade la propiedad ObjectMetadata al llamar al método InitiateMultipartUploadRequest.setObjectMetadata(). Para obtener más información, consulte Uso de los AWS SDK (API de bajo nivel).

No puede cambiar directamente el estado de cifrado de un objeto (cifrado de un objeto no cifrado o descifrado de un objeto cifrado). Para cambiar el estado de cifrado de un objeto, realice una copia del objeto, especifique el estado de cifrado deseado para la copia y elimine el objeto original. Amazon S3 cifra el objeto copiado solo si solicita explícitamente el cifrado del lado del servidor. Para solicitar el cifrado del objeto copiado por medio de la API de Java, use la propiedad ObjectMetadata para especificar el cifrado del lado del servidor en la CopyObjectRequest.

ejemplo Ejemplo

En el siguiente ejemplo se muestra cómo establecer el cifrado del lado del servidor con el AWS SDK for Java. Se muestra cómo realizar las siguientes tareas:

  • Cargue un objeto nuevo mediante SSE-S3.

  • Cambiar el estado de cifrado de un objeto (en este ejemplo, cifrar un objeto que no estaba cifrado anteriormente) copiando el objeto.

  • Comprobar el estado de cifrado del objeto.

Para obtener más información acerca del cifrado del lado del servidor, consulte Uso de la API de REST. Para obtener instrucciones sobre cómo crear y probar una muestra funcional, consulte Introducción en la Guía del desarrollador de AWS SDK for Java.

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

Cuando carga un objeto, puede indicar a Amazon S3 que lo cifre. Para cambiar el estado de cifrado de un objeto existente, realice una copia del objeto y elimine el objeto de origen. De forma predeterminada la operación de copia cifra el destino solo si usted solicita explícitamente cifrado del lado del servidor del objeto de destino. Para especificar SSE-S3 en el CopyObjectRequest, añada lo siguiente:

ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256

Para obtener una muestra funcional que indica cómo copiar un objeto, consulte Uso de los AWS SDK.

En el siguiente ejemplo se carga un objeto. En la solicitud, el ejemplo indica a Amazon S3 que cifre el objeto. A continuación el ejemplo recupera los metadatos de los objetos y comprueba el método de cifrado que se utilizó. Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte Introducción al SDK de AWS para .NET en la Guía para desarrolladores del SDK de AWS para .NET.

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

En este tema se explica cómo usar las clases de la versión 3 de AWS SDK for PHP para agregar SSE-S3 a objetos que cargue a Amazon S3. Para obtener más información acerca de la API del SDK de AWS para Ruby, consulte SDK de AWS para Ruby, versión 2.

Para cargar un objeto en Amazon S3, use el método Aws\S3\S3Client::putObject(). Para añadir el encabezado de solicitud x-amz-server-side-encryption a su solicitud de carga, especifique el parámetro ServerSideEncryption con el valor AES256, como se muestra en el siguiente ejemplo de código. Para obtener información acerca de solicitudes de cifrado del lado del servidor, consulte Uso de la API de 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', ]);

Como respuesta, Amazon S3 devuelve el encabezado x-amz-server-side-encryption con el valor del algoritmo de cifrado que se utilizó para cifrar los datos del objeto.

Cuando carga objetos grandes con la operación de la API de carga multiparte, puede especificar SSE-S3 para los objetos que está cargando, como sigue:

  • Cuando utilice la operación de la API de carga multiparte de bajo nivel, especifique el cifrado del lado del servidor al llamar al método Aws\S3\S3Client::createMultipartUpload(). Para agregar el encabezado de solicitud x-amz-server-side-encryption a su solicitud, especifique la clave del parámetro de la array ServerSideEncryption con el valor AES256. Para obtener más información sobre la operación de la API de carga multiparte de bajo nivel, consulte Uso de los AWS SDK (API de bajo nivel).

  • Cuando utilice la operación de la API de carga multiparte de alto nivel, especifique el cifrado del lado del servidor mediante el parámetro ServerSideEncryption de la operación de la API CreateMultipartUpload. Para ver un ejemplo sobre cómo usar el método setOption() con la operación de la API de carga multiparte de alto nivel, consulte Carga de un objeto con la carga multiparte.

Para determinar el estado de cifrado de un objeto existente, recupere los metadatos del objeto llamando al método Aws\S3\S3Client::headObject() como se muestra en el siguiente ejemplo de código PHP.

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

Para cambiar el estado de cifrado de un objeto existente, realice una copia del objeto con el método Aws\S3\S3Client::copyObject() y elimine el objeto de origen. De forma predeterminada, copyObject() no cifra el objeto de destino, a menos que solicite de forma explícita el cifrado del lado del servidor con el parámetro ServerSideEncryption con el valor AES256. El siguiente ejemplo de código PHP realiza una copia de un objeto y agrega cifrado en el servidor al objeto copiado.

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

Para obtener más información, consulte los temas siguientes:

Ruby

Si utiliza AWS SDK for Ruby para cargar un objeto, puede especificar que el objeto se almacene cifrado en reposo con SSE-S3. Cuando vuelve a leer el objeto, este se descifra automáticamente.

En el siguiente ejemplo de AWS SDK for Ruby versión 3 se muestra cómo especificar que un archivo cargado en Amazon S3 quede cifrado en reposo.

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 # Example usage: def run_demo bucket_name = "amzn-s3-demo-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__

El siguiente ejemplo de código muestra cómo determinar el estado de cifrado de un objeto existente.

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 object @object.get rescue Aws::Errors::ServiceError => e puts "Couldn't get object #{@object.key}. Here's why: #{e.message}" end end # Example usage: def run_demo bucket_name = "amzn-s3-demo-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 no se utiliza el cifrado del lado del servidor para el objeto almacenado en Amazon S3, el método devolverá null.

Para cambiar el estado de cifrado de un objeto existente, realice una copia del objeto y elimine el objeto de origen. De forma predeterminada, los métodos de copia no cifran el objeto de destino, a menos que solicite de forma explícita el cifrado del lado del servidor. Puede solicitar el cifrado del objeto de destino al especificar el valor server_side_encryption en el argumento hash de la opción, tal como se muestra en el siguiente código de ejemplo de Ruby. El ejemplo de código muestra cómo copiar un objeto y cifrar la copia con SSE-S3.

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 # Example usage: def run_demo source_bucket_name = "amzn-s3-demo-bucket1" source_key = "my-source-file.txt" target_bucket_name = "amzn-s3-demo-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__

Para especificar SSE-S3 al cargar un objeto mediante la AWS CLI, utilice el siguiente ejemplo.

aws s3api put-object --bucket amzn-s3-demo-bucket1 --key object-key-name --server-side-encryption AES256 --body file path

Para obtener más información, consulte put-object en la Referencia de la AWS CLI. Para especificar SSE-S3 al copiar un objeto mediante la AWS CLI, consulte copy-object.

Para obtener ejemplos de configuración de cifrado mediante AWS CloudFormation, consulte Crear un bucket con cifrado predeterminado y Crear un bucket mediante el cifrado del lado del servidor AWS KMS con una clave de bucket de S3 en el tema AWS::S3::Bucket ServerSideEncryptionRule de la Guía del usuario de AWS CloudFormation.