

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
<a name="emr-emrfs-encryption-cse"></a>

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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html) 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 comando a seguir e *MyKMSKeyID* substitua pelo ID da chave ou ARN da chave 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
<a name="emr-emrfs-create-cse-key"></a>

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.
+ [Para implementar a criptografia do Amazon S3, use o com.amazonaws.services.s3.model. EncryptionMaterialsProvider ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/EncryptionMaterialsProvider.html)interface.
+ Para implementar a criptografia de disco local, use [com.amazonaws.services.elasticmapreduce.spi.security. EncryptionMaterialsProvider ](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/elasticmapreduce/spi/security/EncryptionMaterialsProvider.html)interface.

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áticos ou fazer uma integração com um sistema de gerenciamento de chaves mais complexo.

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

Se estiver usando criptografia de disco local, o algoritmo de criptografia a ser utilizado 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** No Amazon EMR 7.1.0 e versões posteriores, você deve usar **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.

**Example 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, [EMRFSRSAEncryptionMaterialsProvider](https://github.com/awslabs/emr-sample-apps/tree/master/emrfs-plugins/EMRFSRSAEncryptionMaterialsProvider), 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
<a name="emr-emrfs-encryption-cse-custom-cli"></a>

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://amzn-s3-demo-bucket/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
<a name="emr-emrfs-encryption-cse-custom-sdk"></a>

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 para 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://amzn-s3-demo-bucket/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.12.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
<a name="emr-emrfs-encryption-custommaterials"></a>

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.12.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/myprovider.jar,CustomProviderClass=classname
```

## Configurar o suporte ao EMRFS S3EC V2
<a name="emr-emrfs-encryption-cse-s3v2"></a>

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](https://aws.amazon.com/blogs/developer/updates-to-the-amazon-s3-encryption-client/). Além disso, consulte a [migração do cliente de criptografia Amazon S3](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/s3-encryption-migration.html) no Guia do AWS SDK para 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).

**Example 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
<a name="emr-emrfs-cse-config"></a>


| Propriedade  | Valor padrão  | Description  | 
| --- | --- | --- | 
| 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 como`true`, 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 para Java e o Amazon S3](https://aws.amazon.com/articles/client-side-data-encryption-with-the-aws-sdk-for-java-and-amazon-s3/).  | 