Chiffrement côté client sur Amazon S3 - Amazon EMR

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Chiffrement côté client sur Amazon S3

Avec le chiffrement côté client Amazon S3, le chiffrement et le déchiffrement Amazon S3 ont lieu dans le EMRFS client de votre cluster. Les objets sont chiffrés avant d'être chargés sur Amazon S3 et déchiffrés après leur chargement. Le fournisseur que vous indiquez fournit la clé de chiffrement utilisée par le client. Le client peut utiliser les clés fournies par AWS KMS (CSE-KMS) ou une classe Java personnalisée qui fournit la clé racine côté client (CSE-C). Les spécificités du chiffrement sont légèrement différentes entre CSE - KMS et CSE -C, selon le fournisseur spécifié et les métadonnées de l'objet déchiffré ou chiffré. Pour plus d'informations sur ces différences, consultez Protection des données à l'aide du chiffrement côté client dans le Guide de l'utilisateur Amazon Simple Storage Service.

Note

Amazon S3 garantit CSE uniquement que les EMRFS données échangées avec Amazon S3 sont chiffrées ; toutes les données sur les volumes d'instance de cluster ne sont pas cryptées. De plus, comme Hue n'en a pas EMRFS besoin, les objets que le navigateur de fichiers Hue S3 écrit sur Amazon S3 ne sont pas chiffrés.

Pour spécifierCSE, KMS pour les EMRFS données d'Amazon S3 à l'aide du AWS CLI
  • Tapez la commande suivante et remplacez MyKMSKeyID avec l'ID de clé ou ARN de la KMS clé à utiliser :

    aws emr create-cluster --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId

Création d'un fournisseur de clés personnalisé

Selon le type de chiffrement que vous utilisez lors de la création d'un fournisseur de clés personnalisé, l'application doit également implémenter différentes EncryptionMaterialsProvider interfaces. Les deux interfaces sont disponibles dans les versions 1.11.0 et ultérieures AWS SDK pour Java.

Vous pouvez utiliser n'importe quelle stratégie pour fournir du matériel de chiffrement pour la mise en œuvre. Par exemple, vous pouvez choisir de fournir du matériel de chiffrement statique ou de l'intégrer à un système de gestion de clés plus complexe.

Si vous utilisez le chiffrement Amazon S3, vous devez utiliser les algorithmes de chiffrement AES/GCM/NoPaddingpour le matériel de chiffrement personnalisé.

Si vous utilisez le chiffrement de disque local, l'algorithme de chiffrement à utiliser pour le matériel de chiffrement personnalisé varie selon les EMR versions. Pour Amazon EMR 7.0.0 et versions antérieures, vous devez utiliser AES/GCM/NoPadding. Pour Amazon EMR 7.1.0 et versions ultérieures, vous devez utiliser AES.

La EncryptionMaterialsProvider classe obtient le matériel de chiffrement par contexte de chiffrement. Amazon EMR renseigne les informations contextuelles de chiffrement au moment de l'exécution pour aider l'appelant à déterminer le matériel de chiffrement à renvoyer.

Exemple : utilisation d'un fournisseur de clés personnalisé pour le chiffrement Amazon S3 avec EMRFS

Lorsqu'Amazon EMR extrait le matériel de chiffrement de la EncryptionMaterialsProvider classe pour effectuer le chiffrement, il remplit EMRFS éventuellement l' materialsDescription argument avec deux champs : l'Amazon S3 URI pour l'objet et le champ JobFlowId du cluster, qui peuvent être utilisés par la EncryptionMaterialsProvider classe pour renvoyer du matériel de chiffrement de manière sélective.

Par exemple, le fournisseur peut renvoyer des clés différentes pour différents URI préfixes Amazon S3. Il s'agit de la description du matériel de chiffrement renvoyé qui est finalement stocké avec l'objet Amazon S3 plutôt que de la materialsDescription valeur générée EMRFS et transmise au fournisseur. Lors du déchiffrement d'un objet Amazon S3, la description du matériel de chiffrement est transmise à la EncryptionMaterialsProvider classe, afin qu'elle puisse, à nouveau, renvoyer de manière sélective la clé correspondante pour déchiffrer l'objet.

Une implémentation EncryptionMaterialsProvider de référence est fournie ci-dessous. Un autre fournisseur personnalisé est disponible auprès de GitHub. 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; } }

Spécifier un fournisseur de matériaux personnalisés à l'aide du AWS CLI

Pour utiliser l' AWS CLI, transmettez les arguments Encryption, ProviderType, CustomProviderClass et CustomProviderLocation à l'option 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

Le paramètre Encryption ClientSide active le chiffrement côté client. CustomProviderClass Il s'agit du nom de votre EncryptionMaterialsProvider objet et CustomProviderLocation de l'emplacement local ou Amazon S3 à partir duquel Amazon EMR copie les données CustomProviderClass vers chaque nœud du cluster et les place dans le chemin de classe.

Spécifier un fournisseur de matériaux personnalisés à l'aide d'un SDK

Pour utiliser unSDK, vous pouvez définir la propriété fs.s3.cse.encryptionMaterialsProvider.uri pour télécharger la EncryptionMaterialsProvider classe personnalisée que vous stockez dans Amazon S3 sur chaque nœud de votre cluster. Vous le configurez dans un emrfs-site.xml fichier avec l'emplacement CSE activé et approprié du fournisseur personnalisé.

Par exemple, lors de l' AWS SDK for Java utilisation RunJobFlowRequest, votre code peut ressembler à ce qui suit :

<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.3.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>

Personnalisé EncryptionMaterialsProvider avec arguments

Vous devrez peut-être transmettre des arguments directement au fournisseur. Pour ce faire, vous pouvez utiliser la classification de configuration emrfs-site avec les propriétés définies comme arguments personnalisés. Un exemple de configuration est indiqué ci-dessous, qui est enregistré dans un fichier, myConfig.json :

[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]

À l'aide de la create-cluster commande du AWS CLI, vous pouvez utiliser l'--configurationsoption pour spécifier le fichier comme indiqué ci-dessous :

aws emr create-cluster --release-label emr-7.3.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

Configuration de la prise EMRFS en charge du S3EC V2

SDKLes versions Java S3 (1.11.837 et ultérieures) prennent en charge la version 2 du client de chiffrement (S3EC V2) avec diverses améliorations de sécurité. Pour plus d'informations, consultez l'article de blog S3 Updates to the Amazon S3 encryption client. Reportez-vous également à la migration du client de chiffrement Amazon S3 dans le manuel du AWS SDK for Java développeur.

Le client de chiffrement V1 est toujours disponible dans le SDK pour des raisons de rétrocompatibilité. Par défautEMRFS, S3EC V1 est utilisé pour chiffrer et déchiffrer les objets S3 s'il est activé. CSE

Les objets S3 chiffrés avec S3EC V2 ne peuvent pas être déchiffrés EMRFS sur un EMR cluster dont la version de publication est antérieure à emr-5.31.0 (emr-5.30.1 et versions antérieures, emr-6.1.0 et versions antérieures).

Exemple Configurer EMRFS pour utiliser S3EC V2

Pour configurer EMRFS afin d'utiliser S3EC V2, ajoutez la configuration suivante :

{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }

Propriétés emrfs-site.xml pour le chiffrement côté client Amazon S3

Propriété Valeur par défaut Description
fs.s3.cse.enabled false

Lorsqu'il est défini surtrue, EMRFS les objets stockés dans Amazon S3 sont chiffrés à l'aide du chiffrement côté client.

fs.s3.cse.encryptionV2.enabled false

Lorsqu'il est défini surtrue, EMRFS utilise le client de chiffrement S3 version 2 pour chiffrer et déchiffrer les objets sur S3. Disponible pour les EMR versions 5.31.0 et ultérieures.

fs.s3.cse.encryptionMaterialsProvider.uri N/A S'applique lors de l'utilisation de supports de chiffrement personnalisés. L'Amazon S3 URI où se EncryptionMaterialsProvider trouve le JAR with. Lorsque vous le fournissezURI, Amazon le télécharge EMR automatiquement JAR sur tous les nœuds du cluster.
fs.s3.cse.encryptionMaterialsProvider N/A

Le chemin de classe EncryptionMaterialsProvider utilisé avec le chiffrement côté client. Lorsque vous utilisez CSE -KMS, spécifiezcom.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider.

fs.s3.cse.materialsDescription.enabled false

Lorsqu'il est défini surtrue, remplit le fichier materialsDescription des objets chiffrés avec l'Amazon S3 URI pour l'objet et le JobFlowId. Définissez sur true lors de l'utilisation de supports de chiffrement personnalisés.

fs.s3.cse.kms.keyId N/A

S'applique lors de l'utilisation de CSE -KMS. La valeur de KeyIdARN, ou alias de la KMS clé utilisée pour le chiffrement.

fs.s3.cse.cryptoStorageMode ObjectMetadata

Le mode de stockage Amazon S3. Par défaut, la description des informations de chiffrement est stockée dans les métadonnées de l'objet. Vous pouvez également stocker la description dans un fichier d'instructions. Les valeurs valides sont ObjectMetadata etInstructionFile. Pour plus d'informations, consultez la section Chiffrement des données côté client avec Amazon S3 AWS SDK for Java et Amazon S3.