1. 停止Hadoop
stop-all.sh
备注: 本文为Hadoop 3.3.0,很多文章不是这个版本,配置方法会有差异,总体思路是相同的。
2. 修改core-site.xml
修改结果如下:
<configuration><!-- 指定HDFS中NameNode的地址 --><property><name>fs.defaultFS</name><value>hdfs://master:9000</value></property><!-- 指定Hadoop运行时产生文件的存储目录 --><property><name>hadoop.tmp.dir</name><value>/opt/hadoop/hadoop-3.3.0/data/tmp</value></property><!-- 新增配置项 --><property><name>hadoop.security.key.provider.path</name><value>kms://http@master:9600/kms</value></property></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)
非常详细的配置说明,版本比较旧
