AES を使用して Amazon EMR の HBase テーブルを暗号化する方法を教えてください。

最終更新日: 2020 年 5 月 18 日

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 your-password -genseckey -keyalg AES -keysize 128 -alias your-alias

出力例:

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 の stop コマンドと start コマンドを繰り返します。

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', BLOCKCA
CHE => '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 => 't
rue', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0120 seconds

注: (たとえば、Apache Phoenix を使って) テーブルにセカンダリインデックスを作成すると、WAL 暗号化が機能しない場合があります。これが発生すると、「java.lang.NullPointerException」レスポンスが返されます。この問題を解決するには、hbase-site.xml ファイルで hbase.regionserver.wal.encryptionfalse に設定します。例:

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

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合