Hadoop KMS 使用
Hadoop KMS配置
以hdfs的单机环境为例说明搭建过程
1. hdfs配置
1) 下载hadoop 2.6以上的版本,解压之后,配置HADOOP_HOME
export HADOOP_HOME=/root/hadoop-2.7.4
export PATH=${PATH}:${HADOOP_HOME}/bin
2) 配置core-site.xml与hdfs-site.xml
core-site.xml的配置:
<property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property>
hdfs-site.xml的配置
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/datalog1</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/data1,/usr/local/hadoop/data2</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
3) 执行hadoop namenode –format之后,启动hdfs,保证hdfs可以正常运行
2. 配置kms
1) 首先生成相应的策略
[root@hdp130 hadoop]# keytool -genkey -alias 'key1'
Enter keystore password: -----此处创建的密码,需要写入到下面的配置文件中
Re-enter new password:
What is your first and last name?[Unknown]: lch -----这一部分内容,用户随意填写
What is the name of your organizational unit?[Unknown]: gdbd
What is the name of your organization?[Unknown]: gdbd
What is the name of your City or Locality?[Unknown]: sz
What is the name of your State or Province?[Unknown]: sz
What is the two-letter country code for this unit?[Unknown]: sz
Is CN=lch, OU=gdbd, O=gdbd, L=sz, ST=sz, C=sz correct?[no]: yesEnter key password for <key1>(RETURN if same as keystore password):
Re-enter new password:
2) 配置kms-site.xml文件
<configuration><property>
<!--这里的输入可以看成两部分(可以不修改,原样复制到kms-site.xml中去):
jceks://file@/ : 这是固定的值,不用管它
${user.home}/kms.jks : 它会根据用户名来设定值,需要注意的:在前面执行keytool 命令的用户需要与后面执行kms.sh start是同一个用户。
原因:keytool执行命令之后,会在当前用户的根目录下面生成一个配置文件:
.keystore, 它会去读取。
--><name>hadoop.kms.key.provider.uri</name><value>jceks://file@/${user.home}/kms.jks</value><description>URI of the backing KeyProvider for the KMS.</description></property><!--这个配置其实就是设置执行keytool命令时输入的密码。 但是它比较奇怪,需要如下设置。Kms启动的时候,实质是启动了一个tomcat的服务,因此,需要在tomcat的classes目录下面,创建一个文件,其文件名就叫:kms.keystore.password, 然后在这个文件中,将密码保存在其中。 如我的环境中:
[root@hdp130 classes]# pwd --- classes的路径
/root/hadoop-2.7.4/share/hadoop/kms/tomcat/webapps/kms/WEB-INF/classes
[root@hdp130 classes]# ls
kms.keystore.password -----自己创建一个文件
[root@hdp130 classes]# cat kms.keystore.password
123456 ----文件中即为我们设置的密码--><property><name>hadoop.security.keystore.java-keystore-provider.password-file</name><value>kms.keystore.password</value><description>If using the JavaKeyStoreProvider, the file name for the keystore password.</description></property><property><name>dfs.encryption.key.provider.uri</name><value>kms://http@localhost:16000/kms</value>
</property>
<!--只是简单测试,这里就选择simple就可以了--><property><name>hadoop.kms.authentication.type</name><value>simple</value><description>Authentication type for the KMS. Can be either "simple"or "kerberos".</description></property></configuration>
3) 设置kms的环境变量
export KMS_HOME=/root/hadoop-2.7.4
export KMS_LOG=${KMS_HOME}/logs/kms
export KMS_HTTP_PORT=16000
export KMS_ADMIN_PORT=16001
注:这里可以通过kms-env.sh这个脚本来设置。我这里直接设置在.bashrc中了
4) 完成上面的配置后,就可以启动kms,执行命令 sbin/kms.sh start
此时会启动一个进程:Bootstrap
5) 设置hdfs配置:
core-site.xml,增加一个配置项
<property><name>hadoop.security.key.provider.path</name><value>kms://http@localhost:16000/kms</value>
</property>
hdfs-site.xml也增加一个配置项:
<property><name>dfs.encryption.key.provider.uri</name><value>kms://http@localhost:16000/kms</value>
</property>
6) 重新启动namenode与datanode
8) 创建相应的加密区
[root@hdp130 kms]# hadoop key create key1 --- key1为上面通过keytool创建的
[root@hdp130 kms]# hadoop key list –metadata ---- 查看一下
[root@hdp130 kms]# hadoop fs -mkdir /sub
[root@hdp130 logs]# hdfs crypto -createZone -keyName key1 -path /sub ---设置/sub为加密区
Added encryption zone /sub
Hadoop KMS加解密的过程
以hadoop fs -cat 命令为例来说明。对于hadoop cat命令我们可以简单的把它分为三个部分(流程图只是为了说明它的过程):
1) Client读取数据之前,首先获取相应文件的InputStream句柄
2) 为了获取相应的InputStream句柄,client会从 NameNode获取Block的信息,然后根据这些住处创建相应的InputStream对象
3) 最后一步即为read过程,这一部分则是根据Namenode的Block信息,然后创建相应的RPC调用,读取datanode上的数据。
而hadoop fs客户端在读取文件的时候,并不知道它是否为加密文件,而这个加密信息只保存在namenode中,因此在调用getLocatedBlocks()的时候,就已经知道相应的文件是否为加密的文件。在知道了它是否为加密文件后,client就可以进行相应的判断,其关键代码:
//Namenode的getLocatedBlocks()返回一个LocatedBlocks构造出来的,public HdfsDataInputStream createWrappedInputStream(DFSInputStream dfsis)throws IOException {final FileEncryptionInfo feInfo = dfsis.getFileEncryptionInfo(); //FileEncryptionInfo 存储加密信息if (feInfo != null) { getCryptoProtocolVersion(feInfo);//获取加密的方式,即AES/CTR/NoPadding,这个加密方式也是比较推荐的一种方式final CryptoCodec codec = getCryptoCodec(conf, feInfo);//创建http消息,并根据加密名称,从KMS获取加解密的密钥。final KeyVersion decrypted = decryptEncryptedDataEncryptionKey(feInfo); //创建一个用于解密的InputStream对象。这其实已经是JCE的代码了。final CryptoInputStream cryptoIn =new CryptoInputStream(dfsis, codec, decrypted.getMaterial(),feInfo.getIV()); return new HdfsDataInputStream(cryptoIn);} else {//如果没有加密,则直接创建return new HdfsDataInputStream(dfsis);}
}
总结
1) hadoop cat在读取文件信息时,首先发消息给NameNode 去获取这个文件的block信息
2) NameNode收到client的请求信息后,会返回相应的block块的信息,同时还会返回FileEncryptionInfo对象信息,在这个FileEncryptionInfo中会保存相应的加密的方式,以及相应的keyname(即我们在hdfs crypto -createZone -keyName key1 -path /sub 这个命令时给定的keyname)
3) Client收到返回的信息后,会判断一下,是否存在FileEncryptionInfo 对象,如果不存在,则认为相应的文件没有经过加密; 如果存在,则认为文件是被加密的文件。
4) 当已经确认文件是加密的文件后,client会给KMS发送一个http消息,去获取相应的keyname的密码(就是我们在执行keytool -genkey -alias ‘key1’ 时输入的密码)
5) 拿到相应的密码后,就按照JCE的API要求,返回一个相应的InputStream对象
6) Client拿到相应的InputStream对象后,就可以直接读取数据。
从上面的分析中,可以看出一个文件加密信息存在两个地方: namenode存放keyname,而KMS存放密码。 Client根据Namenode的返回来判断是否需要进行解密。
Hadoop KMS 使用相关推荐
- Apache Hadoop KMS 部署
名词解释 DEK: data encryption key EDEKs: encrypted data encryption keys EEK: encrypted encryption keys 介 ...
- Hadoop KMS环境安装
环境介绍: Soft Verison Hadoop hadoop-3.3.4 Hadoop HDFS 环境安装 Java环境准备: wget https://repo.huaweicloud.com/ ...
- HADOOP KMS使用介绍及性能测试
简介 HDFS 在kms之上实现了透明的端到端加密 常用操作 创建key 查看key 使用key创建加密区 查看加密区 设置kms acl kms使用场景验证 验证一: 加密区文件在hdfs上是否真的 ...
- docker 安装oracle_阿里云使用Docker搭建Hadoop集群
摘要 吐血整理,搭建了两遍,亲测可用!!! 我买的是阿里云2C4G的服务器,使用的是CentOS 7.7版本.在搭建过程中踩了不少坑,本篇文章希望对大家有用 CentOS 7.7安装Docker 查看 ...
- Windows下编译 Hadoop
Windows下编译 Hadoop-2.9.2 系统环境 系统: Windows 10 10.0_x64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0_201 Pr ...
- hadoop +hbase +zookeeper 完全分布搭建 (版本一)
hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA.YARN等.最新的hadoop-2.6.0又增加了YARN HA 注意:apache提供的hadoop-2.6.0的安装包是 ...
- 使用docker搭建Hadoop
Hadoop简介 1.Hadoop的整体框架 Hadoop由HDFS.MapReduce.HBase.Hive和ZooKeeper等成员组成,其中最基础最重要元素为底层用于存储集群中所有存储节点文件的 ...
- hadoop 源码编译---Win7(64位)
说明: 在Windows 平台上编译hadoop 源代码,hadoop源码包的安装说明文件[BUILDING.txt]描述如下 haoop官方文档上需要准备的文件: * Windows System ...
- Hadoop 集群搭建
Hadoop 集群搭建 2016-09-24 杜亦舒 目标 在3台服务器上搭建 Hadoop2.7.3 集群,然后测试验证,要能够向 HDFS 上传文件,并成功运行 mapreduce 示例程序 搭建 ...
- KMS的几个开源实现汇总
搜索关键词 open source key management server "key management server" ranger kms rotate keys dec ...
最新文章
- html无序列表的滚动效果,html无序列表标签和有序列表标签使用示例
- 用 go 实现跨平台 Autoit/AutoHotkey 和按键精灵功能示例代码
- java.lang.IllegalArgumentException: pointerIndex out of range
- java 在线答疑系统_基于java 在线答疑系统-需求分析与概念原型
- office2010删除分页符
- QLineEdit限制数据类型——只能输入浮点型数
- 在Bootstrap中使用类的按钮类型
- C#中使用SqlBulk百万级数据秒级插入
- php 加载redise_php环境篇:redis服务编译安装
- numpy.ceil() 和 numpy.floor()--向上取整和向下取整
- CWP中的排序算法:C语言
- 收集的图像处理网站http://blog.csdn.net/chief1985/article/details/1898358
- OpenCV图像处理(9)——边缘提取方法对比
- 区块链Hyperledger Fabric背书过程中链码是并行还是串行?
- android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
- 建筑能源管理系统主要有什么功能?
- cad打印去掉边框_CAD打印的时候如何去掉打印线框?
- LaTeX 中的数学字体
- 彻底卸载secureCRT,并重装,包括绿色版SecureCRT删除干净
- Elasticsearch 谷歌插件 Elasticsearch-head 使用