JindoFS Block模式支持文件加密,加密机制和使用方法与Apache HDFS的Encryption Zone类似。加密密钥通过密钥管理服务(KMS)统一管理,您可以对有敏感数据的目录设置加密策略,然后就可以透明地在该目录下加密写入的数据和解密读取的数据,无需更改您的代码。

前提条件

背景信息

Block模式加密架构图如下:Block模式加密

配置JindoFS使用阿里云KMS

  1. 进入SmartData服务。
    1. 登录阿里云E-MapReduce控制台
    2. 在顶部菜单栏处,根据实际情况选择地域和资源组
    3. 单击上方的集群管理页签。
    4. 集群管理页面,单击相应集群所在行的详情
    5. 在左侧导航栏,单击集群服务 > SmartData
  2. 进入namespace服务配置。
    1. 单击配置页签。
    2. 服务配置区域,单击namespace页签。
  3. 添加配置信息。
    1. namespace页签,单击右上角的自定义配置
    2. 新增配置项对话框中,新增如下配置。
      参数 描述
      crypto.provider.type Provider的类型,仅支持ALIYUN
      crypto.provider.endpoint KMS的公网接入地址。详情请参见请求结构
      crypto.provider.kms.accessKeyId 访问KMS的AccessKey ID。
      crypto.provider.kms.accessKeySecret 访问KMS的AccessKey Secret。
  4. 保存配置。
    1. 单击右上角的保存
    2. 确认修改对话框中,输入执行原因,开启自动更新配置
    3. 单击确定
  5. 重启配置。
    1. 在右上角选择操作 > 重启Jindo Namespace Service
    2. 执行集群操作对话框中,设置相关参数。
    3. 单击确定
    4. 确认对话框中,单击确定

使用JindoFS KeyProvider

Jindo KeyProvider负责对接KMS,加密密钥存储在KMS。KeyProvider基于KMS提供新增密钥、查询密钥和轮换密钥等功能。
  • 新增密钥:传入keyIdName,创建一个新的密钥。
    jindo key -create -keyIdName <keyIdName>
    说明 本文示例中的<keyIdName>为您创建的密钥名称。
    例如,执行以下命令新增policy_test的密钥。
    jindo key -create -keyIdName policy_test
    在阿里云KMS控制台,您可以看到新增了一个名为policy_test的密钥。policy_test
  • 查询密钥:查看当前存在的密钥名。
    jindo key -list
    返回信息如下:
    Listing Keys:
            policy_test
            policy_test2
  • 轮换密钥:您可以根据Key ID定期更换密钥。更新密钥后Key Version会随之发生变化,即文件在加密时,使用最新的密钥进行加密,文件在解密时使用现有文件的密钥版本进行解密。
    jindo key -roll -keyIdName <keyIdName>
    例如,执行以下命令轮换密钥policy_test
    jindo key -roll -keyIdName policy_test
    在阿里云KMS控制台,您可以看到密钥policy_test的版本状态已经更新,之前的版本状态变成了ACSPrevious,新的版本状态为ACSCurrentpolicy_test

管理JindoFS加密策略

您可以根据以下命令,设置和查看加密策略:
  • 设置加密策略
    注意 不能对已有文件的目录设置加密策略。
    jindo jfs -setCryptoPolicy -keyIdName <keyIdName> -cipherSuite <cipherSuite> <path>
    说明 本示例的可选参数<cipherSuite>,设置为0表示使用AES_CTR_256算法,设置为1表示使用SM4_CTR_128算法。<path>为您访问JindoFS上文件的路径。例如jfs://test/
  • 查看加密策略
    jindo jfs -getCryptoPolicy <path>
设置和查看加密策略示例如下所示:
  1. 查看jfs://test/路径的加密策略。
    jindo jfs -getCryptoPolicy jfs://test/

    返回信息显示为{NONE}

  2. 设置jfs://test/的加密策略。
    jindo jfs -setCryptoPolicy -keyIdName policy_test jfs://test/
  3. 进入bigboot目录,再次查看jfs://test/路径的加密策略。
    jindo jfs -getCryptoPolicy jfs://test/
    返回如下信息。
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/opt/apps/ecm/service/b2jindosdk/3.4.0-hadoop3.1/package/b2jindosdk-3.4.0-hadoop3.1/lib/jindo-distcp-3.4.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/opt/apps/ecm/service/hadoop/3.2.1-1.0.1/package/hadoop-3.2.1-1.0.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
    21/03/12 13:52:34 WARN: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    21/03/12 13:52:35 INFO: Jboot log name is /var/log/bigboot/jboot-20210312-135234-12953.LOG
    21/03/12 13:52:35 INFO: Write buffer size 1048576, logic block size 134217728
    21/03/12 13:52:35 INFO: cmd=getFileStatus, src=jfs://test/, dst=null, size=0, parameter=null, time-in-ms=7, version=3.4.0
    21/03/12 13:52:35 INFO: cmd=getCryptoPolicy, src=jfs://test/, dst=null, size=0, parameter=, time-in-ms=2, version=3.4.0
    The crypto policy of path: jfs://test/ is {cipherSuite: AES_CTR_NOPADDING_256, keyIdName: policy_test2, keyIdVersion: null, edek: , iv: }
    21/03/12 13:52:35 INFO: Read total statistics: oss read average <none>, cache read average <none>, read oss percent <none>
    设置完成后即可正常读写该路径下的文件。
    • 拷贝本地文件至HDFS。
      hadoop fs -put test.log jfs://test/
    • 展示文件内容。
      hadoop fs -cat jfs://test/test.log