Criptografia do lado do cliente do Amazon S3 - Amazon EMR

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 a criptografia do lado do cliente do Amazon S3, a criptografia e a descriptografia do Amazon S3 ocorrem no cliente do EMRFS em seu cluster. Os objetos são criptografados antes de serem carregados no Amazon S3 e descriptografados após serem baixados. O provedor especificado por você fornece a chave de criptografia que o cliente usa. O cliente pode usar chaves fornecidas pelo AWS KMS (CSE-KMS) ou uma classe Java personalizada que fornece a chave raiz do lado do cliente (CSE-C). As especificações de criptografia são ligeiramente diferentes entre a CSE-KMS e a CSE-C, dependendo do provedor especificado e dos metadados do objeto que está sendo descriptografado ou criptografado. Para obter mais informações sobre essas diferenças, consulte Proteger dados usando a criptografia do lado do cliente no Guia do usuário do Amazon Simple Storage Service.

nota

A CSE do Amazon S3 garante somente que os dados do EMRFS trocados com o Amazon S3 sejam criptografados. Não são todos os dados nos volumes de instâncias do cluster que são criptografados. Além disso, como o Hue não usa o EMRFS, os objetos que o navegador de arquivos do S3 para Hue grava no Amazon S3 não são criptografados.

Para especificar o CSE-KMS para dados do EMRFS no Amazon S3 usando o AWS CLI
  • Digite o seguinte comando e substitua MyKMSKeyID pelo ID da chave ou o ARN da chave do KMS a ser usada:

    aws emr create-cluster --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId

Criar um provedor de chaves personalizado

Dependendo do tipo de criptografia que você usa ao criar um provedor de chave personalizado, o aplicativo também deve implementar EncryptionMaterialsProvider interfaces diferentes. Ambas as interfaces estão disponíveis no AWS SDK for Java versão 1.11.0 e posterior.

Você pode usar qualquer estratégia para fornecer materiais de criptografia para a implementação. Por exemplo, você pode optar por fornecer materiais de criptografia estática ou integrá-los a um sistema de gerenciamento de chaves mais complexo.

Se você estiver usando a criptografia do Amazon S3, deverá usar os algoritmos de criptografia NoPaddingAES/GCM/ para materiais de criptografia personalizados.

Se você estiver usando criptografia de disco local, o algoritmo de criptografia a ser usado para materiais de criptografia personalizados varia de acordo com a versão do EMR. Para o Amazon EMR 7.0.0 e versões anteriores, você deve usar AES/GCM/. NoPadding Para o Amazon EMR 7.1.0 e versões posteriores, você deve usar o AES.

A EncryptionMaterialsProvider classe obtém materiais de criptografia por contexto de criptografia. O Amazon EMR popula informações de contexto de criptografia em runtime para ajudar o chamador a determinar os materiais de criptografia corretos a serem retornados.

exemplo Exemplo: usar um provedor de chaves personalizado para a criptografia do Amazon S3 com o EMRFS

Quando o Amazon EMR busca os materiais de criptografia da EncryptionMaterialsProvider classe para realizar a criptografia, o EMRFS opcionalmente preenche o argumento MaterialsDescription com dois campos: o URI do Amazon S3 para o objeto JobFlowId e o do cluster, que pode ser usado pela classe para retornar materiais de criptografia seletivamente. EncryptionMaterialsProvider

Por exemplo, o provedor pode retornar diferentes chaves para diferentes prefixos de URI do Amazon S3. É a descrição dos materiais de criptografia retornados que acaba sendo armazenada com o objeto do Amazon S3 no lugar do valor de materialsDescription que é gerado pelo EMRFS e transmitido ao provedor. Ao descriptografar um objeto do Amazon S3, a descrição do material de criptografia é passada para a EncryptionMaterialsProvider classe, para que ela possa, novamente, retornar seletivamente a chave correspondente para descriptografar o objeto.

Uma implementação de EncryptionMaterialsProvider referência é fornecida abaixo. Outro provedor personalizado, o EMRFSRSA EncryptionMaterialsProvider, está disponível em. GitHub

import com.amazonaws.services.s3.model.EncryptionMaterials; import com.amazonaws.services.s3.model.EncryptionMaterialsProvider; import com.amazonaws.services.s3.model.KMSEncryptionMaterials; import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configuration; import java.util.Map; /** * Provides KMSEncryptionMaterials according to Configuration */ public class MyEncryptionMaterialsProviders implements EncryptionMaterialsProvider, Configurable{ private Configuration conf; private String kmsKeyId; private EncryptionMaterials encryptionMaterials; private void init() { this.kmsKeyId = conf.get("my.kms.key.id"); this.encryptionMaterials = new KMSEncryptionMaterials(kmsKeyId); } @Override public void setConf(Configuration conf) { this.conf = conf; init(); } @Override public Configuration getConf() { return this.conf; } @Override public void refresh() { } @Override public EncryptionMaterials getEncryptionMaterials(Map<String, String> materialsDescription) { return this.encryptionMaterials; } @Override public EncryptionMaterials getEncryptionMaterials() { return this.encryptionMaterials; } }

Especificando um fornecedor de materiais personalizados usando o AWS CLI

Para usar a AWS CLI, transmita os argumentos Encryption, ProviderType, CustomProviderClass e CustomProviderLocation para a opção emrfs.

aws emr create-cluster --instance-type m5.xlarge --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://mybucket/myfolder/provider.jar,CustomProviderClass=classname

Configurar Encryption como ClientSide permite a criptografia do lado do cliente, CustomProviderClass é o nome do seu objeto EncryptionMaterialsProvider e CustomProviderLocation é o local ou a localização no Amazon S3 de onde o Amazon EMR copia CustomProviderClass para cada nó do cluster e o coloca no caminho de classe.

Especificar um provedor de materiais personalizado usando um SDK

Para usar um SDK, primeiro você pode definir a propriedade fs.s3.cse.encryptionMaterialsProvider.uri para baixar a classe personalizada EncryptionMaterialsProvider que é armazenada no Amazon S3 em cada nó do cluster. Isso pode ser configurado no arquivo emrfs-site.xml, juntamente com a CSE habilitada e a localização apropriada do provedor personalizado.

Por exemplo, no AWS SDK for Java uso RunJobFlowRequest, seu código pode ter a seguinte aparência:

<snip> Map<String,String> emrfsProperties = new HashMap<String,String>(); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider.uri","s3://mybucket/MyCustomEncryptionMaterialsProvider.jar"); emrfsProperties.put("fs.s3.cse.enabled","true"); emrfsProperties.put("fs.s3.consistent","true"); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider","full.class.name.of.EncryptionMaterialsProvider"); Configuration myEmrfsConfig = new Configuration() .withClassification("emrfs-site") .withProperties(emrfsProperties); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Custom EncryptionMaterialsProvider") .withReleaseLabel("emr-7.1.0") .withApplications(myApp) .withConfigurations(myEmrfsConfig) .withServiceRole("EMR_DefaultRole_V2") .withJobFlowRole("EMR_EC2_DefaultRole") .withLogUri("s3://myLogUri/") .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("myEc2Key") .withInstanceCount(2) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m5.xlarge") .withSlaveInstanceType("m5.xlarge") ); RunJobFlowResult result = emr.runJobFlow(request); </snip>

Personalizar EncryptionMaterialsProvider com argumentos

Pode ser necessário passar argumentos diretamente para o provedor. Para fazer isso, você pode usar a classificação de configuração emrfs-site com argumentos personalizados definidos como propriedades. Uma configuração de exemplo é mostrada a seguir, que é salva como um arquivo, myConfig.json:

[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]

Usando o create-cluster comando do AWS CLI, você pode usar a --configurations opção para especificar o arquivo conforme mostrado abaixo:

aws emr create-cluster --release-label emr-7.1.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://mybucket/myfolder/myprovider.jar,CustomProviderClass=classname

Configurar o suporte ao EMRFS S3EC V2

As versões do SDK para Java no S3 (1.11.837 e posteriores) têm suporte para cliente de criptografia versão 2 (S3EC V2) com vários aprimoramentos de segurança. Para obter mais informações, consulte a publicação no blog do S3 Updates to the Amazon S3 encryption client. Além disso, consulte a migração do cliente de criptografia Amazon S3 no Guia do AWS SDK for Java desenvolvedor.

O Encryption Client V1 ainda está disponível no SDK para compatibilidade retroativa. Por padrão, o EMRFS usará o S3EC V1 para criptografar e descriptografar objetos do S3 quando o CSE estiver habilitado.

Não é possível descriptografar objetos do S3 criptografados com o S3EC V2 pelo EMRFS em um cluster do EMR cuja versão seja anterior ao emr-5.31.0 (emr-5.30.1 e anteriores, emr-6.1.0 e anteriores).

exemplo Configurar o EMRFS para usar o S3EC V2

Para configurar o EMRFS para usar o S3EC V2, adicione esta configuração:

{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }

Propriedades emrfs-site.xml para criptografia do lado do cliente do Amazon S3

Propriedade Valor padrão Descrição
fs.s3.cse.enabled false

Quando definido como true, os objetos do EMRFS armazenados no Amazon S3 são criptografados usando a criptografia do lado do cliente.

fs.s3.cse.encryptionV2.enabled false

Quando estiver definido como true, o EMRFS usará o cliente de criptografia do S3 versão 2 para criptografar e descriptografar objetos no S3. Disponível no EMR 5.31.0 e versões posteriores.

fs.s3.cse.encryptionMaterialsProvider.uri N/A Aplica-se ao usar materiais de criptografia personalizada. O URI do Amazon S3 em que o JAR com EncryptionMaterialsProvider está localizado. Quando você fornecer esse URI, o Amazon EMR baixará o JAR automaticamente em todos os nós do cluster.
fs.s3.cse.encryptionMaterialsProvider N/A

O caminho da classe EncryptionMaterialsProvider usado com a criptografia no lado do cliente. Ao usar CSE-KMS, especifique com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider.

fs.s3.cse.materialsDescription.enabled false

Quando definido comotrue, preenche a MaterialsDescription de objetos criptografados com o URI do Amazon S3 para o objeto e o. JobFlowId Defina como true ao usar materiais de criptografia personalizados.

fs.s3.cse.kms.keyId N/A

Aplica-se ao usar a CSE-KMS. O valor do KeyId, ARN ou alias da chave KMS usada para criptografia.

fs.s3.cse.cryptoStorageMode ObjectMetadata

O modo de armazenamento do Amazon S3. Por padrão, a descrição das informações de criptografia é armazenada nos metadados do objeto. Você também pode armazenar a descrição em um arquivo de instruções. Os valores válidos são ObjectMetadata InstructionFile e. Para obter mais informações, consulte Criptografia de dados do lado do cliente com o AWS SDK for Java e o Amazon S3.