Comment chiffrer une table HBase dans Amazon EMR à l'aide d'AES ?

Date de la dernière mise à jour : 18/05/2020

Je souhaite utiliser l'algorithme AES (Advanced Encryption Standard) pour chiffrer une table Apache HBase sur un cluster Amazon EMR.

Solution

Vous pouvez chiffrer une table HBase nouvelle ou existante à l'aide de la fonction de chiffrement transparent. Cette fonction chiffre les données HFile et les journaux de transaction (WAL) au repos.

Remarque : lorsque vous utilisez Amazon Simple Storage Service (Amazon S3) comme source de données plutôt que HDFS, vous pouvez protéger les données au repos et en transit à l'aide du chiffrement côté serveur et côté client. Pour plus d'informations, consultez la section Protection des données à l'aide du chiffrement.

Chiffrer une nouvelle table HBase

1.    Ouvrez la Amazon EMR console.

2.    Sélectionnez un cluster qui dispose déjà de HBase ou créez un cluster avec HBase.

3.    Connectez-vous au nœud principal en utilisant SSH.

4.    Utilisez la commande keytool pour créer une clé secrète d'une longueur appropriée pour le chiffrement AES. Fournissez un mot de passe et un alias.

Exemple de commande :

sudo keytool -keystore /etc/hbase/conf/hbase.jks -storetype jceks -storepass your-password -genseckey -keyalg AES -keysize 128 -alias your-alias

Exemple de résultat :

Output:
Enter key password for <your_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 sur chaque nœud du cluster EMR. Dans la propriété hbase.crypto.keyprovider.parameters, fournissez le chemin d'accès à hbase.jks, ainsi que le mot de passe. Il s'agit du même mot de passe que celui que vous avez spécifié dans la commande keytool à l'étape 4. Dans la propriété hbase.crypto.master.key.name, spécifiez votre alias.

  <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><your-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>

6.    Copiez le fichier hbase.jks sur tous les nœuds de cluster. Veillez à copier le fichier à l'emplacement spécifié dans la propriété hbase.crypto.keyprovider.parameters. Dans l'exemple suivant, remplacez HostToCopy et ToHost par les noms DNS publics correspondants pour les nœuds.

cd /etc/hbase/conf
scp hbase.jks HostToCopy:/tmp
ssh ToHost
sudo cp /tmp/hbase.jks /etc/hbase/conf/

7.    Redémarrez tous les services HBase sur les nœuds maîtres et principaux, comme illustré dans l'exemple suivant. Réutilisez les commandes stop et start hbase-regionserver sur chaque nœud principal.

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 le chiffrement AES :

create 'table1',{NAME=>'columnfamily',ENCRYPTION=>'AES’}

Exemple de résultat :

0 row(s) in 1.6760 seconds
=> Hbase::Table - table1

10.    Décrivez la table pour confirmer que le chiffrement AES est activé :

describe ‘table1’

Exemple de résultat :

Table table1 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', BLOCKCA
CHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0320 seconds

Chiffrer une table existante

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

describe 'table2'

Exemple de résultat :

Table table2 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 seconds

2.    Utilisez la commande alter pour activer le chiffrement AES :

alter 'table2',{NAME=>'cf2',ENCRYPTION=>'AES'}

Exemple de résultat :

Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9000 seconds

3.    Vérifiez que la table est chiffrée :

describe ‘table2'

Exemple de résultat :

Table table2 is ENABLED
table2
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf2', 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 => 't
rue', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0120 seconds

Remarque : si vous créez un index secondaire sur la table (par exemple, avec Apache Phoenix), le chiffrement WAL peut ne pas fonctionner. Dans ce cas, vous obtenez une réponse « java.lang.NullPointerException ». Pour résoudre ce problème, définissez hbase.regionserver.wal.encryption sur false dans le fichier hbase-site.xml. Voici un exemple :

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

Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?