Cifrado del cliente de Amazon S3
Con el cifrado del cliente de Amazon S3, el proceso de cifrado y descifrado de Amazon S3 se produce en el cliente de EMRFS en su clúster. Los objetos se cifran antes de cargarlos en Amazon S3 y se descifran después de que se descarguen. El proveedor que especifique proporciona la clave de cifrado que utiliza el cliente. El cliente puede usar claves proporcionadas por AWS KMS (CSE-KMS) o una clase de Java personalizada que proporciona la clave raíz del cliente (CSE-C). Los detalles de cifrado son ligeramente diferentes entre CSE-KMS y CSE-C, en función del proveedor especificado y de los metadatos del objeto que se descifra o se cifra. Para obtener más información sobre estas diferencias, consulte Protección de los datos con el cifrado del cliente en la Guía del usuario de Amazon Simple Storage Service.
nota
El CSE de Amazon S3 solo garantiza que los datos de EMRFS intercambiados con Amazon S3 se cifren; no se cifran todos los datos en volúmenes de instancias de clúster. Además, ya que Hue no utiliza EMRFS, los objetos que Hue S3 File Browser escribe en Amazon S3 no se cifran.
Para especificar CSE-KMS para datos de EMRFS en Amazon S3 mediante la AWS CLI
-
Escriba el siguiente comando y sustituya
MyKMSKeyIDpor el ID de clave o el ARN de la clave de KMS que se debe utilizar:aws emr create-cluster --release-labelemr-4.7.2 or earlier--emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId
Creación de un proveedor de claves personalizadas
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 AWS SDK para Java.
-
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; } }
Especificación de un proveedor de materiales personalizado mediante la AWS CLI
Para usar la AWS CLI, transfiera los argumentos Encryption, ProviderType, CustomProviderClass y CustomProviderLocation a la opción emrfs.
aws emr create-cluster --instance-type m5.xlarge --release-labelemr-4.7.2 or earlier--emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/provider.jar,CustomProviderClass=classname
Al definir Encryption en ClientSide, se habilita el cifrado del cliente, CustomProviderClass es el nombre del objeto EncryptionMaterialsProvider y CustomProviderLocation es la ubicación local o de Amazon S3 desde la que Amazon EMR copia CustomProviderClass en cada nodo del clúster y lo coloca en el classpath.
Especificación de un proveedor de materiales personalizado mediante un SDK
Para utilizar un SDK, puede establecer la propiedad fs.s3.cse.encryptionMaterialsProvider.uri para descargar en cada nodo del clúster la clase EncryptionMaterialsProvider personalizada que se almacena en Amazon S3. Esto se configura en el archivo emrfs-site.xml junto con CSE habilitado y la ubicación correcta del proveedor personalizado.
Por ejemplo, en el AWS SDK para Java utilizando RunJobFlowRequest, su código podría tener el siguiente aspecto:
<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.10.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>
Personalización de EncryptionMaterialsProvider con argumentos
Es posible que necesite transferir argumentos directamente al proveedor. Para ello, puede utilizar la clasificación de configuración emrfs-site con argumentos personalizadas definidos como propiedades. A continuación se muestra un ejemplo de configuración que se guarda como un archivo, myConfig.json:
[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]
Con el comando create-cluster desde la AWS CLI, puede utilizar la opción --configurations para especificar el archivo, tal y como se muestra a continuación:
aws emr create-cluster --release-label--instance-typeemr-7.10.0m5.xlarge--instance-count2--configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://amzn-s3-demo-bucket/myfolder/myprovider.jar,CustomProviderClass=classname
Configuración del soporte para la versión 2 de EMRFS S3EC
Las versiones 1.11.837 y posteriores del SDK para Java de S3, se ha introducido la versión de soporte 2 del cliente de cifrado (S3EC V2) con varias mejoras de seguridad. Para obtener más información, consulte la publicación en el blog de S3: Updates to the Amazon S3 encryption client
La versión 1 del cliente de cifrado todavía está disponible en el SDK por motivos de compatibilidad con versiones anteriores. De forma predeterminada, EMRFS utilizará la versión 1 de S3EC para cifrar y descifrar los objetos de S3 si CSE está habilitado.
EMRFS no puede descifrar los objetos de S3 cifrados con la versión 2 de S3EC en un clúster de EMR cuya versión de lanzamiento sea anterior a emr-5.31.0 (emr-5.30.1 y anteriores, emr-6.1.0 y anteriores).
ejemplo Configuración de EMRFS para usar la versión 2 de S3EC
A fin de configurar EMRFS para que utilice la versión 2 de S3EC, agregue la siguiente configuración:
{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }
emrfs-site.xml Propiedades para el cifrado del cliente de Amazon S3
| Propiedad | Valor predeterminado | Descripción |
|---|---|---|
fs.s3.cse.enabled |
false |
Cuando se establece en |
fs.s3.cse.encryptionV2.enabled |
false |
Cuando se establece en |
fs.s3.cse.encryptionMaterialsProvider.uri |
N/A |
Se aplica cuando se utilizan materiales de cifrado personalizados. URI de Amazon S3 en el que se encuentra el JAR con EncryptionMaterialsProvider. Al proporcionar este URI, Amazon EMR descarga automáticamente el JAR a todos los nodos del clúster. |
fs.s3.cse.encryptionMaterialsProvider |
N/A |
La ruta de clases |
fs.s3.cse.materialsDescription.enabled |
false |
Cuando se establece en |
fs.s3.cse.kms.keyId |
N/A |
Se aplica cuando se utiliza CSE-KMS. Es el valor del KeyId, el ARN o el alias de la clave de KMS; utilizada para el cifrado. |
fs.s3.cse.cryptoStorageMode |
ObjectMetadata |
Modo de almacenamiento de Amazon S3. De forma predeterminada, la descripción de la información de cifrado se almacena en los metadatos de objetos. También puede almacenar la descripción en un archivo de instrucciones. Los valores válidos son ObjectMetadata e InstructionFile. Para obtener información adicional, consulte Cifrado de datos del cliente con AWS SDK para Java y Amazon S3 |