1. 停止Hadoop

stop-all.sh
备注: 本文为Hadoop 3.3.0,很多文章不是这个版本,配置方法会有差异,总体思路是相同的。

2. 修改core-site.xml

修改结果如下:

  1. <configuration>
  2. <!-- 指定HDFS中NameNode的地址 -->
  3. <property>
  4. <name>fs.defaultFS</name>
  5. <value>hdfs://master:9000</value>
  6. </property>
  7. <!-- 指定Hadoop运行时产生文件的存储目录 -->
  8. <property>
  9. <name>hadoop.tmp.dir</name>
  10. <value>/opt/hadoop/hadoop-3.3.0/data/tmp</value>
  11. </property>
  12. <!-- 新增配置项 -->
  13. <property>
  14. <name>hadoop.security.key.provider.path</name>
  15. <value>kms://http@master:9600/kms</value>
  16. </property>
  17. </configuration>

2. 修改HDFS配置

新增如下配置

<property>
        <name>dfs.encryption.key.provider.uri</name>
        <value>kms://http@master:9600/kms</value>
</property>

3. 生成密钥容器keystore

使用jdk统计keytool生成密钥容器

keytool -genkey -alias 'kmskey' -keystore /opt/kms.jks -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass 123456 -storepass 123456 -validity 180

JDK会提示将文件格式转换为PKCS12,可以按照提示执行转换命令。
此处生成的文件放在了 /opt/ 路径下,可以按照需要修改。

4. 生成密钥容器访问口令存储文件

KMS访问keystore需要口令,默认是通过文件获取口令,这里需要手动创建口令存储文件,后面会说明如果告知KMS口令存储文件位置。

echo 123456 > /opt/kms.keystore.password

123456 是上面生成keystore文件时指定的访问口令;
kms.keystore.password 是口令存储文件名称;

5. 修改kms配置

访问 {HADOOP_HOME}/etc/hadoop ,打开 kms-site.xml ,增加如下配置

<configuration>
  <property>
    <name>hadoop.kms.key.provider.uri</name>
    <value>jceks://file@/opt/kms.jks</value>
    <description>
      URI of the backing KeyProvider for the KMS.
    </description>
  </property>
  <property>
    <name>hadoop.security.keystore.java-keystore-provider.password-file</name>
    <value>/opt/kms.keystore.password</value>
    <description>
      If using the JavaKeyStoreProvider, the file name for the keystore password.
    </description>
  </property>
</configuration>

修改hdfs-site.xml

<property>
     <name>dfs.encryption.key.provider.uri</name>
     <value>kms://http@localhost:16000/kms</value>
</property>

6. 启动服务

启动hadoop
start-all.sh
启动后执行 jps 可以看到如下信息:

[root@master hadoop]# jps
35793 ResourceManager
35003 NameNode
35179 DataNode
36030 NodeManager
36671 Jps

启动KMS服务
hadoop --daemon start kms
再次查看Hadoop服务,发现KMS服务以启动

[root@master hadoop]# jps
35793 ResourceManager
11511 KMSWebServer
35003 NameNode
35179 DataNode
36030 NodeManager
12062 Jps

7. KMS使用

hadoop key create first_key 创建一个名为 first_key 的密钥
执行结果如下:

[root@master hadoop]# hadoop key create first_key
first_key has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@34f7cfd9 has been updated.

hadoop key create sub_key 创建另外一个密钥
hadoop key list 查看所有密钥
hadoop fs -mkdir /sub_dir 创建一个HDFS目录
hdfs crypto -createZone -keyName sub_key -path /sub_dir 创建一个加密区域,并指定密钥

[root@master hadoop]# hdfs crypto -createZone -keyName sub_key -path /sub_dir
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Added encryption zone /sub_dir

hdfs crypto -listZones 列出所有加密区域
密钥创建及加密区创建实例:

[root@master hadoop]# hadoop key create zone_key
zone_key has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@34f7cfd9 has been updated.
[root@master hadoop]# hadoop key list
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@a1cdc6d
zone_key
user_a_key
key2
[root@master hadoop]# hadoop fs -mkdir /zone_dir
[root@master hadoop]# hdfs crypto -createZone -keyName zone_key -path /zone_dir
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Added encryption zone /zone_dir
[root@master hadoop]#

7.1 存储数据到加密区

hdfs dfs -put /xx/xxx /zone_dir/ 其中 /xx/xxx 是随便创建的一个文件

7.2 浏览器查看

浏览器访问HDFS服务

http://{ip}:9870/explorer.html#/

查看 /zone_dir/xxx 文件,弹窗中可以看到以下几个元素:

Block ID: 1073743021
Block Pool ID: BP-1172103535-{IP}-1610506234874
Generation Stamp: 2197
Size: 770
Availability:
master
slave2

7.3 命令行查看明文

hdfs dfs -cat /zone_dir/xxx 可以直接查看文件内容,如果使用的是文件上传用户,能查看到文件内容

7.4 查看磁盘存储内容

HDFS磁盘一般存储在集群配置的 data 目录下,示例中,文件存储的磁盘路径为:
/opt/hadoop/hadoop-3.3.0/data/dfs/data/current/BP-1172103535-{IP}-1610506234874/current/finalized/subdir0/subdir4/blk_1073743021
这个路径有两个关键信息从7.2节中查看到的。

参考文章:

http://hadoop.apache.org/docs/stable/hadoop-kms/index.html
KMS密钥管理服务(Hadoop)
非常详细的配置说明,版本比较旧