Création de clés et de certificats pour le chiffrement des données - Amazon EMR

Création de clés et de certificats pour le chiffrement des données

Avant de spécifier les options de chiffrement à l'aide d'une configuration de sécurité, choisissez le fournisseur que vous souhaitez utiliser pour les clés et les artefacts de chiffrement. Par exemple, vous pouvez utiliser AWS KMS ou un fournisseur personnalisé que vous créez. Ensuite, créez les clés ou le fournisseur de clés comme décrit dans cette section.

Fournir les clés de chiffrement des données au repos avec Amazon EMR

Vous pouvez utiliser AWS Key Management Service (AWS KMS) ou un fournisseur de clés personnalisé pour le chiffrement des données au repos dans Amazon EMR. Lorsque vous utilisez AWS KMS, des frais s'appliquent pour le stockage et l'utilisation des clés de chiffrement. Pour en savoir plus, consultez PricingAWS KMS (Tarification).

Cette rubrique fournit des informations sur la stratégie de clé KMS à utiliser avec Amazon EMR, ainsi que des instructions et des exemples de code pour écrire une classe de fournisseur de clés personnalisé pour le chiffrement Amazon S3. Pour plus d'informations sur la création de clés, consultez Création de clés dans le Guide du développeur AWS Key Management Service.

Utilisation de la AWS KMS keys pour le chiffrement

La clé de chiffrement AWS KMS doit être créée dans la même région que votre instance de cluster Amazon EMR et que les compartiments Amazon S3 utilisés avec EMRFS. Si la clé que vous spécifiez se trouve dans un compte différent de celui que vous utilisez pour configurer un cluster, vous devez spécifier la clé à l'aide de son ARN.

Le rôle du profil d'instance Amazon EC2 doit être autorisé à utiliser la clé KMS que vous spécifiez. Le rôle par défaut du profil d'instance dans Amazon EMR est EMR_EC2_DefaultRole. Si vous utilisez un rôle différent pour le profil d'instance, ou si vous utilisez des rôles IAM pour les demandes EMRFS adressées à Amazon S3, assurez-vous que chaque rôle est ajouté en tant qu'utilisateur clé, le cas échéant. Cela donne au rôle des autorisations pour utiliser la clé KMS. Pour plus d'informations, consultez les sections Utilisation des stratégies de clé dans le Guide du développeur AWS Key Management Service et Configuration des rôles IAM pour les demandes EMRFS adressées à Amazon S3.

Vous pouvez utiliser la AWS Management Console pour ajouter votre profil d'instance ou votre profil d'instance EC2 à la liste des utilisateurs clés pour la clé KMS spécifiée, ou vous pouvez utiliser l'AWS CLI ou un kit SDK AWS pour associer une stratégie de clé appropriée.

Notez qu'Amazon EMR prend uniquement en charge les clés KMS symétriques. Vous ne pouvez pas utiliser une clé KMS asymétrique pour chiffrer les données au repos dans un cluster Amazon EMR. Pour savoir si une clés KMS est symétrique ou asymétrique, consultez Identification de clés KMS symétriques et asymétriques.

La procédure ci-dessous décrit comment ajouter le profil d'instance Amazon EMR par défaut, EMR_EC2_DefaultRole, en tant qu'utilisateur de clé à l'aide de la AWS Management Console. Elle suppose que vous avez déjà créé une clé KMS. Pour créer une nouvelle clé KMS, consultez Création de clés dans le Guide du développeur AWS Key Management Service.

Pour ajouter le profil d'instance EC2 pour Amazon EMR à la liste des utilisateurs de clés de chiffrement
  1. Connectez-vous à la AWS Management Console et ouvrez la console AWS Key Management Service (AWS KMS) à l'adresse https://console.aws.amazon.com/kms.

  2. Pour changer de Région AWS, utilisez le sélecteur de région dans l'angle supérieur droit de la page.

  3. Sélectionnez l'alias de la clé KMS à modifier.

  4. Sur la page de détails de la clé, sous Key Users (Utilisateurs de clés), choisissez Add (Ajouter).

  5. Dans la boîte de dialogue Ajouter des utilisateurs clés sélectionnez le rôle approprié. Le nom du rôle par défaut est EMR_EC2_DefaultRole.

  6. Choisissez Ajouter.

Activation du chiffrement EBS en fournissant des autorisations supplémentaires pour les clés KMS

À partir de la version 5.24.0 d'Amazon EMR, vous pouvez chiffrer le périphérique racine EBS et les volumes de stockage à l'aide d'une option de configuration de sécurité. Pour activer cette option, vous devez spécifier AWS KMS comme fournisseur de clés. En outre, vous devez accorder au rôle de service EMR EMR_DefaultRole des autorisations pour utiliser la AWS KMS key que vous spécifiez.

Vous pouvez utiliser AWS Management Console pour ajouter le rôle de service EMR à la liste des utilisateurs de clés pour la clé KMS spécifiée ; vous pouvez utiliser l'AWS CLI ou un kit SDK AWS pour attacher une stratégie de clé appropriée.

La procédure ci-dessous explique comment ajouter le rôle de service EMR par défaut, EMR_DefaultRole, en tant qu'utilisateur de clés via AWS Management Console. Elle suppose que vous avez déjà créé une clé KMS. Pour créer une nouvelle clé KMS, consultez Création de clés dans le Guide du développeur AWS Key Management Service.

Pour ajouter le rôle de service EMR à la liste des utilisateurs de clé de chiffrement
  1. Connectez-vous à la AWS Management Console et ouvrez la console AWS Key Management Service (AWS KMS) à l'adresse https://console.aws.amazon.com/kms.

  2. Pour changer de Région AWS, utilisez le sélecteur de région dans l'angle supérieur droit de la page.

  3. Sélectionnez Clés gérées par le client dans la barre latérale gauche.

  4. Sélectionnez l'alias de la clé KMS à modifier.

  5. Sur la page de détails de la clé, sous Key Users (Utilisateurs de clés), choisissez Add (Ajouter).

  6. Dans la boîte de dialogue Ajouter des utilisateurs clés sélectionnez le rôle approprié. Le nom du rôle de service EMR par défaut est EMR_DefaultRole.

  7. Choisissez Ajouter.

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

Lorsque vous utilisez une configuration de sécurité, vous devez spécifier un autre nom de classe de fournisseur pour le chiffrement de disque local et le chiffrement Amazon S3.

Lorsque vous créez un fournisseur de clés personnalisé, l'application est censée implémenter l'interface EncryptionMaterialsProvider, disponible dans les versions 1.11.0 et ultérieures du AWS SDK for Java. L'implémentation peut utiliser n'importe quelle stratégie pour fournir des matériaux de chiffrement. Vous pouvez, par exemple, choisir de fournir des matériaux de chiffrement statiques ou d'intégrer un système de gestion des clés plus complexe.

L'algorithme de chiffrement utilisé pour les matériaux de chiffrement personnalisés doit être AES/GCM/NoPadding.

La classe EncryptionMaterialsProvider obtient les matériaux 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 classe EncryptionMaterialsProvider pour effectuer le chiffrement, EMRFS remplit éventuellement l'argument MaterialsDescription avec deux champs : l'URI Amazon S3 de l'objet et le JobflowID du cluster, qui peuvent être utilisés par la classe EncryptionMaterialsProvider pour renvoyer les matériaux de chiffrement de manière sélective.

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 des matériaux de chiffrement est transmise à la classe EncryptionMaterialsProvider, afin qu'elle puisse, à nouveau, renvoyer sélectivement la clé correspondante pour déchiffrer l'objet.

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

Fournir des certificats de chiffrement des données en transit avec le chiffrement Amazon EMR

Avec la version 4.80.0 d'Amazon EMR ou une version ultérieure, deux options s'offrent à vous afin de spécifier les artefacts pour le chiffrement des données en transit à l'aide d'une configuration de sécurité :

  • Vous pouvez créer manuellement les certificats PEM, les inclure dans un fichier zip, puis référencer le fichier zip dans Amazon S3.

  • Vous pouvez implémenter un fournisseur de certificats personnalisés en tant que classe Java. Vous spécifiez le fichier JAR de l'application dans Amazon S3 puis vous fournissez le nom de classe complet du fournisseur, comme déclaré dans l'application. Cette classe doit implémenter l'interface TLSArtifactsProvider disponible à partir de la version 1.11.0 de AWS SDK for Java.

Amazon EMR télécharge automatiquement les objets sur chaque nœud du cluster et les utilise ultérieurement pour mettre en œuvre les fonctionnalités de chiffrement open source en transit. Pour plus d'informations sur les options disponibles, consultez Chiffrement en transit.

Utilisation des certificats PEM

Lorsque vous spécifiez un fichier zip pour le chiffrement en transit, la configuration de sécurité s'attend à ce que les fichiers PEM contenus dans ce fichier zip aient exactement le même nom que ci-dessous :

Certificats de chiffrement en transit
Nom de fichier Obligatoire/facultatif Détails
privateKey.pem Obligatoire Clé privée
certificateChain.pem Obligatoire Chaîne de certificats
trustedCertificates.pem Facultatif Obligatoire si le certificat fourni n'est signé ni par l'autorité de certification racine Java par défaut de confiance (CA), ni par un intermédiaire CA qui est rattaché avec l'autorité de certification racine Java par défaut. Les autorités de certification racine Java par défaut sont disponibles : jre/lib/security/cacerts.

Nous vous recommandons de configurer le fichier PEM de la clé privée de sorte qu'il joue le rôle de certificat générique permettant d'accéder au domaine Amazon VPC dans lequel se trouvent vos instances de cluster. Par exemple, si le cluster se trouve dans us-east-1 (N. Virginia), vous pourriez définir un nom commun dans la configuration du certificat qui autorise l'accès au cluster en spécifiant CN=*.ec2.internal dans la définition d'objet de ce certificat. Si votre cluster se trouve dans la région us-west-2 (Oregon), vous pouvez spécifier CN=*.us-west-2.compute.internal.

Si le fichier PEM fourni dans l'artefact de chiffrement ne contient pas de caractère générique dans le CN du domaine, vous devez modifier la valeur de hadoop.ssl.hostname.verifier en ALLOW_ALL. Cela se fait avec la classification core-site lors de la soumission de configurations à un cluster ou en ajoutant cette valeur dans le fichier core-site.xml. Cette modification est nécessaire car le vérificateur de nom d'hôte par défaut n'accepte pas un nom d'hôte sans le caractère générique, ce qui entraîne une erreur. Pour plus d'informations sur la configuration d'un cluster EMR au sein d'un Amazon VPC, consultez Configuration de la mise en réseau.

L'exemple suivant montre comment utiliser OpenSSL pour générer un certificat X.509 avec une clé privée RSA 1024 bits. La clé autorise l'accès aux instances de cluster Amazon EMR de l'émetteur dans la région us-west-2 (Oregon), comme spécifié par le nom de domaine *.us-west-2.compute.internal comme nom commun.

D'autres éléments d'objet facultatifs tels que le pays (C), l'état (S), la langue (L), etc. sont spécifiés. Comme un certificat auto-signé est généré, la deuxième commande dans l'exemple copie le fichier certificateChain.pem dans le fichier trustedCertificates.pem. La troisième commande utilise zip pour créer le fichier my-certs.zip qui contient les certificats.

Important

Cet exemple est la démonstration d'une preuve de concept uniquement. L'utilisation de certificats auto-signés n'est pas recommandé et présente un risque de sécurité potentiel. Pour les systèmes de production, utilisez une autorité de certification (CA) approuvée pour émettre des certificats.

$ 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