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) na versão 3 AWS SDK para PHP
nota
Se você estiver usando a versão 1 (V1) do cliente de criptografia Amazon S3, você deve primeiro migrar para a versão 2 (V2) antes de migrar para a versão 3 (V3). Consulte Migração do cliente de criptografia Amazon S3 (V1 para V2) na versão 3 AWS SDK para PHP.
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 versão 3 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
Essa migração acontece em duas fases:
1. Atualize os clientes existentes para ler novos formatos. Primeiramente, implante a versão atualizada do AWS SDK para PHP na aplicação. Isso permite 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.
Entendendo os conceitos da V3
A versão 3 do cliente de criptografia Amazon S3 apresenta dois principais aprimoramentos de segurança: políticas de compromisso e o algoritmo AES GCM com compromisso de chave. Compreender esses conceitos é essencial para uma migração bem-sucedida.
Política de compromisso
Uma política de compromisso controla como o cliente de criptografia lida com o comprometimento da chave durante as operações de criptografia e descriptografia. A versão 3 fornece três opções de política:
FORBID_ENCRYPT_ALLOW_DECRYPT-
Comportamento de criptografia: criptografa objetos sem comprometer a chave.
Comportamento de descriptografia: permite a descriptografia de objetos criptografados com ou sem comprometimento de chave.
Implicações de segurança: essa política não impõe o comprometimento de chaves em objetos recém-criptografados, o que pode permitir a adulteração da chave de dados. Use essa política somente durante a fase inicial de migração, quando precisar manter a compatibilidade com clientes V2.
Compatibilidade de versão: objetos criptografados com essa política podem ser lidos por todas as implementações V2 e V3.
REQUIRE_ENCRYPT_ALLOW_DECRYPT-
Comportamento de criptografia: criptografa objetos com comprometimento de chave usando o
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgoritmo.Comportamento de descriptografia: permite a descriptografia de objetos criptografados com ou sem comprometimento de chave.
Implicações de segurança: essa política fornece segurança aprimorada para objetos recém-criptografados, mantendo a capacidade de ler objetos existentes. Essa é a política recomendada para a maioria dos cenários de 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.
Considerações de migração: antes de usar essa política, certifique-se de que todos os clientes que precisam ler os objetos criptografados tenham sido atualizados para a V3 ou para a V2 mais recente.
REQUIRE_ENCRYPT_REQUIRE_DECRYPT-
Comportamento de criptografia: criptografa objetos com comprometimento de chave usando o
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEYalgoritmo.Comportamento de descriptografia: permite somente a decodificação de objetos criptografados com comprometimento de chave. Objetos criptografados sem comprometimento de chave falharão na decodificação.
Implicações de segurança: essa política fornece o mais alto nível de segurança ao impor o comprometimento da chave tanto para criptografia quanto para descriptografia. Use essa política somente depois que todos os objetos tiverem sido migrados para usar o compromisso de chave.
Compatibilidade de versão: somente implementações V3 podem usar essa política. A tentativa de descriptografar objetos criptografados V1 ou V2 com essa política falhará.
Considerações sobre migração: essa política só deve ser usada após a conclusão da migração completa e a recriptografia de todos os objetos existentes com a chave comprometida.
AES GCM com compromisso fundamental
O algoritmo AES GCM with Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) é um novo algoritmo de criptografia introduzido na V3 que fornece proteção contra ataques de adulteração de chaves de dados.
Aprimoramento da segurança: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY protege contra a adulteração da chave de dados vinculando criptograficamente a chave de dados ao conteúdo criptografado. Isso evita que os invasores substituam uma chave de dados diferente durante a descriptografia, o que pode levar à decodificação de dados não intencionais.
Compatibilidade de versão: objetos criptografados só ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY podem ser descriptografados pela V3 e pelas implementações mais recentes da V2 do cliente de criptografia Amazon S3. Os clientes V1 não podem descriptografar objetos criptografados com esse algoritmo.
Importante
Requisito de atualização: antes de ativar a criptografia com ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (usando as políticas REQUIRE_ENCRYPT_ALLOW_DECRYPT ou REQUIRE_ENCRYPT_REQUIRE_DECRYPT), você deve garantir que todos os clientes que precisam ler os objetos criptografados tenham sido atualizados para a V3. A falha na atualização de todos os leitores resultará em falhas na decodificação de objetos criptografados com comprometimento 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 as versões mais antigas do cliente não suportam. A primeira etapa da migração é atualizar seus clientes de descriptografia V2 para a versão mais recente do SDK. Depois de concluir essa etapa, os clientes V2 do seu aplicativo poderão descriptografar objetos criptografados por clientes de criptografia V3. Veja os detalhes abaixo para cada método de instalação do AWS SDK para PHP.
Criando e instalando a versão mais recente do SDK
Para concluir essa migração, você deve usar a versão mais recente do aws/aws-sdk-php pacote que inclui suporte ao cliente de criptografia V3.
Instalando a partir do Composer
Para projetos que foram instalados usando o Composer, no arquivo Composer, atualize o pacote SDK para a versão mais recente do SDK e execute o comando a seguir.
composer update aws/aws-sdk-php
Instalação usando o arquivo Phar ou Zip
Use um dos métodos a seguir. Coloque o arquivo SDK atualizado no local exigido pelo código, que é determinado pela instrução da solicitação.
Para projetos que foram instalados usando o arquivo Phar, baixe o arquivo atualizado: aws.phar.
<?php require '/path/to/aws.phar'; ?>
Para projetos que foram instalados usando o arquivo Zip, baixe o arquivo atualizado: .
<?php require '/path/to/aws-autoloader.php'; ?>
Construindo, instalando e implantando aplicativos
Depois de atualizar o SDK, reconstrua e reimplante seu aplicativo para garantir que todos os componentes estejam usando a versão atualizada. Essa etapa é fundamental para garantir que seus clientes V2 possam ler objetos criptografados por clientes V3.
Siga os procedimentos de implantação padrão da sua organização para implantar o aplicativo atualizado. Certifique-se de que todas as instâncias do seu aplicativo estejam atualizadas antes de prosseguir com a migração dos clientes de criptografia e descriptografia para a V3.
Após a implantação, verifique se seu aplicativo ainda pode descriptografar objetos existentes e se nenhum erro ocorre durante as operações normais. Isso confirma que a atualização do SDK foi bem-sucedida e que seu aplicativo está pronto para a próxima fase da migraçã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. Os exemplos a seguir mostram como migrar com sucesso seu código da V2 para a V3.
Usando clientes de criptografia V3
V3 introduz a S3EncryptionClientV3 classe e substitui KmsMaterialsProviderV3 os equivalentes V2. As principais diferenças na V3 são:
-
A V3 usa
KmsMaterialsProviderV3(o mesmo que a V2), mas verifica o contexto de criptografia ao descriptografar objetos nas chamadas.GetObject -
A V3 apresenta políticas de compromisso para controlar o comportamento de criptografia e descriptografia.
Exemplo: migração da V2 para a V3 com criptografia KMS
Pré-migração (V2)
use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV2; use Aws\Kms\KmsClient; $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@CommitmentPolicy' => 'FORBID_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Durante a migração (V3 com compatibilidade com versões anteriores)
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; // Create V3 encryption client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); // Create encryption materials $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Pós-migração (V3 com compromisso fundamental)
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; // Create V3 encryption client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); // Create encryption materials $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, // Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3', // Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
Principais diferenças na V3:
-
Use
KmsMaterialsProviderV3em vez deKmsMaterialsProviderV2 -
O
@KmsEncryptionContextparâmetro ainda é necessário paraputObjectoperações -
O
@KmsEncryptionContextparâmetro é opcional paragetObjectoperações e verificará se o contexto de criptografia fornecido corresponde ao do objeto. -
O
@SecurityProfileparâmetro controla quais versões de criptografia podem ser descriptografadas. Defina como'V3_AND_LEGACY'para suportar a leitura de objetos criptografados V1 e V2 durante a migração -
O
@CommitmentPolicyparâmetro controla a política de compromisso para essa operação. Defina como'FORBID_ENCRYPT_ALLOW_DECRYPT'para suportar a leitura de objetos criptografados sem compromisso durante a migração
Exemplos adicionais
Os exemplos a seguir demonstram opções de configuração adicionais disponíveis na V3 que podem ajudá-lo a gerenciar o processo de migração e controlar o comportamento da criptografia.
Habilitar o suporte ao herdado
Durante a migração, talvez seja necessário descriptografar objetos que foram criptografados com V1 ou V2 do cliente de criptografia Amazon S3. O @SecurityProfile parâmetro controla quais versões de criptografia seu cliente V3 pode descriptografar.
Quando usar essa configuração: use o perfil 'V3_AND_LEGACY' de segurança quando seu aplicativo precisar ler objetos criptografados por clientes V1 ou V2. Isso é comum durante o período de migração, quando você tem uma mistura de objetos criptografados antigos e novos em seus buckets.
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; // Decrypt objects encrypted with V1, V2, or V3 $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
O parâmetro @SecurityProfile aceita os seguintes valores:
-
'V3'(padrão): somente descriptografe objetos criptografados com V3 usando o compromisso de chave -
'V3_AND_LEGACY': desencripte objetos criptografados com V1, V2 ou V3
Importante
Depois de concluir a migração e recriptografar todos os objetos com a V3, você deve remover o @SecurityProfile parâmetro ou configurá-lo 'V3' para garantir a máxima segurança.
Configurando o método de armazenamento
O cliente de criptografia Amazon S3 pode armazenar metadados de criptografia de duas maneiras: nos cabeçalhos de metadados do objeto ou em um arquivo de instruções separado. O @MetadataStrategy parâmetro controla qual método de armazenamento é usado.
Quando usar essa configuração: use 'INSTRUCTION_FILE' quando precisar preservar os metadados do objeto original ou ao trabalhar com objetos que tenham restrições de tamanho de metadados. Use 'METADATA' (o padrão) para implantações mais simples, nas quais os metadados de criptografia podem ser armazenados junto com o objeto.
use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; // Store encryption metadata in a separate instruction file $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => 'INSTRUCTION_FILE', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); // Store encryption metadata in object headers (default) $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => 'METADATA', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
O parâmetro @MetadataStrategy aceita os seguintes valores:
-
'METADATA'(padrão): armazene metadados de criptografia nos cabeçalhos de metadados do objeto -
'INSTRUCTION_FILE': armazene metadados de criptografia em um arquivo de instruções separado com o sufixo.instruction
nota
Ao usar'INSTRUCTION_FILE', o algoritmo AES GCM com Key Commitment fornece proteção adicional contra adulteração de chaves de dados. Objetos que usam 'METADATA' armazenamento não se beneficiam dessa proteção adicional.