加密HFile和WAL内容
加密HFile和WAL内容
- 设置HFile和WAL为SMS4加密或AES加密方式对系统的影响较大,一旦操作失误会导致数据丢失。不推荐使用此功能。
- 使用Bulkload批量导入的数据不支持加密。
缺省情况下,HBase中的HFile和WAL(Write ahead log)内容是不加密的。如果用户需要对其进行加密,可通过如下操作进行配置。
- 在任一安装HBase服务节点,使用omm用户执行如下命令创建密钥。
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh <path>/hbase.jks <type> <length> <alias>
- /<path>/hbase.jks表示生成的jks文件存储路径。
- <type>表示加密的类型,支持SMS4或AES。
- <length>表示密钥的长度,SMS4支持16位长度,AES支持128位长度。
- <alias>为密钥文件的别名,第一次生成时请使用缺省值“omm”。
例如,生成SMS4加密的密钥执行:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh /home/hbase/conf/hbase.jks SMS4 16 omm
生成AES加密的密钥执行:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh /home/hbase/conf/hbase.jks AES 128 omm
- 集群的操作用户需要有<path>/hbase.jks目录的“rw”权限,且要求目录已存在。
- 运行命令后需要再输入4遍相同的<password>。其中3中进行加密的密码与此步骤的密码相同。
- 将生成的密钥文件分发到集群中所有节点的相同目录下,并为omm用户配置该文件的读写权限。
- 请根据企业安全要求,选择安全的操作步骤分发密钥。
- 如果在使用过程中,有节点出现密钥文件丢失的情况,请按照此步骤从其他节点拷贝到该节点。
- 在FusionInsight Manager界面中,设置“hbase.crypto.keyprovider.parameters.encryptedtext”参数的值为密文密码,设置“hbase.crypto.keyprovider.parameters.uri”参数的值为密钥路径和名称。
- “hbase.crypto.keyprovider.parameters.uri”格式为:jceks://<key_Path_Name>。
<key_Path_Name>填写密钥的存储路径,例如“/home/hbase/conf/hbase.jks”则对应参数值为“jceks:///home/hbase/conf/hbase.jks”。
- “hbase.crypto.keyprovider.parameters.encryptedtext”格式为:<encrypted_password>。
<encrypted_password>填写创建密钥时的密文密码,参数值显示为密文。使用omm用户在安装HBase服务的节点,执行如下命令获取对应加密后的密码:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh
运行命令后需要输入<password>。该密码与1中手动输入的密码相同。
- “hbase.crypto.keyprovider.parameters.uri”格式为:jceks://<key_Path_Name>。
- 在FusionInsight Manager界面中,设置“hbase.crypto.key.algorithm”参数值为“SMS4”或“AES”,使HFile的内容采用SMS4或AES的方式加密。
- 在FusionInsight Manager界面中,设置“hbase.crypto.wal.algorithm”参数值为“SMS4”或“AES”,使WAL的内容采用SMS4或AES的方式加密。
- 在FusionInsight Manager界面中,将“hbase.regionserver.wal.encryption”参数值修改为“true”。
- 保存设置,并重启HBase服务使其生效。
- 在创建HBase表时,需要通过设置加密方式,<type>表示加密的类型。
- 通过命令行创建表时,直接设置加密方式为SMS4或AES。
create '<table name>', {NAME => 'd', ENCRYPTION => '<type>'}
- 使用代码创建表时,在代码中添加如下信息设置加密方式为SMS4或AES。
public void testCreateTable() { String tableName = "user"; Configuration conf = getConfiguration(); HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName)); HColumnDescriptor hcd = new HColumnDescriptor("info"); //设置加密方式为SMS4或AES。 hcd.setEncryptionType("<type>"); htd.addFamily(hcd); HBaseAdmin admin = null; try { admin = new HBaseAdmin(conf); if(!admin.tableExists(tableName)) { admin.createTable(htd); } } catch (IOException e) { e.printStackTrace(); } finally { if(admin != null) { try { admin.close(); } catch (IOException e) { e.printStackTrace(); } } } }
- 通过命令行创建表时,直接设置加密方式为SMS4或AES。
- 如果用户已按照1到7配置了SMS4或AES加密,但是在执行8创建表时,未设置对应的加密参数,使得插入的数据未经加密。
此时,您可以执行如下步骤对之前插入的数据进行加密。
- 针对表执行flush动作,将内存中的数据导入到HFile中。
- 执行以下步骤修改表属性。
alter'<table_name>',NAME=>'<column_name>',ENCRYPTION => '<type>'
enable'<table_name>'
- 插入一条新的数据,然后flush表。
必须要插入一条新的数据,HFile才会生成新的HFile,使得之前插入的未加密数据进行重写加密。
put'<table_name>','id2','f1:c1','value222222222222222222222222222222222'
flush'<table_name>'
- 执行如下步骤重写HFile。
修改密钥文件
修改密钥文件的操作对系统影响较大,一旦操作失误会导致数据丢失。不推荐使用此功能。
在加密HFile和WAL内容操作中需要生成对应的密钥文件并设置密码,为确保系统安全,在运行一段时间后,用户可修改密钥,使用新的密钥文件对HFile和WAL内容进行加密。
- 使用omm用户执行如下命令生成新的密钥文件。
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh <path>/hbase.jks <type> <length> <alias-new>
- <path>/hbase.jks:表示生成的hbase.jks文件的存储路径。该路径和文件名称需与加密HFile和WAL内容章节生成的密钥文件相同。
- <alias-new>:表示密钥文件的别名,请使用与旧密钥文件不同的名字。
- <type>表示加密的类型,支持SMS4或AES。
- <length>表示密钥的长度,SMS4支持16位长度,AES支持128位长度。
例如,生成SMS4加密的密钥执行:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh /home/hbase/conf/hbase.jks SMS4 16 omm_new
生成AES加密的密钥执行:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh /home/hbase/conf/hbase.jks AES 128 omm_new
- 集群的操作用户需要有<path>/hbase.jks目录的“rw”权限,且要求目录已存在。
- 运行命令后需要再输入3遍相同的<password>,该密码表示密钥文件的密码,请直接使用旧文件的密码,不会产生安全风险。
- 将生成的密钥文件分发到集群中所有节点的相同目录下,并为omm用户配置该文件的读写权限。
请根据企业安全要求,选择安全的操作步骤分发密钥。
- 在FusionInsight Manager的HBase服务配置界面中增加自定义配置项,设置“hbase.crypto.master.key.name”为“omm_new”,设置“hbase.crypto.master.alternate.key.name”为“omm”,然后保存配置。
- 重启HBase服务,使配置生效。
- 在HBase shell中执行major compact命令,生成基于新的加密算法的HFile文件。
major_compact '<table_name>'
- 从HMaster的网页中可以查看到major compact进度。
- 所有的“Compaction Progress”都为100%且“Remaining KVs”都为0时,使用omm用户执行如下命令销毁旧的密钥文件:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh <path>/hbase.jks <alias-old>
- <path>/hbase.jks:表示生成的“hbase.jks”文件的存储路径。该路径和文件名称需与加密HFile和WAL内容章节生成的密钥文件相同。
- <alias-old>:表示要删除的旧密钥文件的别名。
例如:
sh ${BIGDATA_HOME}/FusionInsight_HD_8.0.2.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh /home/hbase/conf/hbase.jks omm
集群的操作用户需要有<path>/hbase.jks目录的“rw”权限,且要求目录已存在。
- 再执行2,重新分发更新后的密钥文件。
- 从FusionInsight Manager中删除3中新增HBase自定义配置项“hbase.crypto.master.alternate.key.name”。
- 再执行4使配置生效。