Especificar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3) - Amazon Simple Storage Service

Especificar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3)

Todos os buckets do Amazon S3 têm criptografia configurada por padrão e todos os novos objetos que são carregados em um bucket do S3 são automaticamente criptografados em repouso. A criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3) é a configuração de criptografia padrão para todos os buckets no Amazon S3. Para usar um tipo diferente de criptografia, você pode especificar a criptografia do lado do servidor a ser usada nas solicitações PUT do S3 ou definir a configuração de criptografia padrão no bucket de destino.

Se quiser especificar um tipo de criptografia diferente nas solicitações PUT, você pode usar a criptografia do lado do servidor com chaves do AWS Key Management Service (AWS KMS) (SSE-KMS), criptografia de camada dupla do lado do servidor com chaves do AWS KMS (DSSE-KMS) ou criptografia do lado do servidor com chaves fornecidas pelo cliente (SSE-C). Se quiser definir uma configuração de criptografia padrão diferente no bucket de destino, você pode usar SSE-KMS ou DSSE-KMS.

Você pode especificar o SSE-S3 usando o console do S3, APIs REST, AWS SDKs e a AWS Command Line Interface (AWS CLI). Para ter mais informações, consulte Definir o comportamento padrão da criptografia para os buckets do Amazon S3.

Este tópico descreve como definir ou alterar o tipo de criptografia de um objeto usando o AWS Management Console. Ao copiar um objeto usando o console, o Amazon S3 copia o objeto como está. Isso significa que se o objeto de origem é criptografado, o objeto de destino também será criptografado. É possível usar o console para adicionar ou alterar a criptografia para um objeto.

nota
  • Você pode alterar a criptografia de um objeto se ele tiver menos de 5 GB. Se o objeto tiver mais de 5 GB, você deve usar a AWS CLI ou SDKs da AWS para alterar a criptografia de um objeto.

  • Para obter uma lista das permissões adicionais necessárias para alterar a criptografia de um objeto, consulte Permissões obrigatórias para operações de API do Amazon S3. Para ver exemplos das políticas que concedem essas permissões, consulte Exemplos de políticas baseadas em identidade para o Amazon S3.

  • Se você alterar a criptografia de um objeto, um novo objeto será criado para substituir o antigo. Se o versionamento do S3 estiver habilitado, uma nova versão do objeto será criada e o objeto existente se tornará uma versão mais antiga. O perfil que altera a propriedade também se torna o proprietário do novo objeto (ou versão do objeto).

Para alterar a criptografia de um objeto
  1. Faça login no AWS Management Console e abra o console do Amazon S3 em https://console.aws.amazon.com/s3/.

  2. No painel de navegação, escolha Buckets e selecione a guia Buckets de uso geral. Acesse o bucket ou pasta do Amazon S3 que contém os objetos que você quer alterar.

  3. Marque a caixa de seleção referente aos objetos que você quer alterar.

  4. No menu Ações, escolha Editar criptografia no lado do servidor na lista de opções exibida.

  5. Role até a seção Criptografia do lado do servidor.

  6. Em Configurações de criptografia, escolha Usar configurações de bucket para criptografia padrão ou Substituir configurações de bucket para criptografia padrão.

  7. Se você escolher Substituir configurações do bucket para criptografia padrão, defina as configurações de criptografia a seguir.

    1. Em Tipo de criptografia, escolha Criptografia do lado do servidor com chaves de criptografia gerenciadas pelo Amazon S3 (SSE-S3). A SSE-S3 usa uma das criptografias de bloco mais fortes: o padrão de criptografia avançada de 256 bits (AES-256) para criptografar cada objeto. Para ter mais informações, consulte Usar a criptografia do lado do servidor com chaves gerenciadas pelo Amazon S3 (SSE-S3).

  8. Em Configurações adicionais de cópia, escolha se você quer Copiar configurações de origem, Não especificar configurações ou Especificar configurações. Copiar configurações de origem é a opção padrão. Se você quiser copiar o objeto somente sem os atributos das configurações de origem, escolha Não especificar configurações. Escolha Especificar configurações para especificar configurações referentes a classes de armazenamento, ACLs, tags de objeto, metadados, criptografia do lado do servidor e somas de verificação adicionais.

  9. Selecione Save changes.

nota

Essa ação aplica criptografia a todos os objetos especificados. Ao criptografar pastas, aguarde a conclusão da operação de salvamento antes de adicionar novos objetos à pasta.

No momento da criação do objeto (quando você faz upload de um objeto novo ou faz uma cópia de um objeto existente), é possível especificar se deseja que o Amazon S3 criptografe seus dados com as chaves gerenciadas pelo Amazon S3 (SSE-S3) adicionando o cabeçalho x-amz-server-side-encryption à solicitação. Defina o valor do cabeçalho como o algoritmo de criptografia AES256, que é compatível com o Amazon S3. O Amazon S3 confirma que o objeto foi armazenado com SSE-S3 retornando o cabeçalho de resposta x-amz-server-side-encryption.

As seguintes operações de APIs de upload REST aceitam o cabeçalho de solicitação x-amz-server-side-encryption.

Ao fazer upload de objetos grandes usando a operação de API de upload de várias partes, você pode especificar a criptografia do lado do servidor adicionando o cabeçalho x-amz-server-side-encryption à solicitação Iniciar upload de várias partes. Ao copiar um objeto existente, independentemente de o objeto de origem ser criptografado ou não, o objeto de destino não é criptografado, a menos que você solicite explicitamente a criptografia do lado do servidor.

Os cabeçalhos de resposta das operações de API REST a seguir retornam o cabeçalho x-amz-server-side-encryption quando um objeto é armazenado usando SSE-S3.

nota

Não envie cabeçalhos de solicitação de criptografia para solicitações GET e HEAD se o objeto usa SSE-S3, ou você receberá um erro 400 (Solicitação inválida) de status HTTP.

Ao usar AWS SDKs, é possível solicitar que o Amazon S3 use criptografia do lado do servidor com chaves de criptografia gerenciadas pelo Amazon S3 (SSE-S3). Esta seção fornece exemplos de uso dos AWS SDKs em várias linguagens. Para obter informações sobre outros SDKs, consulte Código de exemplo e bibliotecas.

Java

Ao usar o AWS SDK for Java para fazer upload de um objeto, você pode usar SSE-S3 para criptografá-lo. Para solicitar a criptografia no lado do servidor, use a propriedade ObjectMetadata da PutObjectRequest para configurar o cabeçalho da solicitação x-amz-server-side-encryption. Ao chamar o método putObject() do AmazonS3Client, o Amazon S3 criptografa e salva os dados.

Você também pode solicitar a criptografia SSE-S3 ao fazer upload de objetos com a operação de API de upload de várias partes:

  • Ao usar a operação de API de alto nível de upload de várias partes, você usa os métodos TransferManager para aplicar criptografia no lado do servidor aos objetos conforme faz upload desses objetos. Você pode usar qualquer um dos métodos de upload que assumem ObjectMetadata como um parâmetro. Para ter mais informações, consulte Fazer upload de um objeto usando multipart upload.

  • Ao usar a operação de API de upload de várias partes de baixo nível, você especifica a criptografia de servidor ao iniciar o upload de várias partes. Você adiciona a propriedade ObjectMetadata chamando o método InitiateMultipartUploadRequest.setObjectMetadata(). Para obter mais informações, consulte Usar os AWS SDKs (API de baixo nível).

Você não poderá alterar diretamente o estado de criptografia de um objeto (criptografando um objeto não criptografado ou descriptografando um objeto criptografado). Para alterar o estado de criptografia de um objeto, faça uma cópia do objeto, especificando o estado desejado de criptografia para a cópia e, em seguida, exclua o objeto original. O Amazon S3 criptografa o objeto copiado somente se você solicitar explicitamente criptografia no lado do servidor. Para solicitar a criptografia do objeto copiado por meio da API Java, use a propriedade ObjectMetadata para especificar a criptografia no lado do servidor na CopyObjectRequest.

exemplo Exemplo

O exemplo a seguir mostra como definir a criptografia do lado do servidor usando o AWS SDK for Java. Ele mostra como executar as seguintes tarefas:

  • Faça upload de um novo objeto usando SSE-S3.

  • Alterar o estado de criptografia de um objeto (neste exemplo, criptografar um objeto anteriormente não criptografado) fazendo uma cópia do objeto.

  • Verificar o estado de criptografia do objeto.

Para obter mais informações sobre criptografia no lado do servidor, consulte Uso da API REST. Consulte instruções sobre como criar e testar uma amostra funcional em Getting Started no Guia do desenvolvedor do 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

Ao fazer upload de um objeto, você pode instruir o Amazon S3 a criptografar esse objeto. Para alterar o estado de criptografia de um objeto existente, faça uma cópia do objeto e exclua o objeto de origem. Por padrão, a operação de cópia criptografa o destino somente se você solicitar explicitamente a criptografia no lado do servidor do objeto de destino. Para especificar a SSE-S3 no CopyObjectRequest, adicione o seguinte:

ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256

Para obter uma amostra funcional de como copiar um objeto, consulte Uso dos AWS SDKs.

O exemplo a seguir faz upload de um objeto. Na solicitação, o exemplo instrui o Amazon S3 a criptografar o objeto. O exemplo então recupera metadados do objeto e verifica o método de criptografia que foi usado. Para obter informações sobre como configurar e executar exemplos de código, consulte Conceitos básicos do AWS SDK for .NET no Guia do desenvolvedor do AWS SDK for .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

Este tópico mostra como usar classes da versão 3 do AWS SDK for PHP para adicionar SSE-S3 a objetos que você carrega no Amazon S3. Para obter mais informações sobre a API do AWS SDK for Ruby, acesse AWS SDK for Ruby Version 2.

Para fazer upload de um objeto no Amazon S3, use o método Aws\S3\S3Client::putObject(). Para adicionar o cabeçalho de solicitação x-amz-server-side-encryption à sua solicitação de upload, especifique o parâmetro ServerSideEncryption com o valor AES256, conforme exibido no seguinte exemplo de código. Para obter informações sobre solicitações de criptografia no lado do servidor, consulte Uso da 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', ]);

Em resposta, o Amazon S3 retorna o cabeçalho x-amz-server-side-encryption com o valor do algoritmo de criptografia que foi usado para criptografar os dados de objeto.

Ao fazer upload de objetos grandes usando a operação de API de upload de várias partes, você pode especificar a SSE-S3 para os objetos que estiver carregando, conforme segue:

  • Ao usar a operação de API de upload de várias partes de baixo nível, especifique a criptografia do lado do servidor ao chamar o método Aws\S3\S3Client::createMultipartUpload(). Para adicionar o cabeçalho de solicitação x-amz-server-side-encryption à sua solicitação, especifique a chave array do parâmetro ServerSideEncryption com o valor AES256. Para obter mais informações sobre a operação de API de upload de várias partes de baixo nível, consulte Usar os AWS SDKs (API de baixo nível).

  • Ao usar a operação de API de upload de várias partes de alto nível, especifique a criptografia do lado do servidor usando o parâmetro ServerSideEncryption da operação de API CreateMultipartUpload. Para ver um exemplo de uso do método setOption() com a operação de API de upload de várias partes de alto nível, consulte Fazer upload de um objeto usando multipart upload.

Para determinar o estado de criptografia de um objeto existente, recupere os metadados de objeto chamando o método Aws\S3\S3Client::headObject() conforme exibido no seguinte exemplo 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 alterar o estado de criptografia de um objeto existente, faça uma cópia do objeto usando o método Aws\S3\S3Client::copyObject() e exclua o objeto de origem. Por padrão, o copyObject() não criptografará o destino, a menos que você solicite explicitamente a criptografia do lado do servidor do objeto de destino usando o parâmetro ServerSideEncryption com o valor AES256. O exemplo de código PHP a seguir faz uma cópia de um objeto e adiciona a criptografia no lado do servidor ao 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 obter mais informações, consulte os tópicos a seguir.

Ruby

Ao usar o AWS SDK for Ruby para fazer upload de um objeto, você pode especificar que o objeto seja armazenado criptografado em repouso com a SSE-S3. Ao ler o objeto de volta, ele é descriptografado automaticamente.

O exemplo do AWS SDK for Ruby versão 3 a seguir demonstra como especificar que um arquivo carregado no Amazon S3 seja criptografado em repouso.

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__

O exemplo de código a seguir demonstra como determinar o estado de criptografia de um 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__

Se a criptografia do lado do servidor não for usada para o objeto que é armazenado no Amazon S3, o método retornará null.

Para alterar o estado de criptografia de um objeto existente, faça uma cópia do objeto e exclua o objeto de origem. Por padrão, os métodos de cópia não criptografam o destino, a menos que você solicite explicitamente a criptografia no lado do servidor. Você pode solicitar a criptografia do objeto de destino especificando o valor server_side_encryption no argumento de hash de opções conforme mostrado no seguinte exemplo de código Ruby. O exemplo de código demonstra como copiar um objeto e criptografar a cópia com 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 a SSE-S3 ao carregar um objeto usando a AWS CLI, use o exemplo a seguir.

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

Para obter mais informações, consulte put-object na referência da AWS CLI. Para especificar a SSE-S3 ao copiar um objeto usando a AWS CLI, consulte copy-object.

Para obter exemplos de configuração de criptografia usando o AWS CloudFormation, consulte os exemplos Criar um bucket com criptografia padrão e Criar um bucket usando criptografia do lado do servidor do AWS KMS com uma Chave de bucket do S3 no tópico AWS::S3::Bucket ServerSideEncryptionRule do Guia do usuário do AWS CloudFormation.