Comment utiliser AES pour chiffrer une table Apache HBase dans Amazon EMR ?

Lecture de 5 minute(s)
0

Je souhaite utiliser Advanced Encryption Standard (AES) pour chiffrer une table Apache HBase dans Amazon EMR.

Résolution

Remarque : Si vous utilisez Amazon Simple Storage Service (Amazon S3) comme source de données au lieu du système de fichiers distribué Hadoop (HDFS), utilisez le chiffrement côté serveur et côté client pour protéger les données.

Chiffrer une nouvelle table Apache HBase

Procédez comme suit :

  1. Ouvrez la console Amazon EMR.

  2. Choisissez un cluster qui inclut déjà HBase. Vous pouvez également créer un nouveau cluster avec HBase.

  3. Utilisez SSH pour vous connecter au nœud primaire du cluster Amazon EMR.

  4. Exécutez la commande keytool pour créer une clé secrète pour le chiffrement AES :

    sudo keytool -keystore /etc/hbase/conf/hbase.jks -storetype jceks -storepass:file mysecurefile -genseckey -keyalg AES -keysize 128 -alias example-alias

    Remarque : Remplacez example-alias par votre alias.
    Exemple de sortie :

    Output:Enter key password for example-key-store
        (RETURN if same as keystore password):
    Warning:The JCEKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /etc/hbase/conf/hbase.jks -destkeystore /etc/hbase/conf/hbase.jks -deststoretype pkcs12".
  5. Ajoutez les propriétés suivantes au fichier hbase-site.xml pour chaque nœud du cluster Amazon EMR. Indiquez le chemin hbase.jks et le mot de passe pour le paramètre hbase.crypto.keyprovider. Spécifiez également votre alias dans le paramètre hbase.crypto.master.key.name :

    
      <property>
        <name>hbase.crypto.keyprovider.parameters</name>  
        <value>jceks:///etc/hbase/conf/hbase.jks?password=your_password</value>
      </property>
    
      <property>
        <name>hbase.crypto.master.key.name</name>
        <value>example-alias</value>
      </property>
    
      <property>
        <name>hbase.regionserver.hlog.reader.impl</name>
        <value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader</value>
      </property>
    
      <property>
        <name>hbase.regionserver.hlog.writer.impl</name>
        <value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter</value>
      </property>
    
      <property>
        <name>hfile.format.version</name>
        <value>3</value>
      </property>
    
      <property>
        <name>hbase.regionserver.wal.encryption</name>
        <value>true</value>
      </property>
    
      <property>
        <name>hbase.crypto.keyprovider</name>
        <value>org.apache.hadoop.hbase.io.crypto.KeyStoreKeyProvider</value>
      </property>

    Remarque : Au lieu de l'algorithme MD5 par défaut, vous pouvez utiliser un algorithme de hachage de clé de chiffrement personnalisé, tel que HBase-25181. Pour plus d'informations, consultez la page Ajouter des options pour désactiver le chiffrement des familles de colonnes et choisir un algorithme de hachage pour les clés de chiffrement encapsulées sur le site Web d'Apache. Pour définir le hachage, utilisez l'option de configuration hbase.crypto.key.hash.algorithm. L'exemple suivant utilise l'algorithme SHA-512 :

    <property>
      <name>hbase.crypto.key.hash.algorithm</name>
      <value>SHA-512</value></property>
  6. Copiez le fichier hbase.jks vers tous les nœuds de cluster situés à l'emplacement spécifié dans le paramètre hbase.crypto.keyprovider :

    cd /etc/hbase/conf
    scp hbase.jks example-host-to-copy:/tmp
    ssh example-to-hostsudo cp /tmp/hbase.jks /etc/hbase/conf/

    Remarque : Remplacez example-host-to-copy et example-to-host par les noms DNS publics de vos nœuds.

  7. Redémarrez tous les services HBase sur les nœuds primaire et principal. Puis, répétez les commandes d’arrêt et de démarrage hbase-regionserver sur chaque nœud principal.
    Remarque : Lorsque vous arrêtez et démarrez des serveurs de région AWS, cela peut affecter les lectures et les écritures en cours dans les tables HBase de votre cluster. Arrêtez et démarrez les démons HBase uniquement pendant les durées d’indisponibilité. Il est recommandé d'arrêter et de démarrer un cluster de test avant d'arrêter et de démarrer un cluster de production.

    Amazon EMR 5.30.0 et versions ultérieures :

    sudo systemctl stop hbase-mastersudo
    systemctl stop hbase-regionserver
    
    sudo systemctl start hbase-mastersudo
    systemctl start hbase-regionserver

    Versions Amazon EMR 4x à Amazon EMR 5.29.0 :

    sudo initctl stop hbase-master
    sudo initctl stop hbase-regionserver
    
    sudo initctl start hbase-master
    sudo initctl start hbase-regionserver
  8. Connectez-vous au shell HBase :

    # hbase shell
  9. Créez une table avec chiffrement AES :

    create 'example-table',{NAME=>'columnfamily',ENCRYPTION=>'AES'}

    Remarque : Remplacez example-table par le nom de votre table.
    Exemple de sortie :

    0 row(s) in 1.6760 seconds=> Hbase::Table - example-table1
  10. Vérifiez que le chiffrement AES est activé :

describe 'example-table'

Remarque : Remplacez example-table par le nom de votre table.
Exemple de sortie :

Table example-table is ENABLED
table1
COLUMN FAMILIES DESCRIPTION
{NAME => 'columnfamily', BLOOMFILTER => 'ROW', ENCRYPTION => 'AES', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE',
DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0320 seconds

Chiffrer une table Apache HBase existante

Procédez comme suit :

  1. Décrivez la table non chiffrée :

    describe 'example-table'

    Remarque : Remplacez example-table par la table que vous souhaitez décrire.
    Exemple de sortie :

    Table example-table is ENABLED
    table2
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL =>
    'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6
    5536', REPLICATION_SCOPE => '0'}1 row(s) in 0.0140 seconds2
  2. Activez le chiffrement AES :

    alter 'example-table',{NAME=>'columnfamily2',ENCRYPTION=>'AES'}

    Remarque : Remplacez example-table par votre table.
    Exemple de sortie :

    Updating all regions with the new schema...
    1/1 regions updated.
    Done.0 row(s) in 1.9000 seconds3.
  3. Vérifiez que la table est chiffrée :

    describe 'example-table'

    Remarque : Remplacez example-table par votre table.
    Exemple de sortie :

    Table example-table is ENABLED
    table2
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'columnfamily2', BLOOMFILTER => 'ROW', ENCRYPTION => 'AES', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE',
    DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}1 row(s) in 0.0120 seconds

    Remarque : Si vous créez un index secondaire sur la table, le chiffrement WAL risque de ne pas fonctionner et une réponse java.lang.NullPointerException se produit. Pour résoudre ce problème, définissez hbase.regionserver.wal.encryption sur faux dans le fichier hbase-site.xml :

    <property>      
          <name>hbase.regionserver.wal.encryption</name>
          <value>false</value>
      </property>

Informations connexes

Utilisation du shell HBase

Chiffrement transparent dans HDFS sur Amazon EMR

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois