如何使用 AES 对 Amazon EMR 中的 HBase 表加密?

上次更新时间:2020 年 5 月 18 日

我想要使用高级加密标准 (AES) 加密 Amazon EMR 集群上的 Apache HBase 表。

解决方法

您可以使用透明加密功能加密新的或现有的 HBase 表。此功能可以静态加密 HFile 数据和预写日志 (WAL)。

注意:当您将 Amazon Simple Storage Service (Amazon S3) 用作数据源而非 HDFS 时,您可以使用服务器端和客户端加密保护静态和动态数据。有关更多信息,请参阅使用加密保护数据

加密新的 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 属性中指定的位置。在下面的示例中,将 HostToCopyToHost 替换为节点的相应公有 DNS 名称。

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

7.    在主节点和核心节点上重启所有的 HBase 服务,如下面的示例所示。在每个核心节点上重复 hbase-regionserver 停止和启动命令。

sudo initctl stop hbase-master
sudo initctl stop hbase-regionserver

sudo initctl start hbase-master
sudo initctl start hbase-regionserver

8.    登录 HBase shell:

# 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.encryption 设置为 false。示例:

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

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?