View a markdown version of this page

Migração do cliente de criptografia Amazon S3 (V2 para V3) - AWS SDK para Ruby

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Migração do cliente de criptografia Amazon S3 (V2 para V3)

nota

Se você estiver usando a V1 do cliente de criptografia S3, primeiro deverá migrar para a V2 antes de migrar para a V3. Consulte Migração do cliente de criptografia Amazon S3 (V1 para V2) para obter instruções sobre como migrar da V1 para a V2.

Este tópico mostra como migrar seus aplicativos da versão 2 (V2) do cliente de criptografia Amazon Simple Storage Service (Amazon S3) para a versão 3 (V3) e garantir a disponibilidade dos aplicativos durante todo o processo de migração. A V3 apresenta o AES GCM com as principais políticas de compromisso e compromisso para aprimorar a segurança e proteger contra adulteração de chaves de dados.

Visão geral da migração

A versão 3 do cliente de criptografia Amazon S3 apresenta o AES GCM com Key Commitment para melhorar a segurança. Esse novo algoritmo de criptografia fornece proteção contra adulteração de chaves de dados e garante a integridade dos dados criptografados. A migração para a V3 exige um planejamento cuidadoso para manter a disponibilidade dos aplicativos e a acessibilidade dos dados durante todo o processo.

Essa migração acontece em duas fases:

1. Atualize os clientes existentes para ler novos formatos. Primeiro, implante uma versão atualizada do AWS SDK para Ruby em seu aplicativo. Isso permitirá que os clientes de criptografia V2 existentes descriptografem objetos gravados pelos novos clientes V3. Se seu aplicativo usa vários AWS SDKs, você deve atualizar cada SDK separadamente.

2. Migre clientes de criptografia e descriptografia para a V3. Depois que todos os seus clientes de criptografia V2 puderem ler novos formatos, você poderá migrar seus clientes de criptografia e descriptografia existentes para suas respectivas versões V3. Isso inclui configurar políticas de compromisso e atualizar seu código para usar as novas opções de configuração do cliente.

Se você ainda não migrou da V1 para a V2, você deve concluir essa migração primeiro. Consulte Migração do cliente de criptografia Amazon S3 (V1 para V2) para obter instruções detalhadas sobre a migração da V1 para a V2.

Compreendendo os recursos da V3

A versão 3 do cliente de criptografia Amazon S3 apresenta dois recursos de segurança principais: Políticas de compromisso e AES GCM com compromisso de chave. Compreender esses recursos é essencial para planejar sua estratégia de migração e garantir a segurança de seus dados criptografados.

Políticas de compromisso

As políticas de compromisso controlam como o cliente de criptografia lida com o comprometimento da chave durante as operações de criptografia e descriptografia. O compromisso de chave garante que os dados criptografados só possam ser descriptografados com a chave exata usada para criptografá-los, protegendo contra certos tipos de ataques criptográficos.

O cliente de criptografia V3 oferece suporte a três opções de Política de Compromisso:

FORBID_ENCRYPT_ALLOW_DECRYPT

Essa política criptografa objetos sem comprometimento de chave e permite a descriptografia de objetos com e sem comprometimento de chave.

  • Comportamento de criptografia: os objetos são criptografados sem comprometimento da chave, usando o mesmo conjunto de algoritmos da V2.

  • Comportamento de descriptografia: pode descriptografar objetos criptografados com ou sem comprometimento de chave.

  • Implicações de segurança: esta política não impõe um compromisso fundamental e pode permitir a adulteração. Objetos criptografados com essa política não se beneficiam das proteções de segurança aprimoradas do comprometimento de chaves. Use essa política somente durante a migração quando precisar manter a compatibilidade com o comportamento de criptografia V2.

  • Compatibilidade de versão: objetos criptografados com essa política podem ser lidos por todas as implementações V2 e V3 do cliente de criptografia S3.

REQUIRE_ENCRYPT_ALLOW_DECRYPT

Essa política criptografa objetos com comprometimento de chave e permite a descriptografia de objetos com e sem comprometimento de chave.

  • Comportamento de criptografia: os objetos são criptografados com comprometimento de chave usando o AES GCM com compromisso de chave.

  • Comportamento de descriptografia: pode descriptografar objetos criptografados com ou sem comprometimento de chave, fornecendo compatibilidade com versões anteriores.

  • Implicações de segurança: novos objetos se beneficiam da proteção de comprometimento de chaves, enquanto objetos existentes sem comprometimento de chave ainda podem ser lidos. Isso fornece um equilíbrio entre segurança e compatibilidade com versões anteriores durante a migração.

  • Compatibilidade de versão: os objetos criptografados com essa política só podem ser lidos pela V3 e pelas implementações V2 mais recentes do cliente de criptografia S3.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Essa política criptografa objetos com comprometimento de chave e só permite a descriptografia de objetos que foram criptografados com comprometimento de chave.

  • Comportamento de criptografia: os objetos são criptografados com comprometimento de chave usando o AES GCM com compromisso de chave.

  • Comportamento de descriptografia: só pode descriptografar objetos que foram criptografados com o comprometimento da chave. As tentativas de descriptografar objetos sem o comprometimento da chave falharão.

  • Implicações de segurança: essa política fornece o mais alto nível de segurança ao impor um compromisso fundamental para todas as operações. Use essa política somente depois que todos os objetos tiverem sido criptografados novamente com o comprometimento da chave e todos os clientes tiverem sido atualizados para a V3.

  • Compatibilidade de versão: os objetos criptografados com essa política só podem ser lidos pela V3 e pelas implementações V2 mais recentes do cliente de criptografia S3. Essa política também impede a leitura de objetos criptografados por clientes V2 ou V1.

nota

Ao planejar sua migração, comece com a manutenção da compatibilidade com REQUIRE_ENCRYPT_ALLOW_DECRYPT versões anteriores e, ao mesmo tempo, obtenha os benefícios de segurança do comprometimento fundamental com novos objetos. Só mude para REQUIRE_ENCRYPT_REQUIRE_DECRYPT depois que todos os objetos tiverem sido criptografados novamente e todos os clientes tiverem sido atualizados para a V3.

AES GCM com compromisso fundamental

O AES GCM with Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) é um novo algoritmo de criptografia introduzido na V3 que fornece segurança aprimorada ao proteger contra adulteração de chaves de dados. Entender como esse algoritmo funciona e quando ele se aplica é importante para planejar sua migração.

Como ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY difere dos algoritmos anteriores

As versões anteriores do cliente de criptografia S3 usavam AES CBC ou AES GCM sem compromisso de chave para criptografar a chave de dados nos Arquivos de Instrução. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYadiciona um compromisso criptográfico ao processo de criptografia, que vincula os dados criptografados a uma chave específica. Isso evita que um invasor altere a chave de dados criptografada no Arquivo de Instrução e faça com que o cliente descriptografe os dados com uma chave incorreta.

Sem o comprometimento da chave, pode ser possível que um invasor modifique a chave de dados criptografada em um Arquivo de Instrução de forma que ela seja descriptografada para uma chave diferente, potencialmente permitindo acesso não autorizado ou corrupção de dados. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYevita esse ataque garantindo que a chave de dados criptografada só possa ser descriptografada para a chave original que foi usada durante a criptografia.

Compatibilidade de versões

Objetos criptografados com só ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY podem ser descriptografados por implementações V3 do cliente de criptografia S3 e determinadas versões de transição da V2 que incluem suporte para leitura de formatos V3. Clientes V2 sem esse suporte de transição não podem descriptografar arquivos de instrução criptografados com. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Atenção

Antes de ativar a criptografia com ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (usando REQUIRE_ENCRYPT_ALLOW_DECRYPT ou REQUIRE_ENCRYPT_REQUIRE_DECRYPT comprometendo políticas), certifique-se de que todos os clientes que precisam ler seus objetos criptografados tenham sido atualizados para a V3 ou uma versão de transição compatível com os formatos V3. Se algum cliente V2 sem suporte de transição tentar ler objetos criptografados comALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY, a descriptografia falhará.

Durante a migração, você pode usar a política de FORBID_ENCRYPT_ALLOW_DECRYPT compromisso para continuar ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY criptografando sem permitir que seus clientes V3 leiam objetos criptografados com comprometimento de chave. Isso fornece um caminho de migração seguro, no qual você primeiro atualiza todos os leitores e depois muda para a criptografia com o compromisso de chave.

Atualizar os clientes existentes para ler novos formatos

O cliente de criptografia V3 usa algoritmos de criptografia e os principais recursos de comprometimento que os clientes V2 não suportam por padrão. A primeira etapa da migração é atualizar seus clientes de descriptografia V2 para uma versão do AWS SDK para Ruby que possa ler objetos criptografados V3. Depois de concluir essa etapa, os clientes V2 do seu aplicativo poderão descriptografar objetos criptografados por clientes de criptografia V3.

Para ler objetos criptografados por clientes V3 (aqueles que usam políticas REQUIRE_ENCRYPT_ALLOW_DECRYPT ou de REQUIRE_ENCRYPT_REQUIRE_DECRYPT compromisso), você precisa usar a versão 1.93.0 ou posterior do gem. aws-sdk-s3 Esta versão inclui suporte para descriptografar objetos criptografados com AES GCM com Key Commitment.

Instalação pela linha de comando

Para projetos que instalam o aws-sdk-s3 gem pela linha de comando, use a opção version para verificar se a versão mínima da 1.208.0 está instalada.

gem install aws-sdk-s3 -v '>= 1.208.0'

Uso de Gemfiles

Para projetos que usam um Gemfile para gerenciar dependências, defina a versão mínima da aws-sdk-s3 gem como 1.208.0. Por exemplo:

gem 'aws-sdk-s3', '>= 1.208.0'
  1. Modifique seu Gemfile para especificar a versão mínima.

  2. Execute bundle update aws-sdk-s3 para atualizar a gema.

  3. Para verificar sua versão, execute o bundle info aws-sdk-s3.

nota

Depois de atualizar para a versão mais recente, seus clientes de criptografia V2 existentes poderão descriptografar objetos criptografados por clientes V3. No entanto, eles continuarão a criptografar novos objetos usando algoritmos V2 até que você os migre para V3, conforme descrito na próxima seção.

Migrar clientes de criptografia e descriptografia para a V3

Depois de atualizar seus clientes para ler os novos formatos de criptografia, você pode atualizar seus aplicativos para os clientes de criptografia e descriptografia V3. As etapas a seguir mostram como migrar com êxito seu código da V2 para a V3.

Antes de atualizar seu código para usar o cliente de criptografia V3, certifique-se de ter seguido as etapas anteriores e de estar usando a versão de aws-sdk-s3 gem 1.93.0 ou posterior.

nota

Ao descriptografar com AES-GCM, leia o objeto inteiro até o fim antes de começar a usar os dados descriptografados. Isso é para verificar se o objeto não foi modificado desde que foi criptografado.

Configurando clientes V3

O cliente de criptografia V3 apresenta novas opções de configuração que controlam o comportamento de comprometimento das chaves e a compatibilidade com versões anteriores. Compreender essas opções é essencial para uma migração bem-sucedida.

política_de_compromisso

O commitment_policy parâmetro controla como o cliente de criptografia lida com o comprometimento da chave durante as operações de criptografia e descriptografia. Essa é a opção de configuração mais importante para clientes V3.

  • :require_encrypt_allow_decrypt- Criptografa novos objetos com comprometimento de chave e permite a descriptografia de objetos com ou sem comprometimento de chave. Essa é a configuração recomendada para migração, pois fornece segurança aprimorada para novos objetos e, ao mesmo tempo, mantém a compatibilidade retroativa com objetos V2 existentes.

  • :forbid_encrypt_allow_decrypt- Criptografa novos objetos sem comprometimento de chave (usando algoritmos V2) e permite a descriptografia de objetos com ou sem comprometimento de chave. Use essa configuração somente se precisar manter o comportamento de criptografia V2 durante a migração, como quando alguns clientes ainda não conseguem ler objetos criptografados V3.

  • :require_encrypt_require_decrypt- Criptografa novos objetos com comprometimento de chave e só permite a descriptografia de objetos que foram criptografados com comprometimento de chave. Use essa configuração somente depois que todos os objetos tiverem sido criptografados novamente com o comprometimento da chave e todos os clientes tiverem sido atualizados para a V3.

perfil_de_segurança

O security_profile parâmetro determina o suporte à leitura de objetos escritos por versões mais antigas do cliente de criptografia. Esse parâmetro é essencial para manter a compatibilidade com versões anteriores durante a migração.

  • :v3_and_legacy- Permite que o cliente V3 descriptografe objetos criptografados pelos clientes de criptografia V1 e V2. Use essa configuração durante a migração para garantir que seus clientes V3 possam ler todos os objetos criptografados existentes.

  • :v3- Permite que o cliente V3 descriptografe objetos criptografados somente por clientes de criptografia V2. Use essa configuração se você já tiver migrado todos os objetos V1 para o formato V2.

  • Se não for especificado, o cliente só descriptografará objetos criptografados por clientes V3. Use isso somente para o desenvolvimento de novos aplicativos em que não existam objetos legados.

localização_envelope

O envelope_location parâmetro determina onde os metadados de criptografia (incluindo a chave de dados criptografada) são armazenados. Esse parâmetro afeta quais objetos são protegidos pelo AES GCM com Key Commitment.

  • :metadata(Padrão) - Armazena metadados de criptografia nos cabeçalhos de metadados do objeto S3. Esse é o comportamento padrão e é recomendado para a maioria dos casos de uso. Ao usar o armazenamento de metadados, o AES GCM com Key Commitment não se aplica.

  • :instruction_file- Armazena metadados de criptografia em um objeto S3 separado (arquivo de instruções) com um sufixo configurável. Ao usar arquivos de instruções, o AES GCM com compromisso de chave protege a chave de dados criptografada contra adulteração. Use essa configuração se precisar da segurança adicional fornecida pelo compromisso de chave para a própria chave de dados.

Ao usar:instruction_file, você pode especificar opcionalmente o instruction_file_suffix parâmetro para personalizar o sufixo usado para objetos do Arquivo de Instrução. O sufixo padrão é.instruction.

Quando usar cada opção de configuração

Durante a migração, siga esta estratégia de configuração recomendada:

  1. Migração inicial: commitment_policy: :require_encrypt_allow_decrypt defina security_profile: :v3_and_legacy e. Isso permite que seus clientes V3 criptografem novos objetos com comprometimento de chave e, ao mesmo tempo, possam descriptografar todos os objetos V1 e V2 existentes.

  2. Depois que todos os clientes forem atualizados: continue usando commitment_policy: :require_encrypt_allow_decrypt e security_profile: :v3_and_legacy até que você tenha criptografado novamente todos os objetos que precisam de proteção por comprometimento de chaves.

  3. Aplicação total da V3: somente depois que todos os objetos tiverem sido criptografados novamente com o comprometimento da chave e você não precisar mais ler V1/V2 objetos, você poderá alternar commitment_policy: :require_encrypt_require_decrypt e remover o security_profile parâmetro (ou configurá-lo :v2 se os objetos V2 ainda existirem).

Poisenvelope_location, continue usando seu método de armazenamento existente (:metadataou:instruction_file), a menos que você tenha um motivo específico para alterá-lo. Se você estiver usando o armazenamento de metadados no momento e quiser a segurança adicional do AES GCM com o Key Commitment para a chave de dados, você pode mudar para:instruction_file, mas observe que isso exigirá a atualização de todos os clientes que leem esses objetos.

Migrar clientes de criptografia e descriptografia para a V3

Depois de atualizar seus clientes para ler os novos formatos de criptografia, você pode atualizar seus aplicativos para os clientes de criptografia e descriptografia V3. Os exemplos a seguir mostram como migrar com êxito seu código da V2 para a V3.

Usando clientes de criptografia V3

Pre-migration (VERSÃO 2)

require 'aws-sdk-s3' # Create V2 encryption client with KMS client = Aws::S3::EncryptionV2::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v2_and_legacy, commitment_policy: :forbid_encrypt_allow_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

Durante a migração (V3 com compatibilidade com versões anteriores)

require 'aws-sdk-s3' # Create V3 encryption client with KMS client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

Post-migration (V3)

require 'aws-sdk-s3' # Create V3 encryption client with KMS client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3, # Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) # This encrypts with key commitment and does not decrypt V2 objects commitment_policy: :require_encrypt_require_decrypt ) # Encrypt and upload object client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # Download and decrypt object resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

A principal diferença na V3 é a adição do commitment_policy parâmetro. Configurá-lo para :require_encrypt_require_decrypt garantir que novos objetos sejam criptografados com comprometimento de chave e que o cliente esteja apenas descriptografando objetos criptografados com comprometimento de chave, fornecendo segurança aprimorada contra adulteração de chaves de dados.

A put_object chamada em si permanece inalterada. Todos os aprimoramentos de segurança são configurados no nível do cliente.

Exemplos adicionais

Esta seção fornece exemplos adicionais de cenários de migração específicos e opções de configuração que podem ser úteis durante sua migração de V2 para V3.

Arquivo de instruções versus armazenamento de metadados

O cliente de criptografia S3 pode armazenar metadados de criptografia (incluindo a chave de dados criptografada) em dois locais diferentes: nos cabeçalhos de metadados do objeto S3 ou em um arquivo de instruções separado. A escolha do método de armazenamento afeta quais objetos se beneficiam do AES GCM com a proteção do Key Commitment.

Armazenamento de metadados (padrão)

Por padrão, o cliente de criptografia armazena metadados de criptografia nos cabeçalhos de metadados do objeto S3. Essa é a abordagem recomendada para a maioria dos casos de uso, pois ela mantém os metadados de criptografia com o objeto e não exige o gerenciamento de objetos separados do Arquivo de Instruções.

require 'aws-sdk-s3' # Create V3 encryption client with metadata storage (default) client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt, envelope_location: :metadata # Explicitly set to metadata (this is the default) ) # Encrypt and upload object # Encryption metadata is stored in the object's metadata headers client.put_object(bucket: 'my-bucket', key: 'my-object',body: 'secret data')

Ao usar o armazenamento de metadados, o AES GCM com compromisso de chave não se aplica à chave de dados criptografada. No entanto, a criptografia de conteúdo ainda se beneficia do comprometimento fundamental ao usar commitment_policy: :require_encrypt_allow_decrypt ou:require_encrypt_require_decrypt.

Armazenamento de arquivos de instruções

Como alternativa, você pode configurar o cliente de criptografia para armazenar metadados de criptografia em um objeto S3 separado chamado Arquivo de Instrução. Ao usar os Arquivos de Instrução com a V3, a chave de dados criptografada é protegida pelo AES GCM com o Key Commitment, fornecendo segurança adicional contra a adulteração da chave de dados.

require 'aws-sdk-s3' # Create V3 encryption client with instruction file storage client = Aws::S3::EncryptionV3::Client.new( kms_key_id: kms_key_id, key_wrap_schema: :kms_context, content_encryption_schema: :aes_gcm_no_padding, security_profile: :v3_and_legacy, commitment_policy: :require_encrypt_allow_decrypt, envelope_location: :instruction_file, # Store metadata in separate instruction file instruction_file_suffix: '.instruction' # Optional: customize the suffix (default is '.instruction') ) # Encrypt and upload object # Encryption metadata is stored in a separate object: 'my-object.instruction' client.put_object(bucket: 'my-bucket', key: 'my-object', body: 'secret data') # When retrieving the object, the client automatically reads the instruction file resp = client.get_object(bucket: 'my-bucket', key: 'my-object') decrypted_data = resp.body.read

Ao usarenvelope_location: :instruction_file, o cliente de criptografia cria dois objetos do S3:

  1. O objeto de dados criptografado (por exemplo,my-object)

  2. O arquivo de instruções contendo metadados de criptografia (por exemplo,my-object.instruction)

O instruction_file_suffix parâmetro permite que você personalize o sufixo usado para arquivos de instrução. O valor padrão é .instruction.

Quando usar cada método de armazenamento

  • Use o armazenamento de metadados para a maioria dos cenários. Ele simplifica o gerenciamento de objetos, pois os metadados de criptografia viajam com o objeto.

  • Use o Armazenamento de Arquivos de Instrução quando o tamanho dos metadados do objeto for uma preocupação ou quando você precisar separar os metadados de criptografia do objeto criptografado. Observe que o uso de arquivos de instrução exige o gerenciamento de dois objetos do S3 (o objeto criptografado e seu arquivo de instrução) em vez de um.

Atenção

Se você mudar do armazenamento de metadados para o armazenamento de arquivos de instruções (ou vice-versa), os objetos existentes criptografados com o método de armazenamento antigo não poderão ser lidos pelos clientes configurados com o novo método de armazenamento. Planeje seu método de armazenamento com cuidado e mantenha a consistência em todo o aplicativo.