Criptografia do lado do cliente do Amazon S3 com o AWS SDK for PHP versão 3 - AWS SDK for PHP

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á.

Criptografia do lado do cliente do Amazon S3 com o AWS SDK for PHP versão 3

Com a criptografia do lado do cliente, os dados são criptografados e descriptografados diretamente em seu ambiente. Isso significa que esses dados são criptografados antes de serem transferidos para o Amazon S3, e você não depende de um serviço externo para tratar da criptografia para você. Para novas implementações, sugerimos o uso de S3EncryptionClientV2 e S3EncryptionMultipartUploaderV2 sobre o S3EncryptionClient e S3EncryptionMultipartUploader obsoletos. É recomendável que implementações mais antigas que ainda usam as versões obsoletas tentem migrar. O S3EncryptionClientV2 mantém o suporte para descriptografar dados que foram criptografados usando o S3EncryptionClient legado.

O AWS SDK for PHP implementa a criptografia envelope e usa o OpenSSL para criptografar e descriptografar. A implementação é interoperável com outros SDKs que possuem o mesmo suporte a recursos. Também é compatível com o fluxo de trabalho assíncrono com base em promessa do SDK.

Guia de migração

Para aqueles que estão tentando migrar dos clientes obsoletos para os novos clientes, há um guia de migração que pode ser encontrado aqui.

Configuração

Para começar a usar a criptografia do lado do cliente, você precisa do seguinte:

Antes de executar qualquer código de exemplo, configure suas credenciais da AWS. Consulte as Credenciais do AWS SDK for PHP versão 3.

Criptografia

O upload de um objeto criptografado S3EncryptionClientV2 usa três parâmetros adicionais além dos parâmetros PutObject padrão:

  • '@KmsEncryptionContext' é um par de valores-chave que pode ser usado para adicionar uma camada extra de segurança ao seu objeto criptografado. O cliente de criptografia deve passar a mesma chave, o que será feito automaticamente em uma chamada get. Se nenhum contexto adicional for desejado, passe uma matriz vazia.

  • @CipherOptions são configurações adicionais para a criptografia, incluindo qual cifra usar e tamanho da chave.

  • @MaterialsProvider é um provedor que gerencia a geração de uma chave cifrada e um vetor de inicialização, além de criptografar sua chave cifrada.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV2; // Let's construct our S3EncryptionClient using an S3Client $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, // Additional configuration options ]; $result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
nota

Além dos erros de serviço com base no Amazon S3 e no InvalidArgumentException, você pode receber objetos AWS KMS se suas '@CipherOptions' não estiverem configuradas corretamente.

Descriptografia

Baixar e descriptografar um objeto tem quatro parâmetros adicionais, dois dos quais são obrigatórios, além dos parâmetros GetObject padrão. O cliente detectará as opções básicas de criptografia para você.

  • '@SecurityProfile': se definido como 'V2', somente objetos criptografados em formato de compatibilidade com V2

    podem ser descriptografados. Definir esse parâmetro como 'V2_AND_LEGACY' também permite que objetos criptografados em formato compatível com V1 sejam descriptografados. Para oferecer suporte à migração, defina @SecurityProfile como 'V2_AND_LEGACY'. Use 'V2' somente para o desenvolvimento de novos aplicativos.

  • '@MaterialsProvider' é um provedor que gerencia a geração de uma chave cifrada e um vetor de inicialização, bem

    como criptografar sua chave cifrada.

  • '@KmsAllowDecryptWithAnyCmk': (opcional) Definir esse parâmetro como verdadeiro permite a descriptografia

    sem fornecer um ID de chave do KMS para o construtor do MaterialsProvider. O valor padrão é falso.

  • '@CipherOptions' (opcional) são configurações adicionais para a criptografia, incluindo qual

    cifra a ser usada e o tamanho da chave.

$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
nota

Além dos erros de serviço com base no Amazon S3 e no InvalidArgumentException, você pode receber objetos AWS KMS se suas '@CipherOptions' não estiverem configuradas corretamente.

Configuração da criptografia

'Cipher' (string)

O método de codificação que o cliente de criptografia usa ao criptografar. Somente 'gcm' é suportado, no momento.

Importante

O PHP foi atualizado na versão 7.1 para incluir os parâmetros adicionais necessários para criptografar e descriptografar usando a criptografia do OpenSSL para GCM. Para as versões 7.0 e anteriores do PHP, um polyfill para suporte ao GCM é fornecido e usado pelos clientes de criptografia S3EncryptionClientV2 e S3EncryptionMultipartUploaderV2. No entanto, o desempenho de entradas grandes será muito mais lento usando o polyfill do que usando a implementação nativa do PHP 7.1+, portanto, pode ser necessário atualizar ambientes de versões mais antigas do PHP para usá-los de forma eficaz.

'KeySize' (int)

O comprimento da chave de criptografia do conteúdo a ser gerada para a criptografia. O padrão é 256 bits. As opções de configuração válidas são 256 e 128.

'Aad' (string)

'Additional authentication data - Dados de autenticação adicionais' opcionais a serem incluídos com seu conteúdo criptografado. Essas informações são validadas na descriptografia. O Aad está disponível somente ao usar o código "gcm".

Importante

Dados de autenticação adicionais não são compatíveis com todos os AWS SDKs e, como tal, outros SDKs podem não conseguir descriptografar arquivos criptografados usando esse parâmetro.

Estratégias de metadados

Você também tem a opção de fornecer uma instância de uma classe que implementa a Aws\Crypto\MetadataStrategyInterface. Essa interface simples lida com o salvamento e o carregamento do Aws\Crypto\MetadataEnvelope que contém o material da criptografia de envelope. O SDK fornece duas classes que implementam isso: Aws\S3\Crypto\HeadersMetadataStrategy e Aws\S3\Crypto\InstructionFileMetadataStrategy. A HeadersMetadataStrategy é usada por padrão.

$strategy = new InstructionFileMetadataStrategy( $s3Client ); $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => $strategy, '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V2', '@MetadataStrategy' => $strategy, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

Constantes de nomes de classe para HeadersMetadataStrategy e InstructionFileMetadataStrategy podem ser fornecidas chamando ::class.

$result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => HeadersMetadataStrategy::class, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
nota

Se houver uma falha depois que um arquivo de instrução for carregado, ele não será excluído automaticamente.

Carregamentos fracionados

A execução de um multipart upload com a criptografia do lado do cliente também é possível. O Aws\S3\Crypto\S3EncryptionMultipartUploaderV2 prepara o fluxo de origem da criptografia antes do upload. A criação de um enfrenta uma experiência semelhante a usar o Aws\S3\MultipartUploader e o Aws\S3\Crypto\S3EncryptionClientV2. O S3EncryptionMultipartUploaderV2 pode lidar com a mesma opção '@MetadataStrategy' que o S3EncryptionClientV2, bem como com todas as configurações disponíveis de '@CipherOptions'.

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( new KmsClient([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-upload-key'; $cipherOptions = [ 'Cipher' => 'gcm' 'KeySize' => 256, // Additional configuration options ]; $multipartUploader = new S3EncryptionMultipartUploaderV2( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'bucket' => $bucket, 'key' => $key, ] ); $multipartUploader->upload();
nota

Além dos erros de serviço com base no Amazon S3 e no InvalidArgumentException, você pode receber objetos AWS KMS se suas '@CipherOptions' não estiverem configuradas corretamente.