前言
1). 官方说明:
Hadoop KMS是一个基于 Hadoop的 KeyProvider API的用密码写的 key 管理server。Client是一个KeyProvider的实现,使用KMS HTTP REST API与KMS交互。
KMS和它的客户端内置安全和它们支持HTTP SPNEGO Kerberos 身份验证和HTTPS安全转换. KMS是一个Java Web应用程序,运行在与Hadoop发行版绑定在一起的预先配置好的Tomcat服务器上。 注意:Kms是一个密钥管理服务器,它并不负责加密文件2). 透明加密:
HDFS 实现透明,端到端加密。配置完kms后,用户往hdfs上存储数据的时候,无需用户做任何程序代码的更改(意思就是调用KeyProvider API ,用于在数据存入到HDFS上面的时候进行数据加密,解密的过程一样)。这意味着数据加密和解密由客户端完成的。
一、背景环境
1.1、版本说明
Hadoop: hadoop-2.8.0
Java:jdk1.8.0_131
1.2、Hadoop集群环境
使用五台服务器已完成Hadoop集群搭建,测试可使用单台虚拟节点。
节点 | IP | 作用 | 备注 |
master | 10.8.1.220 | Namanode,DataNode | |
Slave1 | 10.8.1.221 | DataNode | |
Slave2 | 10.8.1.222 | DataNode | |
Slave3 | 10.8.1.223 | DataNode | |
Slave4 | 10.8.1.224 | DataNode |
1.3、开放端口
http://10.8.1.220:50070 #Hadoop webui 访问界面,可以看到hdfs存储状态及文件浏览。
二、配置文件
共涉及core-site.xml,hdfs-site.xml ,kms-site.xml,kms-env.sh,kms-acls.xml五个文件
core-site.xml 新增配置项
<property> <name>hadoop.security.key.provider.path</name> <value>kms://http@master:16000/kms</value> </property>
hdfs-site.xml 新增配置项
<property> <name>dfs.encryption.key.provider.uri</name> <value>kms://http@master:16000/kms</value> </property>
以上两项配置结束后,重启Hadoop,之后变更仅重启kms服务即可。
<!-- KMS Backend KeyProvider --> <property> <name>hadoop.kms.key.provider.uri</name> <value>jceks://file@/${user.home}/kms.keystore</value> <description> URI of the backing KeyProvider for the KMS. </description> </property> <property> <name>hadoop.security.keystore.java-keystore-provider.password-file</name> <value>kms.keystore.password</value> #秘钥密码存储文件,需要手动创建,放在kms的tomcat下classes文件夹下 <description> If using the JavaKeyStoreProvider, the file name for the keystore password. </description> </property>
使用keytool生成的秘钥密码是123456 将密码直接写入到kms.keystore.password文件
echo 123456 > ${HADOOP_HOME}/share/hadoop/kms/tomcat/webapps/kms/WEB-INF/classes/kms.keystore.password
kms-env.sh 配置文件
export KMS_LOG=${KMS_HOME}/logs/kms export KMS_HTTP_PORT=16000 export KMS_ADMIN_PORT=16001
kms-acls.xml 此文件随时会做变更,主要配置key和用户对应关系
根据测试需求,新增user_a_key对应user_a,user_b_key对应user_b
<property> <name>key.acl.user_a_key.DECRYPT_EEK</name> <value>user_a</value> <description> ACL for decryptEncryptedKey operations. </description> </property> <property> <name>key.acl.user_b_key.DECRYPT_EEK</name> <value>user_b</value> <description> ACL for decryptEncryptedKey operations. </description> </property>
三、创建秘钥
keytool -genkey -alias 'user_a_key' Enter keystore password:123456 #-----此处创建的密码,需要和上面kms.keystore.password配置文件的密码相同 Re-enter new password: What is your first and last name? [Unknown]: test #-----这一部分内容,用户随意填写 What is the name of your organizational unit? [Unknown]: test What is the name of your organization? [Unknown]: test What is the name of your City or Locality? [Unknown]: test What is the name of your State or Province? [Unknown]: test What is the two-letter country code for this unit? [Unknown]: test Is CN=lch, OU=gdbd, O=gdbd, L=sz, ST=sz, C=sz correct? [no]: yes #输入yes Enter key password for <user_a_key> (RETURN if same as keystore password): Re-enter new password:
相同方式创建user_b_key
四、创建加密区
hadoop key create user_a_key #user_a_key为上面通过keytool创建的 hadoop key list #查看key详细信息 hadoop fs -mkdir /user_a #创建文件目录 hadoop fs -chown user_a:test_group /user_a #配置user_a目录权限 hdfs crypto -createZone -keyName user_a_key -path /user_a #---设置/user_a为加密区 Added encryption zone /user_a hdfs crypto -listZones #---查看已加密区域 18/06/04 17:01:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable /user_a user_a_key
相同方式创建user_b目录并使用user_b_key对目录加密
五、加密前后对比
su - user_c
使用user_c用户上传文件test.txt至user_a及user_b文件目录,均报错没有权限
将test.txt上传至user_c文件夹
切换至user_a用户,将test.txt文件上传至/user_a文件夹,切换至user_b用户,将test.txt文件上传至/user_b文件夹。
使用user_a用户读取/user_a/test.txt文件可正常显示,读取/user_b/test.txt文件提示没有权限
hdfs dfs -cat /.reserved/raw/user_a/test.txt #显示文件已乱码
hdfs dfs -cat /.reserved/raw/user_c/test.txt 为经过加密的文件夹内文件显示正常
六、总结
1)、正确的配置及创建秘钥保证了测试的顺利通过,通过命令行方式来测试还是比较麻烦,需要ui支持。
2)、Kms和Hdfs配合使用的作用旨在补全hdfs权限管控的安全漏洞,正常使用hdfs时,用户感觉不到文件加密的存在,所以叫“hdfs透明加密”。
精彩评论