Criação de chaves e certificados para criptografia de dados com o Amazon EMR - Amazon EMR

Criação de chaves e certificados para criptografia de dados com o Amazon EMR

Antes de especificar as opções de criptografia usando uma configuração de segurança, decida qual provedor você quer usar para as chaves e os artefatos criptográficos. Por exemplo, você pode usar o AWS KMS ou um provedor personalizado que você criar. Depois, crie as chaves ou o provedor de chaves conforme descrito nesta seção.

Fornecimento de chaves para criptografia de dados em repouso

Você pode usar o AWS Key Management Service (AWS KMS) ou um provedor de chaves personalizado para criptografia de dados em repouso no Amazon EMR. Quando você usa o AWS KMS, cobranças são aplicáveis ao armazenamento e ao uso de chaves de criptografia. Para obter mais informações, consulte Preços do AWS KMS.

Este tópico fornece detalhes sobre políticas de chave para uma chave do KMS a ser usada com o Amazon EMR, bem como orientações e exemplos de código para escrever uma classe de provedor de chave personalizada para criptografia do Amazon S3. Para obter mais informações sobre como criar chaves, consulte Creating keys no Guia do desenvolvedor do AWS Key Management Service.

Usar AWS KMS keys para criptografia

A chave de criptografia do AWS KMS deve ser criada na mesma região que a instância de cluster do Amazon EMR e dos buckets do Amazon S3 usados com o EMRFS. Se a chave especificada estiver em uma conta diferente da que foi usada para configurar um cluster, será necessário especificar a chave usando o respectivo ARN.

O perfil do perfil de instância do Amazon EC2 deverá ter permissões para usar a chave do KMS que você especificar. O perfil padrão para o perfil de instância no Amazon EMR é EMR_EC2_DefaultRole. Se você usar um perfil diferente para o perfil de instância ou usar perfis do IAM para solicitações do EMRFS para o Amazon S3, certifique-se de que cada perfil seja adicionado como um usuário de chave, conforme o caso. Isso concede ao perfil permissões para usar a chave do KMS. Para obter mais informações, consulte Using Key Policies no Guia do desenvolvedor do AWS Key Management Service e Configure IAM roles for EMRFS requests to Amazon S3.

É possível usar o AWS Management Console para adicionar seu perfil de instância ou perfil de instância do EC2 à lista de usuários de chaves para a chave do KMS especificada ou usar a AWS CLI ou um AWS SDK para anexar uma política de chave apropriada.

O Amazon EMR oferece suporte somente a chaves do KMS simétricas. Não é possível usar uma chave do KMS assimétrica para criptografar dados em repouso em um cluster do Amazon EMR. Para obter ajuda para determinar se uma chave do KMS é simétrica ou assimétrica, consulte Identifying symmetric and asymmetric KMS keys.

O procedimento abaixo descreve como adicionar o perfil de instância do Amazon EMR padrão, EMR_EC2_DefaultRole, como um usuário de chave usando o AWS Management Console. Ele pressupõe que você já tenha criado uma chave do KMS. Para criar uma nova chave do KMS, consulte Creating Keys no Guia do desenvolvedor do AWS Key Management Service.

Adicionar o perfil de instância do EC2 para Amazon EMR à lista de usuários de chaves de criptografia
  1. Faça login no AWS Management Console e abra o console do AWS Key Management Service (AWS KMS) em https://console.aws.amazon.com/kms.

  2. Para alterar a Região da AWS, use o seletor de regiões no canto superior direito da página.

  3. Selecione o alias da chave do KMS a ser modificada.

  4. Na página de detalhes da chave, em Key Users (Usuários de chaves), escolha Add (Adicionar).

  5. Na caixa de diálogo Add key users (Adicionar usuários da chave) selecione a função apropriada. O nome da função padrão é EMR_EC2_DefaultRole.

  6. Escolha Adicionar.

Habilitar a criptografia do EBS fornecendo permissões adicionais para chaves do KMS

A partir do Amazon EMR versão 5.24.0, você pode criptografar o dispositivo raiz do EBS e os volumes de armazenamento usando uma opção de configuração de segurança. Para habilitar essa opção, você deve especificar o AWS KMS como seu provedor de chaves. Além disso, você deve conceder ao perfil de serviço EMR_DefaultRole permissões para usar aAWS KMS key especificada.

É possível usar o AWS Management Console para adicionar o perfil de serviço à lista de usuários de chaves para a chave do KMS especificada ou usar a AWS CLI ou um AWS SDK para anexar uma política de chave apropriada.

O procedimento a seguir descreve como usar o AWS Management Console para adicionar o perfil de serviço padrão EMR_DefaultRole do Amazon EMR como usuário da chave. Ele pressupõe que você já tenha criado uma chave do KMS. Para criar uma nova chave do KMS, consulte Creating keys no Guia do desenvolvedor do AWS Key Management Service.

Para adicionar o perfil de serviço do Amazon EMR à lista de usuários de chaves de criptografia
  1. Faça login no AWS Management Console e abra o console do AWS Key Management Service (AWS KMS) em https://console.aws.amazon.com/kms.

  2. Para alterar a Região da AWS, use o seletor de regiões no canto superior direito da página.

  3. Escolha Chaves gerenciadas pelo cliente na barra lateral esquerda.

  4. Selecione o alias da chave do KMS a ser modificada.

  5. Na página de detalhes da chave, em Key Users (Usuários de chaves), escolha Add (Adicionar).

  6. Na seção Adicionar usuários da chave selecione o perfil apropriado. O nome do perfil de serviço padrão do Amazon EMR é EMR_DefaultRole.

  7. Escolha Adicionar.

Criar um provedor de chaves personalizado

Ao usar uma configuração de segurança, você deve especificar um nome de classe de provedor diferente para a criptografia de disco local e para a criptografia do Amazon S3. Os requisitos para o provedor de chaves personalizadas dependem de você usar criptografia de disco local e criptografia do Amazon S3, bem como da versão de lançamento do Amazon EMR.

Dependendo do tipo de criptografia que você usa ao criar um provedor de chave personalizado, a aplicação também deve implementar diferentes interfaces de EncryptionMaterialsProvider. Ambas as interfaces estão disponíveis na versão 1.11.0 e posteriores do AWS SDK para Java.

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 estiver usando a criptografia do Amazon S3, deverá utilizar 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. No 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 classe EncryptionMaterialsProvider 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 materiais de criptografia da classe EncryptionMaterialsProvider para realizar a criptografia, o EMRFS opcionalmente preenche o argumento materialsDescription com dois campos: o URI do Amazon S3 para o objeto e JobFlowId do cluster, que podem ser usados pela classe EncryptionMaterialsProvider para retornar materiais de criptografia seletivamente.

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 dos materiais de criptografia é transmitida à classe EncryptionMaterialsProvider, para que ela possa, mais uma vez, retornar seletivamente a chave correspondente para descriptografar esse objeto.

Uma implementação de referência de EncryptionMaterialsProvider é fornecida abaixo. Outro provedor personalizado, EMRFSRSAEncryptionMaterialsProvider, está disponível no 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; } }

Fornecer certificados para criptografia de dados em trânsito com a criptografia do Amazon EMR

Com a versão 4.8.0 ou posteriores do Amazon EMR, há duas opções para especificar artefatos para a criptografia de dados em trânsito usando uma configuração de segurança:

  • É possível criar certificados PEM manualmente, incluí-los em um arquivo .zip e referenciar o arquivo .zip no Amazon S3.

  • É possível implementar um provedor de certificados personalizado como uma classe Java. Especifique o arquivo JAR da aplicação no Amazon S3 e depois forneça o nome completo da classe desse provedor, conforme declarado na aplicação. A classe deve implementar a interface TLSArtifactsProvider, disponível a partir do AWS SDK for Java versão 1.11.0.

O Amazon EMR baixa os artefatos automaticamente em cada nó do cluster e depois os utiliza para implementar os recursos de criptografia em trânsito de código aberto. Para obter mais informações sobre as opções disponíveis, consulte Criptografia em trânsito.

Usar certificados PEM

Quando você especifica um arquivo de .zip para criptografia em trânsito, a configuração de segurança espera que os arquivos PEM dentro do arquivo .zip tenham exatamente os nomes indicados abaixo:

Certificados de criptografia em trânsito
Nome do arquivo Obrigatório/opcional Detalhes
privateKey.pem Obrigatório Chave privada
certificateChain.pem Obrigatório Cadeia de certificados
trustedCertificates.pem Opcional Recomendamos que você forneça um certificado que não seja assinado pela autoridade de certificação (CA) raiz confiável padrão Java ou por uma CA intermediária que possa vincular-se à CA raiz confiável padrão Java. Não recomendamos usar CAs públicas com certificados curinga ou ao desabilitar a verificação do nome de host.

Você provavelmente deseja configurar o arquivo PEM de chave particular para ser um certificado curinga que permite o acesso ao domínio da Amazon VPC no qual as suas instâncias de cluster residem. Por exemplo, se o seu cluster reside em us-east-1 (Norte da Virgínia), você pode optar por especificar um nome comum na configuração do certificado que permita o acesso ao cluster, especificando CN=*.ec2.internal na definição de requerente do certificado. Se o seu cluster residir em us-west-2 (Oregon), poderá especificar CN=*.us-west-2.compute.internal.

Se o arquivo PEM fornecido no artefato de criptografia não tiver um caractere curinga para o domínio no nome comum, será necessário alterar o valor de hadoop.ssl.hostname.verifier para ALLOW_ALL. Para fazer isso nas versões 7.3.0 e superiores do Amazon EMR, adicione a classificação core-site ao enviar configurações para um cluster. Nas versões anteriores à 7.3.0, adicione a configuração "hadoop.ssl.hostname.verifier": "ALLOW_ALL" diretamente ao arquivo core-site.xml. Essa alteração é necessária porque o verificador do nome de host padrão exige um nome de host sem curinga, pois todos os hosts do cluster o usam. Para obter mais informações sobre a configuração do cluster do EMR em uma Amazon VPC, consulte Configuração de redes em uma VPC no Amazon EMR.

O exemplo a seguir demonstra como usar OpenSSL para gerar um certificado X.509 autoassinado com uma chave privada RSA de 2.048 bits. A chave permite o acesso às instâncias de cluster do Amazon EMR do emissor na região us-west-2 (Oregon) conforme especificado pelo nome de domínio *.us-west-2.compute.internal como o nome comum.

Outros itens de requerente opcionais como país (C), estado (S) e Localidade (L) são especificados. Como um certificado autoassinado é gerado, o segundo comando no exemplo copia o arquivo certificateChain.pem no arquivo trustedCertificates.pem. O terceiro comando usa zip para criar o arquivo my-certs.zip que contém os certificados.

Importante

Esse exemplo é apenas uma demonstração de prova de conceito. O uso de certificados autoassinados não é recomendado e apresenta um possível risco de segurança. Para sistemas de produção, use uma autoridade de certificação (AC) confiável para emitir certificados.

$ openssl req -x509 -newkey rsa:2048 -keyout privateKey.pem -out certificateChain.pem -days 365 -nodes -subj '/C=US/ST=Washington/L=Seattle/O=MyOrg/OU=MyDept/CN=*.us-west-2.compute.internal' $ cp certificateChain.pem trustedCertificates.pem $ zip -r -X my-certs.zip certificateChain.pem privateKey.pem trustedCertificates.pem