如何使用 AES 对 Amazon EMR 中的 HBase 表加密?
我想要使用高级加密标准 (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 属性中指定的位置。在下面的示例中,将 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 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>
相关信息
相关内容
- 已提问 1 个月前lg...
- AWS 官方已更新 10 个月前
- AWS 官方已更新 9 个月前