AES を使用して Amazon EMR の HBase テーブルを暗号化するにはどうすればよいですか?
Advanced Encryption Standard (AES) を使用して、Amazon EMR クラスター上の Apache HBase テーブルを暗号化したいと考えています。
解決方法
透過的な暗号化機能を使用して、新規または既存の HBase テーブルを暗号化できます。この機能は、保存時に HFile データと先行書き込みログ (WAL) を暗号化します。
注: HDFS ではなく Amazon Simple Storage Service (Amazon S3) をデータソースとして使用する場合、サーバー側とクライアント側の暗号化を使用して、保存中および転送中のデータを保護できます。詳細については、暗号化を使用したデータの保護を参照してください。
新しい HBase テーブルを暗号化する
1. Amazon EMR コンソールを開きます。
2. すでに HBase を持っているクラスターを選択するか、HBase を使用して新しいクラスターを作成します。
3. SSH を使用してマスターノードに接続します。
4. keytool コマンドを使用して、AES 暗号化に適切な長さの秘密鍵を作成します。パスワードとエイリアスを入力します。
コマンド例:
sudo keytool -keystore /etc/hbase/conf/hbase.jks -storetype jceks -storepass:file mysecurefile -genseckey -keyalg AES -keysize 128 -alias your-alias<br>
注: file: securefile には storepass パスワードが含まれています。ファイルを読み取ることができるのがファイル所有者のみであり、かつ、使用後に削除されるようにします。
出力例:
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. EMR クラスターの各ノードの hbase-site.xml ファイルに次のプロパティを追加します。hbase.crypto.keyprovider.parameters プロパティで、hbase.jks へのパスとパスワードを指定します。これは、手順 4 の keytool コマンドで指定したものと同じパスワードです。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><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. hbase.jks ファイルをすべてのクラスターノードにコピーします。必ず、hbase.crypto.keyprovider.parameters プロパティで指定された場所にファイルをコピーしてください。次の例では、HostToCopy および ToHost をノードに対応するパブリック DNS 名に置き換えます。
cd /etc/hbase/conf scp hbase.jks HostToCopy:/tmp ssh ToHost sudo cp /tmp/hbase.jks /etc/hbase/conf/
7. 次の例に示すように、マスターノードとコアノードですべての HBase サービスを再起動します。各コアノードで hbase-regionserver の停止コマンドと開始コマンドを繰り返します。
**注意:**リージョンサーバーを停止して起動すると、クラスター上の HBase テーブルに対する継続的な読み取り/書き込みに影響する場合があります。したがって、HBase デーモンを停止および起動するのは、ダウンタイム中のみにしてください。本稼働クラスターを起動および停止する前に、テストクラスターに与える影響を検証します。
Amazon EMR 5.30.0 以降のリリースバージョン
sudo systemctl stop hbase-master sudo systemctl stop hbase-regionserver sudo systemctl start hbase-master sudo systemctl start hbase-regionserver
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. HBase シェルにログインします。
# hbase shell
9. AES 暗号化を使用してテーブルを作成します。
create 'table1',{NAME=>'columnfamily',ENCRYPTION=>'AES'}
出力例:
0 row(s) in 1.6760 seconds => Hbase::Table - table1
10. テーブルを説明して、AES 暗号化が有効になっていることを確認します。
describe 'table1'
出力例:
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
既存のテーブルを暗号化する
1. 暗号化されていないテーブルについて説明します。
describe 'table2'
出力例:
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. alter コマンドを使用して、AES 暗号化を有効にします。
alter 'table2',{NAME=>'cf2',ENCRYPTION=>'AES'}
出力例:
Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 1.9000 seconds
3. テーブルが暗号化されていることを確認します。
describe 'table2'
出力例:
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
注意: テーブルにセカンダリインデックスを作成する場合 (例えば、Apache Phoenix を使用)、WAL 暗号化が機能しない場合があります。これが発生すると、「java.lang.NullPointerException」応答が返されます。この問題を解決するには、hbase-site.xml ファイルで hbase.regionserver.wal.encryption を false に設定します。例:
<property> <name>hbase.regionserver.wal.encryption</name> <value>false</value> </property>
関連情報
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 5年前lg...
- 質問済み 5年前lg...
- 質問済み 6年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前