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

Lecture de 5 minute(s)
0

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

Ré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 console Amazon EMR.

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

3.    Connectez-vous au nœud maître à l'aide de 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:file mysecurefile -genseckey -keyalg AES -keysize 128 -alias your-alias<br>

Remarque : le fichier : securefile contient un mot de passe storepass. Assurez-vous que le fichier n'est lisible que par son propriétaire et qu'il est supprimé après utilisation.

Exemple de sortie :

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 (arrêter) et start (démarrer) hbase-regionserver sur chaque nœud principal.

Remarque : l'arrêt et le démarrage des serveurs Region peuvent avoir un impact sur les lectures/écritures en cours dans les tables HBase de votre cluster. Par conséquent, arrêtez et démarrez les démons HBase uniquement pendant les temps d'arrêt. Vérifiez les impacts possibles sur un cluster de test avant de démarrer et d'arrêter un cluster de production.

Amazon EMR 5.30.0 et versions ultérieures :

sudo systemctl stop hbase-master
sudo systemctl stop hbase-regionserver

sudo systemctl start hbase-master
sudo systemctl start hbase-regionserver

Versions d'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 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', BLOCKCACHE => '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 => 'true', 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. Exemple :

<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 2 ans