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 sur Amazon S3, le chiffrement et le déchiffrement par Amazon S3 se déroulent dans le client EMRFS 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, en fonction du fournisseur indiqué et des métadonnées de l'objet à déchiffrer ou à chiffrer. 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

Le chiffrement CSE sur Amazon S3 garantit uniquement que les données  EMRFS échangées avec Amazon S3 sont chiffrées ; cela ne signifie pas que toutes les données sur les volumes des instances du cluster sont chiffrées. De plus, étant donné que Hue n'utilise pas EMRFS, les objets que le navigateur de fichiers S3 de Hue écrit sur Amazon S3 ne sont pas chiffrés.

Pour spécifier le CSE-KMS pour les données EMRFS dans Amazon S3 à l'aide du AWS CLI
  • Tapez la commande suivante et remplacez-la MyKMSKeyID par l'ID de clé ou l'ARN de la clé KMS à 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 le AWS SDK pour Java version 1.11.0 et versions ultérieures.

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 la version de l'EMR. 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 les matériaux de chiffrement à renvoyer.

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

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

Par exemple, le fournisseur peut renvoyer des clés différentes pour différents préfixes d'URI Amazon S3. C'est la description des matériaux de chiffrement renvoyés qui est finalement stockée avec l'objet Amazon S3 plutôt que la valeur materialsDescription qui est générée par 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

L'affectation à ClientSide de la valeur Encryption rend possible le chiffrement côté client. CustomProviderClass est le nom de votre objet EncryptionMaterialsProvider et CustomProviderLocation est l'emplacement local ou Amazon S3 à partir duquel Amazon EMR copie CustomProviderClass sur chaque nœud du cluster et le place dans le chemin de classe.

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

Pour utiliser un kit SDK, vous pouvez définir la propriété fs.s3.cse.encryptionMaterialsProvider.uri pour télécharger la classe EncryptionMaterialsProvider personnalisée que vous stockez dans Amazon S3 vers chaque nœud de votre cluster. Vous configurez cela dans le fichier emrfs-site.xml avec CSE activé et l'emplacement correct 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.6.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.6.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 en charge d'EMRFS S3EC V2

Les versions du SDK Java S3 (1.11.837 et versions 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éfaut, EMRFS utilise S3EC V1 pour chiffrer et déchiffrer les objets S3 si le CSE est activé.

Les objets S3 chiffrés avec S3EC V2 ne peuvent pas être déchiffrés par EMRFS sur un cluster EMR 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

Lorsque la valeur est true, les objets EMRFS 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 sur true, EMRFS utilise le client de chiffrement S3 version 2 pour chiffrer et déchiffrer les objets sur S3. Disponible à partir de la version 5.31.0 d'EMR.

fs.s3.cse.encryptionMaterialsProvider.uri N/A S'applique lors de l'utilisation de supports de chiffrement personnalisés. L'URI Amazon S3 où se trouve le fichier JAR contenant le EncryptionMaterialsProvider. Lorsque vous fournissez cet URI, Amazon EMR télécharge automatiquement le fichier 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écifiez com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider.

fs.s3.cse.materialsDescription.enabled false

Lorsqu'il est défini surtrue, remplit le MaterialsDescription des objets chiffrés avec l'URI Amazon S3 de 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 l' KeyIdARN ou de l'alias de la clé KMS 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.