如何在CDH实现HDFS透明加密

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

1.文档编写目的


在前面文章Fayson介绍过《什么是HDFS透明加密》,要实现HDFS的透明加密,首先你需要一个KMS,KMS可以用CDH自带的Java KeyStore KMS也可以使用企业版工具Navigator。这里我们首先演示基础的Java KeyStore KMS,Fayson会在后面的文章介绍Navigator KMS以及Key Trustee Server。Java KeyStore KMS保存秘钥文件到本地,提供简单的密码保护。Cloudera不建议生产系统使用Java KeyStore KMS。

本文主要介绍如何通过Cloudera Manager安装Java KeyStore KMS服务,并且实现HDFS的透明加密。

  • 内容概述

1.安装KMS服务

2.HDFS加密测试

  • 测试环境

1.CentOS6.5

2.CDH5.13

2.安装KMS


1.安装libcrypto.so,所有机器都需要,安装完成所有机器检查。

[root@ip-172-31-6-148shell]# sh ssh_do_all.sh node.list "yum -y install openssl-devel"
Loaded plugins: fastestmirror, presto
Loading mirror speeds from cached hostfile
 * base: mirror.qoxy.com
 * extras: mirror.qoxy.com
 * updates: mirror.qoxy.com
Setting up Install Process
Package openssl-devel-1.0.1e-57.el6.x86_64 already installed and latest version
Nothing to do
Connection to ip-172-31-6-148.fayson.com closed.
[root@ip-172-31-6-148 shell]# sh ssh_do_all.sh node.list "hadoop checknative"
17/12/09 09:59:54 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
17/12/09 09:59:54 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop:  true/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/lib/hadoop/lib/native/libhadoop.so.1.0.0
zlib:    true /lib64/libz.so.1
snappy:  true/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/lib/hadoop/lib/native/libsnappy.so.1
lz4:     true revision:10301
bzip2:   true /lib64/libbz2.so.1
openssl: true /usr/lib64/libcrypto.so
Connection to ip-172-31-6-148.fayson.com closed.

注:确认openssl出现true,例如openssl: true/usr/lib64/libcrypto.so。如果是false,表示 libcrypto.so没有正确安装或配置,需要检查和改正。

Fayson的机器因为已经安装过了,所以提示“already installedand latest version”

2.通过Cloudera Manager主界面安装KMS

选择Java KeyStore KMS,点击“继续”

输入秘钥管理员用户和用户组,注意hdfs超级用户已经被禁止设置为秘钥管理员,具体可以参考Fayson在《什么是HDFS透明加密》中的说明,HDFS管理员和秘钥管理员是分开的。

点击“生成ACL”,并点击“继续”

提示设置“TLS”,暂时不用做任何操作,点击“继续”

点击“继续”

等待服务启动完毕,点击“继续”

点击“继续”

安装完毕,点击“继续”

回到主页,按照提示重启整个集群。

等待重启完毕,至此安装KMS完毕。

3.确认HDFS已经启用了KMS服务

3.测试HDFS加密


1.新建用户user1,创建一个秘钥key1

[root@ip-172-31-6-148 shell]# hadoop key create key1

key1 has not been created. org.apache.hadoop.security.authorize.AuthorizationException: User:root not allowed to do 'CREATE_KEY' on 'key1'
[root@ip-172-31-6-148 shell]# 
[root@ip-172-31-6-148 shell]# sudo -u hdfs hadoop key create key1
key1 has not been created. org.apache.hadoop.security.authorize.AuthorizationException: User:hdfs not allowed to do 'CREATE_KEY' on 'key1'
[root@ip-172-31-6-148 shell]# sudo -u fayson hadoop key create key1
key1 has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
KMSClientProvider[http://ip-172-31-10-118.fayson.com:16000/kms/v1/] has been updated.

注意:在创建秘钥时,发现无论是root用户还是hdfs用户都无法创建成功,必须使用我们在安装配置KMS的时候设置的秘钥管理员fayson。

2.创建一个HDFS目录并设置为加密区域。

[root@ip-172-31-6-148 shell]# hadoop fs -mkdir /user/user1
[root@ip-172-31-6-148 shell]# sudo -u hdfs hadoop fs -chown user1:user1 /user/user1
[root@ip-172-31-6-148 shell]# sudo -u hdfs hdfs crypto -createZone -keyName key1 -path /user/user1
Added encryption zone /user/user1
[root@ip-172-31-6-148 shell]# sudo -u hdfs hdfs crypto -listZones
/user/user1  key1

请注意需要使用hdfs超级用户

3.再创建一个目录,用于后面比较加密目录

[root@ip-172-31-6-148 shell]# hadoop fs -mkdir /user1/
[root@ip-172-31-6-148 shell]# sudo -u hdfs hadoop fs -chown user1:user1 /user1

4.切换到user1用户分别上传文件到加密区域以及非加密区域

准备一个文件

上传文件到加密区域和非加密区域

[user1@ip-172-31-6-148 ~]$ hadoop fs -put a.txt /user1
[user1@ip-172-31-6-148 ~]$ hadoop fs -put a.txt /user/user1
[user1@ip-172-31-6-148 ~]$ hadoop fs -cat /user1/a.txt
fsdfsfsdfsdddddddddd
123456789
Fayson is fat!
[user1@ip-172-31-6-148 ~]$ hadoop fs -cat /user/user1/a.txt
fsdfsfsdfsdddddddddd
123456789
Fayson is fat!

注意需要给上面创建的秘钥key1赋予用户和用户组user1的访问权限,否则用户user1无法put文件到/user/user1目录。

5.通过HDFS的50070页面查看上传的文件的block分布在那台DataNode上,并记录下Block ID。

6.登录到ip-172-31-10-118.fayson.com机器,查看block文件

从步骤5,我们可以知道在加密区域/user/user1的文件“a.txt”的block ID为1073776797,在非加密区域/user1的文件“a.txt“的block ID为1073776707

[root@ip-172-31-10-118 ~]# find / -name "*1073776797*"
/dfs/dn/current/BP-900745788-172.31.6.148-1508157818810/current/finalized/subdir0/subdir136/blk_1073776797
/dfs/dn/current/BP-900745788-172.31.6.148-1508157818810/current/finalized/subdir0/subdir136/blk_1073776797_36850.meta
[root@ip-172-31-10-118 ~]# cat /dfs/dn/current/BP-900745788-172.31.6.148-1508157818810/current/finalized/subdir0/subdir136/blk_1073776797
????fJPQ٥??f ?Lx?+?f?6фt6=ko?1l?+"N?[
root@ip-172-31-10-118 ~]# 
[root@ip-172-31-10-118 ~]# find / -name "*1073776707*"
/dfs/dn/current/BP-900745788-172.31.6.148-1508157818810/current/finalized/subdir0/subdir136/blk_1073776707
/dfs/dn/current/BP-900745788-172.31.6.148-1508157818810/current/finalized/subdir0/subdir136/blk_1073776707_36760.meta
[root@ip-172-31-10-118 ~]# cat /dfs/dn/current/BP-900745788-172.31.6.148-1508157818810/current/finalized/subdir0/subdir136/blk_1073776707
fsdfsfsdfsdddddddddd
123456789
Fayson is fat!

4.总结


1.通过HDFS的透明加密可以实现HDFS底层文件的加密,如本文前面所述,对于非加密区域/user1下的文件a.tx可以直接通过block ID查找到该block文件,并直接查看到明文。但是在加密区域/user/user1下的文件a.txt虽然也可以直接查找到该block文件,但是查看确是密文。

2.在安装Java KMS的时候,Cloudera Manager会提示不能将HDFS超级用户hdfs设置为秘钥管理员,这是为了防止HDFS的超级用户既可以访问任何文件,又可以访问所有秘钥,从而可以直接解密所有HDFS文件而造成安全问题。具体可以参考Fayson前面的文章《什么是HDFS透明加密》。

3.在通过user1用户上传文件到自己所属的加密区域时,必须设置该加密区域的秘钥文件key1可以被user1访问,该设置通过Cloudera Manager管理的Java KeyStore KMS的配置中设置,将user1用户和组加入到ACL列表,否则会报以下错误。

[user1@ip-172-31-6-148 ~]$ hadoop fs -put a.txt /user/user1
put: User [user1] is not authorized to perform [DECRYPT_EEK] on key with ACL name [key1]!!
17/12/09 11:49:33 ERROR hdfs.DFSClient: Failed to close inode 352863
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /user/user1/a.txt._COPYING_ (inode 352863): File does not exist. Holder DFSClient_NONMAPREDUCE_1915499091_1 does not have any open files.
   at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:3752)
   at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.completeFileInternal(FSNamesystem.java:3839)
   at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.completeFile(FSNamesystem.java:3809)
   at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.complete(NameNodeRpcServer.java:748)
   at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.complete(AuthorizationProviderProxyClientProtocol.java:248)

为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看

本文分享自微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hadoop实操

如何使用R连接Hive与Impala

继之前的文章讲述如何在Redhat中配置R环境和如何在Redhat中安装R的包及搭建R的私有源后,那我们如何使用R连接CDH集群中的Hive和Impala进行数...

68960
来自专栏Hadoop实操

如何通过CM禁用Federation

本文主要讲述如何通过CM禁用Federation。我前面写过两篇关于Federation的文章,可参看《HDFS Federation(联邦)简介》和《如何通过...

15440
来自专栏Hadoop实操

如何使用CDSW在CDH中分布式运行所有R代码

无需额外花费过多的学习成本,sparklyr(https://spark.rstudio.com)可以让R用户很方便的利用Apache Spark的分布式计算能...

56260
来自专栏Hadoop实操

如何在Kerberos环境下的CDH集群部署Spark2.1的Thrift及spark-sql客户端

55540
来自专栏Hadoop实操

如何安装Tableau并连接CDH的Hive/Impala

Tableau是桌面系统中的商业智能工具软件,可以基于不同的数据源生成漂亮的图表。Cloudera与Tableau是互相认证的合作伙伴,在Tableau的数据源...

1.2K90
来自专栏Hadoop实操

如何使用Oozie API接口向Kerberos集群提交Java程序

在CDH集群外的节点向集群提交MapReduce作业的方式有多种,前面Fayson介绍了《如何跨平台在本地开发环境提交MapReduce作业到CDH集群》和《如...

1.3K70
来自专栏我是攻城师

Hadoop之NameNode+ResourceManager高可用原理分析

57470
来自专栏Hadoop实操

如何使用java代码通过JDBC访问Sentry环境下的Hive

在前面的文章Fayson介绍了《如何使用java代码通过JDBC连接Hive(附github源码)》、《如何使用java代码通过JDBC连接Impala(附Gi...

61460
来自专栏Hadoop实操

CDH5弃用的项目

20420
来自专栏我是攻城师

CDH-Hadoop2.6+ Apache Pig0.15安装记录

37850

扫码关注云+社区

领取腾讯云代金券