更新时间:2023-04-10 GMT+08:00

加密HFile和WAL内容

加密HFile和WAL内容

  • 设置HFile和WAL为SMS4加密或AES加密方式对系统的影响较大,一旦操作失误会导致数据丢失。不推荐使用此功能。
  • 使用Bulkload批量导入的数据不支持加密。

缺省情况下,HBase中的HFile和WAL(Write ahead log)内容是不加密的。如果用户需要对其进行加密,可通过如下操作进行配置。

  1. 在任一安装HBase服务节点,使用omm用户执行如下命令创建密钥。

    sh ${BIGDATA_HOME}/FusionInsight_HD_8.1.0.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.1.0.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.1.0.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中进行加密的密码与此步骤的密码相同。

  2. 将生成的密钥文件分发到集群中所有节点的相同目录下,并为omm用户配置该文件的读写权限。

    • 请管理员根据企业安全要求,选择安全的操作步骤分发密钥。
    • 如果在使用过程中,有节点出现密钥文件丢失的情况,请按照此步骤从其他节点拷贝到该节点。

  3. 在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.1.0.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh

      运行命令后需要输入<password>。该密码与1中手动输入的密码相同。

  4. 在FusionInsight Manager界面中,设置“hbase.crypto.key.algorithm”参数值为“SMS4”或“AES”,使HFile的内容采用SMS4或AES的方式加密。
  5. 在FusionInsight Manager界面中,设置“hbase.crypto.wal.algorithm”参数值为“SMS4”或“AES”,使WAL的内容采用SMS4或AES的方式加密。
  6. 在FusionInsight Manager界面中,将“hbase.regionserver.wal.encryption”参数值修改为“true”。
  7. 保存设置,并重启HBase服务使其生效。
  8. 在创建HBase表时,需要通过设置加密方式开启加密功能,<type>表示加密的类型,“d”为加密列族。

    • 通过命令行创建表时,直接为列族设置加密方式为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("d"); 
          //设置加密方式为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(); 
                  } 
              } 
          } 
      }

  9. 可参考验证加密是否配置成功验证加密是否配置成功。
  10. 如果用户已按照17配置了SMS4或AES加密,但是在执行8创建表时,未设置对应的加密参数,使得插入的数据未经加密。

    此时,您可以执行如下步骤对之前插入的数据进行加密。

    1. 针对表执行flush动作,将内存中的数据导入到HFile中。

      flush'<table_name>'

    2. 执行以下步骤修改表属性。

      disable'<table_name>'

      alter'<table_name>',NAME=>'<column_name>',ENCRYPTION => '<type>'

      enable'<table_name>'

    3. 插入一条新的数据,然后flush表。

      必须要插入一条新的数据,HFile才会生成新的HFile,使得之前插入的未加密数据进行重写加密。

      put'<table_name>','id2','f1:c1','value222222222222222222222222222222222'

      flush'<table_name>'

    4. 执行如下步骤重写HFile。
      major_compact'<table_name>'

      执行此步骤时,HBase表是被禁用的,不能提供表服务。请谨慎使用。

    5. 可执行6验证加密是否配置成功。

验证加密是否配置成功

仅当所配置的空表允许写入测试数据时可执行该操作

  1. 以客户端安装用户,登录安装客户端的节点。切换到客户端安装目录,例如:/opt/client

    cd /opt/client

  2. 执行以下命令配置环境变量。

    source bigdata_env

  3. 如果当前集群已启用Kerberos认证如果当前集群为安全集群,执行以下命令认证当前用户,当前用户需要具有读写HBase表的权限和HDFS的操作权限:

    kinit 组件业务用户

    如果当前集群未启用Kerberos认证如果当前集群为普通集群,则执行以下命令设置Hadoop用户名:

    export HADOOP_USER_NAME=hbase

  4. 执行以下命令进入HBase客户端。

    hbase shell

    执行以下命令插入一条新的数据,然后flush表,生成HFile。

    put'<table_name>','id2','d:c1','value222222222222222222222222222222222'

    flush'<table_name>'

    • <table_name>”为8已配置了SMS4或AES加密的表。
    • d”为8已配置了SMS4或AES加密的列族。

  5. 执行“Ctrl+C”命令退出HBase客户端。
  6. 执行以下命令查看4生成的HFile文件所在目录。

    hdfs dfs -ls

    文件目录格式为:/hbase/data/<namespace_name>/<table_name>/<region_name>/<columnfamily_name>/<HFile_name>

    创建HBase建表时若未指定表的“<namespace_name>”则默认为default。

    例如:

    /hbase/data/default/create_table/dd61b81b1ba1aad6513b9bdcfd8f871c/d/aa6fe387b27443afaba40f5b584c1fa7

  7. 执行以下命令查看HFile内容:

    hbase hfile -f <hfile路径> -p

    <hfile路径> ”为6查看到的HFile文件所在目录。

    该命令将报“com.huawei.hadoop.hbase.io.crypto.CryptoRuntimeException”异常。此时hbase shell中仍可正常读取该表数据,即加密配置成功。

修改密钥文件

修改密钥文件的操作对系统影响较大,一旦操作失误会导致数据丢失。不推荐使用此功能。

加密HFile和WAL内容操作中需要生成对应的密钥文件并设置密码,为确保系统安全,在运行一段时间后,用户可修改密钥,使用新的密钥文件对HFile和WAL内容进行加密。

  1. 使用omm用户执行如下命令生成新的密钥文件。

    sh ${BIGDATA_HOME}/FusionInsight_HD_8.1.0.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.1.0.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.1.0.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>,该密码表示密钥文件的密码,请直接使用旧文件的密码,不会产生安全风险。

  2. 将生成的密钥文件分发到集群中所有节点的相同目录下,并为omm用户配置该文件的读写权限。

    请管理员根据企业安全要求,选择安全的操作步骤分发密钥。

  3. 在FusionInsight Manager的HBase服务配置界面中增加自定义配置项,设置“hbase.crypto.master.key.name”“omm_new”,设置“hbase.crypto.master.alternate.key.name”“omm”,然后保存配置。

  4. 重启HBase服务,使配置生效。
  5. 在HBase shell中执行major compact命令,生成基于新的加密算法的HFile文件。

    major_compact '<table_name>'

  6. 从HMaster的网页中可以查看到major compact进度。

  7. 所有的“Compaction Progress”都为100%且“Remaining KVs”都为0时,使用omm用户执行如下命令销毁旧的密钥文件:

    sh ${BIGDATA_HOME}/FusionInsight_HD_8.1.0.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.1.0.1/install/FusionInsight-HBase-2.2.3/hbase/bin/hbase-encrypt.sh /home/hbase/conf/hbase.jks omm

    集群的操作用户需要有<path>/hbase.jks目录的“rw”权限,且要求目录已存在。

  8. 再执行2,重新分发更新后的密钥文件。
  9. 从FusionInsight Manager中删除3中新增HBase自定义配置项“hbase.crypto.master.alternate.key.name”。
  10. 再执行4使配置生效。