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

3 分钟阅读
0

我想要使用高级加密标准 (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:file mysecurefile -genseckey -keyalg AES -keysize 128 -alias your-alias<br>

注意:文件:securefile 包含密钥库密码。确保该文件只能由文件所有者读取,并在使用后删除。

示例输出:

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 停止和启动命令。

**注意:**停止和启动区域服务器可能会影响正在进行的对集群上 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 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', 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>

相关信息

使用 HBase shell

Amazon EMR 上的 HDFS 透明加密

相关视频

AWS 官方
AWS 官方已更新 2 年前