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 a adulteração de chaves de dados.

Visão geral da migração

A versão 3 do cliente de criptografia Amazon S3 introduz o AES GCM com Key Commitment para aumentar 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 for Ruby em seu aplicativo. Isso permitirá que os clientes de criptografia V2 existentes descriptografem objetos escritos 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, deve primeiro concluir essa migração. 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 principais de segurança: 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 da 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 de 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: essa política não impõe compromissos fundamentais e pode permitir adulterações. Objetos criptografados com essa política não se beneficiam das proteções de segurança aprimoradas do Key Commitment. 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 compromisso de chave.

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

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

  • Implicações de segurança: novos objetos se beneficiam da proteção de comprometimento de chave, 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: objetos criptografados com essa política só podem ser lidos pela V3 e pelas implementações mais recentes da V2 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 compromisso de chave usando o AES GCM com compromisso de chave.

  • Comportamento de descriptografia: só pode descriptografar objetos que foram criptografados com comprometimento de 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 compromisso de chave e todos os clientes tiverem sido atualizados para a V3.

  • Compatibilidade de versão: objetos criptografados com essa política só podem ser lidos pela V3 e pelas implementações mais recentes da V2 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 mantendo a compatibilidade com REQUIRE_ENCRYPT_ALLOW_DECRYPT versões anteriores e, ao mesmo tempo, obtendo os benefícios de segurança do compromisso fundamental com novos objetos. Mude para lá somente 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 com 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ções. 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 adultere a chave de dados criptografada no Arquivo de Instruções e faça com que o cliente decodifique 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ções para que ela seja decodificada em 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 decodificada 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ções criptografados com. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Atenção

Antes de habilitar a criptografia com ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (usando REQUIRE_ENCRYPT_ALLOW_DECRYPT nossas políticas de REQUIRE_ENCRYPT_REQUIRE_DECRYPT compromisso), certifique-se de que todos os clientes que precisam ler seus objetos criptografados tenham sido atualizados para a V3 ou para 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 em que você primeiro atualiza todos os leitores e, em seguida, muda para a criptografia com o compromisso principal.

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 SDK for AWS 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 REQUIRE_ENCRYPT_ALLOW_DECRYPT nossas políticas de REQUIRE_ENCRYPT_REQUIRE_DECRYPT compromisso), você precisa usar a versão 1.93.0 ou posterior do gem. aws-sdk-s3 Essa versão inclui suporte para descriptografar objetos criptografados com o 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 de versão para verificar se a versão mínima de 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 do 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 a V3, conforme descrito na próxima seção.

Migre 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 sucesso seu código da V2 para a V3.

Antes de atualizar seu código para usar o cliente de criptografia V3, verifique se você seguiu as etapas anteriores e está usando a aws-sdk-s3 gem versão 1.93.0 ou posterior.

nota

Ao descriptografar com o 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 de 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, mantendo a compatibilidade com versões anteriores dos 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 da 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 compromisso de chave e todos os clientes tiverem sido atualizados para a V3.

perfil_de segurança

O security_profile parâmetro determina o suporte para 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 por 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_do_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 Key Commitment protege a chave de dados criptografada contra adulteração. Use essa configuração se precisar da segurança adicional fornecida pelo compromisso da 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ções. 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: Definir commitment_policy: :require_encrypt_allow_decrypt security_profile: :v3_and_legacy e. Isso permite que seus clientes V3 criptografem novos objetos com comprometimento de chave e, ao mesmo tempo, consigam 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 de comprometimento de chave.

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

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 atualmente o armazenamento de metadados e quiser a segurança adicional do AES GCM com 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.

Migre 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 sucesso seu código da V2 para a V3.

Usando clientes de criptografia V3

Pré-migração (V2)

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

Pós-migração (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 a 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 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 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 Key Commitment não se aplica à chave de dados criptografada. No entanto, a criptografia de conteúdo ainda se beneficia do comprometimento da chave 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 arquivos de instruções com a V3, a chave de dados criptografada é protegida pelo AES GCM com 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ções. 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 Instruction File Storage 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ções requer o gerenciamento de dois objetos do S3 (o objeto criptografado e seu arquivo de instruções) 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.