Criar chaves e certificados para criptografia de dados - Amazon EMR

Criar chaves e certificados para criptografia de dados

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.

Fornecer chaves para criptografia de dados em repouso com o Amazon EMR

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ço 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 Region selector (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 Add (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 do EMR EMR_DefaultRole permissões para usar aAWS KMS key especificada.

É possível usar o AWS Management Console para adicionar a perfil de serviço do EMR à 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 abaixo descreve como adicionar a função de serviço padrão do EMR, EMR_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.

Para adicionar a função de serviço do 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 Region selector (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 caixa de diálogo Add key users (Adicionar usuários da chave) selecione a função apropriada. O nome da função de serviço padrão do EMR é EMR_DefaultRole.

  7. Escolha Add (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.

Quando você criar um provedor de chaves personalizado, o aplicativo deve implementar a interface EncryptionMaterialsProvider, que está disponível no AWS SDK for Java versão 1.11.0 e posterior. A implementação pode usar qualquer estratégia para fornecer materiais de criptografia. Você, por exemplo, pode escolher fornecer materiais de criptografia estáticos ou fazer uma integração com um sistema de gerenciamento de chaves mais complexo.

O algoritmo de criptografia usado para materiais de criptografia personalizados deve ser AES/GCM/NoPadding.

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 Optional Necessário se o certificado fornecido não estiver assinado pela autoridade de certificação raiz confiável (AC) padrão Java ou por uma AC intermediária que possa estabelecer um vínculo com a AC raiz confiável Java padrão. As ACs raiz confiáveis Java padrão podem ser encontradas em jre/lib/security/cacerts.

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 no CN para o domínio, será necessário alterar o valor de hadoop.ssl.hostname.verifier para ALLOW_ALL. Isso é feito com a classificação core-site ao enviar configurações para um cluster ou ao adicionar esse valor ao arquivo core-site.xml. Essa alteração é necessária porque o verificador de nome de host padrão não aceitará um nome de host sem curinga, resultando em um erro. Para obter mais informações sobre a configuração do cluster do EMR em uma Amazon VPC, consulte Configurar redes.

O exemplo a seguir demonstra como usar OpenSSL para gerar um certificado X.509 autoassinado com uma chave privada RSA de 1.024 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:1024 -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