Creación de claves y certificados para el cifrado de datos con Amazon EMR
Antes de especificar las opciones de cifrado mediante una configuración de seguridad, decida el proveedor que desea usar para las claves y los artefactos de cifrado. Por ejemplo, puede utilizar AWS KMS o un proveedor personalizado que cree. A continuación, cree las claves o el proveedor tal y como se describe en esta sección.
Proporcionar claves para cifrado de datos en reposo
Puede utilizar AWS Key Management Service (AWS KMS) o un proveedor de claves personalizadas para el cifrado de datos en reposo en Amazon EMR. Cuando utilice AWS KMS, se aplican cargos por el almacenamiento y el uso de las claves de cifrado. Para más información, consulte Precios de AWS KMS
En este tema se ofrecen detalles sobre las políticas de claves para una clave de KMS que se vaya a usar con Amazon EMR, así como directrices y ejemplos de código para escribir una clase de proveedor de claves personalizadas para el cifrado de Amazon S3. Para más información sobre la creación de claves, consulte Creación de claves en la Guía para desarrolladores de AWS Key Management Service.
Uso de AWS KMS keys para el cifrado
La clave de cifrado de AWS KMS debe estar creada en la misma región que su instancia de clúster de Amazon EMR y los buckets de Amazon S3 utilizados con EMRFS. Si la clave que especifica está en una cuenta diferente de la que usa para configurar un clúster, debe especificar la clave mediante su ARN.
El rol del perfil de instancia de Amazon EC2 debe tener permisos para usar la clave de KMS que especifique. El rol predeterminado del perfil de instancia en Amazon EMR es EMR_EC2_DefaultRole
. Si usa un rol diferente para el perfil de instancia o usa roles de IAM para las solicitudes de EMRFS a Amazon S3, asegúrese de agregar cada rol como usuario clave, según corresponda. Esto proporciona al rol los permisos para utilizar la clave de KMS. Para obtener más información, consulte Uso de políticas de claves en la Guía para desarrolladores de AWS Key Management Service y Configuración de roles de IAM para solicitudes de EMRFS a Amazon S3.
Puede utilizar la AWS Management Console para agregar su perfil de instancia o el perfil de instancia de EC2 a la lista de usuarios de la clave de KMS especificada. También puede usar la AWS CLI o un AWS SDK para adjuntar una política de claves adecuada.
Tenga en cuenta que Amazon EMR solo admite claves de KMS simétricas. No se puede utilizar una clave KMS asimétrica para cifrar datos en reposo en un clúster de Amazon EMR. Para obtener ayuda para determinar si una clave de KMS es simétrica o asimétrica, consulte Identificación de claves de KMS simétricas y asimétricas.
El siguiente procedimiento describe cómo agregar el perfil de instancia de Amazon EMR predeterminado, EMR_EC2_DefaultRole
como un usuario clave con la AWS Management Console. Se supone que ya ha creado una clave de KMS. Para crear una nueva clave de KMS, consulte Creación de claves en la Guía para desarrolladores de AWS Key Management Service.
Para agregar el perfil de instancia de EC2 para Amazon EMR a la lista de usuarios de claves de cifrado
-
Inicie sesión en la AWS Management Console y abra la consola AWS Key Management Service (AWS KMS) en https://console.aws.amazon.com/kms
. -
Para cambiar la Región de AWS, utilice el Selector de regiones ubicado en la esquina superior derecha de la página.
-
Seleccione el alias de la clave de KMS que desee modificar.
-
En la página de detalles de la clave, en Key Users (Usuarios de claves), seleccione Add (Añadir).
-
En el cuadro de diálogo Add key users (Añadir usuarios clave), seleccione el rol adecuado. El nombre del rol predeterminado es
EMR_EC2_DefaultRole
. -
Elija Añadir.
Habilitación del cifrado de EBS proporcionando permisos adicionales para las claves de KMS
A partir de la versión 5.24.0 de Amazon EMR, puede cifrar el dispositivo raíz y los volúmenes de almacenamiento de EBS utilizando una opción de configuración de seguridad. Para habilitar esa opción, debe especificar a AWS KMS como su proveedor de claves. Además, debe conceder el EMR_DefaultRole
del rol de servicio con permisos para utilizar la AWS KMS key que especifique.
Puede utilizar la AWS Management Console para agregar el rol de servicio a la lista de usuarios clave de la clave de KMS especificada, o bien puede usar la AWS o un AWS CLI SDK para adjuntar una política de claves adecuada.
El siguiente procedimiento describe cómo usar el AWS Management Console para añadir el rol de servicio de Amazon EMR predeterminado EMR_DefaultRole
como un usuario de clave. Se supone que ya ha creado una clave de KMS. Para crear una nueva clave de KMS, consulte Creación de claves en la Guía para desarrolladores de AWS Key Management Service.
Para añadir el rol de servicio de Amazon EMR a la lista de usuarios de claves de cifrado
-
Inicie sesión en la AWS Management Console y abra la consola AWS Key Management Service (AWS KMS) en https://console.aws.amazon.com/kms
. -
Para cambiar la Región de AWS, utilice el Selector de regiones ubicado en la esquina superior derecha de la página.
-
Elija Claves administradas por el cliente en la barra lateral izquierda.
-
Seleccione el alias de la clave de KMS que desee modificar.
-
En la página de detalles de la clave, en Key Users (Usuarios de claves), seleccione Add (Añadir).
-
En la sección Añadir usuarios de clave, seleccione el rol adecuado. El nombre del rol de servicio predeterminado para Amazon EMR es
EMR_DefaultRole
. -
Elija Añadir.
Creación de un proveedor de claves personalizadas
Cuando se utiliza una configuración de seguridad, es necesario especificar un nombre de clase de proveedor distinto para el cifrado de disco local y el cifrado de Amazon S3. Los requisitos del proveedor de claves personalizadas dependen de si utiliza el cifrado de disco local y el cifrado de Amazon S3, así como de la versión de lanzamiento de Amazon EMR.
Según el tipo de cifrado que utilice al crear un proveedor de claves personalizadas, la aplicación también debe implementar diferentes interfaces EncryptionMaterialsProvider. Ambas interfaces están disponibles en la versión 1.11.0 y posteriores del SDK para Java de AWS.
-
Para implementar el cifrado de Amazon S3, utilice la interfaz com.amazonaws.services.s3.model.EncryptionMaterialsProvider.
-
Para implementar el cifrado del disco local, utilice la interfaz com.amazonaws.services.ElasticMapReduce.SPI.Security.EncryptionMaterialsProvider.
Puede utilizar cualquier estrategia para proporcionar materiales de cifrado para la implementación. Por ejemplo, podría elegir proporcionar materiales de cifrado estáticos o integrar con un sistema de administración de claves más complejo.
Si utiliza el cifrado de Amazon S3, debe utilizar los algoritmos de cifrado AES/GCM/NoPadding para los materiales de cifrado personalizados.
Si utiliza el cifrado de disco local, el algoritmo de cifrado que se utilizará para los materiales de cifrado personalizados varía según la versión del EMR. Para Amazon EMR 7.0.0 y versiones anteriores, debe usar AES/GCM/NoPadding. Para Amazon EMR 7.1.0 y versiones posteriores, debe usar AES.
La clase EncryptionMaterialsProvider obtiene los materiales de cifrado por contexto de cifrado. Amazon EMR rellena el contexto de cifrado en tiempo de ejecución para ayudar al intermediario a determinar qué materiales de cifrado debe devolver.
ejemplo Ejemplo: uso de un proveedor de claves de cifrado personalizadas para el cifrado de Amazon S3 con EMRFS
Cuando Amazon EMR recupera los materiales de cifrado desde la clase EncryptionMaterialsProvider para realizar el cifrado, EMRFS rellena opcionalmente el argumento materialsDescription con dos campos: el URI de Amazon S3 para el objeto y JobFlowId del clúster, que puede utilizar la clase EncryptionMaterialsProvider para devolver materiales de cifrado de manera selectiva.
Por ejemplo, el proveedor podría devolver claves distintas para diferentes prefijos URI de Amazon S3. Se trata de la descripción de los materiales de cifrado devuelta que se almacena finalmente con el objeto de Amazon S3 en lugar del valor materialsDescription que genera EMRFS y se transfiere al proveedor. Al descifrar un objeto de Amazon S3, la descripción de materiales de cifrado se transfiere a la clase EncryptionMaterialsProvider, de modo que puede, nuevamente, devolver de forma selectiva la clave coincidente para descifrar el objeto.
A continuación, se proporciona una implementación de referencia de EncryptionMaterialsProvider. Otro proveedor personalizado, EMRFSRSAEncryptionMaterialsProvider
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; } }
Proporcionar certificados para el cifrado de datos en tránsito con el cifrado de Amazon EMR
Con la versión 4.8.0 o posterior de Amazon EMR, dispone de dos opciones para especificar artefactos para el cifrado de datos en tránsito utilizando una configuración de seguridad:
-
Puede crear manualmente certificados PEM, incluirlos en un archivo .zip y, a continuación, hacer referencia al archivo .zip en Amazon S3.
-
Puede implementar un proveedor de certificados personalizado como una clase Java. Deberá especificar el archivo JAR de la aplicación en Amazon S3 y, a continuación, proporcionar el nombre de la clase completa del proveedor tal como se declara en la aplicación. La clase debe implementar la interfaz TLSArtifactsProvider disponible a partir del AWS SDK for Java versión 1.11.0.
Amazon EMR descarga automáticamente artefactos en cada nodo del clúster y, posteriormente, los utiliza para implementar las características de cifrado en tránsito de código abierto. Para obtener más información sobre las opciones disponibles, consulte Cifrado en tránsito.
Uso de certificados PEM
Cuando especifique un archivo zip para el cifrado en tránsito, la configuración de seguridad espera que los archivos PEM dentro del archivo zip se nombren exactamente tal y como aparecen a continuación:
Nombre de archivo | Obligatorio/opcional | Detalles |
---|---|---|
privateKey.pem | Obligatoria | Clave privada |
certificateChain.pem | Obligatoria | Cadena de certificados |
trustedCertificates.pem | Opcional | Le recomendamos que proporcione un certificado que no esté firmado por la autoridad de certificación (CA) de raíz de confianza predeterminada de Java o una CA intermedia que enlace a la CA de raíz de confianza predeterminada de Java. No le recomendamos que utilice las CA públicas cuando utilice certificados comodín o cuando deshabilite la verificación del nombre de host. |
Es probable que desee configurar el archivo PEM de clave privada como un certificado comodín que permita el acceso al dominio de Amazon VPC en el que residen las instancias del clúster. Por ejemplo, si el clúster se encuentran en la región us-east-1 (Norte de Virginia), puede elegir especificar un nombre común en la configuración de certificado que permita el acceso al clúster especificando CN=*.ec2.internal
en la definición del sujeto del certificado. Si el clúster reside en us-west-2 (Oregón), puede especificar CN=*.us-west-2.compute.internal
.
Si el archivo PEM proporcionado en el artefacto de cifrado no tiene un carácter comodín para el dominio en el nombre común, debe cambiar el valor de hadoop.ssl.hostname.verifier
a ALLOW_ALL
. Para hacerlo en las versiones 7.3.0 y posteriores de Amazon EMR, añada la clasificación core-site
cuando envíe las configuraciones a un clúster. En las versiones anteriores a la 7.3.0, añada la configuración "hadoop.ssl.hostname.verifier": "ALLOW_ALL"
directamente al archivo core-site.xml
. Este cambio es necesario porque el verificador de nombres de host predeterminado requiere un nombre de host sin el comodín porque todos los hosts del clúster lo utilizan. Para obtener más información sobre la configuración del clúster de EMR en una instancia de Amazon VPC, consulte Configuración de redes en una VPC para Amazon EMR.
En el siguiente ejemplo, se muestra cómo utilizar OpenSSLus-west-2
(Oregón), tal y como se especifica mediante el nombre de dominio
como nombre común.*.us-west-2.compute.internal
Se especifican otros elementos del sujeto opcionales como país (C), estado (S) y configuración regional (L). Dado que se genera un certificado autofirmado, el segundo comando del ejemplo copia el archivo certificateChain.pem
en el archivo trustedCertificates.pem
. El tercer comando utiliza zip
para crear el archivo my-certs.zip
que contiene los certificados.
importante
Este ejemplo es solo una demostración de la prueba de concepto. El uso de certificados autofirmados no se recomienda y presenta un posible riesgo para la seguridad. En el caso de los sistemas de producción, utilice una autoridad de certificación (CA) de confianza 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