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 &quot;simple&quot;or &quot;kerberos&quot;.</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 使用相关推荐

  1. Apache Hadoop KMS 部署

    名词解释 DEK: data encryption key EDEKs: encrypted data encryption keys EEK: encrypted encryption keys 介 ...

  2. Hadoop KMS环境安装

    环境介绍: Soft Verison Hadoop hadoop-3.3.4 Hadoop HDFS 环境安装 Java环境准备: wget https://repo.huaweicloud.com/ ...

  3. HADOOP KMS使用介绍及性能测试

    简介 HDFS 在kms之上实现了透明的端到端加密 常用操作 创建key 查看key 使用key创建加密区 查看加密区 设置kms acl kms使用场景验证 验证一: 加密区文件在hdfs上是否真的 ...

  4. docker 安装oracle_阿里云使用Docker搭建Hadoop集群

    摘要 吐血整理,搭建了两遍,亲测可用!!! 我买的是阿里云2C4G的服务器,使用的是CentOS 7.7版本.在搭建过程中踩了不少坑,本篇文章希望对大家有用 CentOS 7.7安装Docker 查看 ...

  5. 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 ...

  6. hadoop +hbase +zookeeper 完全分布搭建 (版本一)

    hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HA.YARN等.最新的hadoop-2.6.0又增加了YARN HA 注意:apache提供的hadoop-2.6.0的安装包是 ...

  7. 使用docker搭建Hadoop

    Hadoop简介 1.Hadoop的整体框架 Hadoop由HDFS.MapReduce.HBase.Hive和ZooKeeper等成员组成,其中最基础最重要元素为底层用于存储集群中所有存储节点文件的 ...

  8. hadoop 源码编译---Win7(64位)

    说明: 在Windows 平台上编译hadoop 源代码,hadoop源码包的安装说明文件[BUILDING.txt]描述如下 haoop官方文档上需要准备的文件: * Windows System ...

  9. Hadoop 集群搭建

    Hadoop 集群搭建 2016-09-24 杜亦舒 目标 在3台服务器上搭建 Hadoop2.7.3 集群,然后测试验证,要能够向 HDFS 上传文件,并成功运行 mapreduce 示例程序 搭建 ...

  10. KMS的几个开源实现汇总

    搜索关键词 open source key management server "key management server" ranger kms rotate keys dec ...

最新文章

  1. html无序列表的滚动效果,html无序列表标签和有序列表标签使用示例
  2. 用 go 实现跨平台 Autoit/AutoHotkey 和按键精灵功能示例代码
  3. java.lang.IllegalArgumentException: pointerIndex out of range
  4. java 在线答疑系统_基于java 在线答疑系统-需求分析与概念原型
  5. office2010删除分页符
  6. QLineEdit限制数据类型——只能输入浮点型数
  7. 在Bootstrap中使用类的按钮类型
  8. C#中使用SqlBulk百万级数据秒级插入
  9. php 加载redise_php环境篇:redis服务编译安装
  10. numpy.ceil() 和 numpy.floor()--向上取整和向下取整
  11. CWP中的排序算法:C语言
  12. 收集的图像处理网站http://blog.csdn.net/chief1985/article/details/1898358
  13. OpenCV图像处理(9)——边缘提取方法对比
  14. 区块链Hyperledger Fabric背书过程中链码是并行还是串行?
  15. android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
  16. 建筑能源管理系统主要有什么功能?
  17. cad打印去掉边框_CAD打印的时候如何去掉打印线框?
  18. LaTeX 中的数学字体
  19. 彻底卸载secureCRT,并重装,包括绿色版SecureCRT删除干净
  20. Elasticsearch 谷歌插件 Elasticsearch-head 使用

热门文章

  1. 用摄动法证明fibs的一个公式(变形)
  2. 关于电的计算机公式,电能计算-电能的计算公式-电工基础 - 电工屋
  3. GPS从入门到放弃(十五)--- DCB差分码偏差
  4. 串口通信之波特率计算
  5. 温度控制pid c语言程序,51单片机温度PID算法(C程序)
  6. 数字信号处理--FFT与蝶形算法--学习笔记
  7. 想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(七)
  8. java毕业设计开题报告javaweb户籍管理系统|户口
  9. 机械制图之三棱锥的三视图
  10. 学习记录:python糗百爬虫