KMS是hadoop自2.6.0版本开始自带的一个密钥管理web服务,提供了一系列API来创建,获取和维护密钥。kms与hadoop结合,可以实现hdfs客户端透明的数据加密传输以及细粒度的权限控制。

本文使用Hadoop 2.6.0-cdh5.13.3为例进行kms服务配置启动及hdfs文件加密传输示例。

配置kms

密钥仓库的文件位置和操作密码
   1. kms-site.xml (一般默认的就可以了不修改也行)

  <property><name>hadoop.kms.key.provider.uri</name><value>jceks://file@/home/hadoop/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>kms.keystore.password</value --><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@app128130:16000/kms</value></property>

hadoop.kms.key.provider.uri
            KMS管理的密钥以文件形式存在哪个keystore密钥库文件
            配置格式
                jceks://file@/home/kms/kms.keystore
                    这个文件会在KMS服务启动后自动生成到file@后的文件位置上

2.core-site.xml

<property><name>hadoop.security.key.provider.path</name><value>kms://http@app128130:16000/kms</value>
</property><property><name>dfs.encryption.key.provider.uri</name><value>kms://http@app128130:16000/kms</value>
</property><property><name>hadoop.security.crypto.jceks.key.serialfilter</name><value>java.lang.Enum;java.security.KeyRep;java.security.KeyRep$Type;javax.crypto.spec.SecretKeySpec;com.sun.crypto.provider.SealedObjectForKeyProtector;org.apache.hadoop.crypto.key.**;!*</value>
</property>

3.密码(访问kms密钥库hadoop.kms.key.provider.uri指定的keystore的密码)设置  kms-env.sh和kms.keystore.password 
        两种方式
            密码文件方式
                KMS是通过ClassLoader.getResource来加载该文件,所以该配置必须配在KMS Web服务启动对应的conf目录下

echo  123456 > ${HADOOP_HOME}/share/hadoop/kms/tomcat/conf/kms.keystore.password
            环境变量方式(优先级高)
                kms-env.sh下增加
                    export HADOOP_KEYSTORE_PASSWORD=123456

4. 重启hdfs和kms (${HADOOP_HOME}/sbin/kms.sh start)

kms默认使用16000端口,要能访问该端口才能使用kms,可以使用hadoop key list -metadata来测试kms服务是否正常。

如果不能获取到结果,首先就要确认kms的服务正常启动了,查看端口是否通,curl或者直接浏览器访问。可以查看kms的api使用http请求测试。

curl http://192.168.128.130:16000/kms/v1/keys/names?user.name=hdfs

5.key的权限控制,kms-acls.xml(无需修改)这个文件默认配置是所有人都可以访问的,建议先不要修改这个文件,等加密分区搞好了,其他验证也都ok了,最最后再来折腾这个kms-acls.xml的权限控制。可以细化配置kms每个key的访问和管理权限允许哪些用户访问,<name>填写的是key和权限,<value>填写是允许的用户名,多个用逗号分隔,填*则代表所有人都有权限,并且支持黑名单,在name中的key后加blacklist则代表是黑名单。因为加密分区必须要有对应的key才能解密,从而间接控制了key对应的加密分区的访问权限。并且这个kms-acls.xml是热加载的。如下图修改控制名称为keydemo的密钥的MANAGEMENT管理权限只赋值给root用户, 当使用hadoop用户删除key时失败,切换root用户后可以删除。同样可以控制密钥的获取权限,从而控制密钥对应的加密分区的操作权限。

权限有这么几类:

MANAGEMENT - createKey, deleteKey, rolloverNewVersion
GENERATE_EEK - generateEncryptedKey, reencryptEncryptedKey, reencryptEncryptedKeys, warmUpEncryptedKeys
DECRYPT_EEK - decryptEncryptedKey(解密EDK)
READ - getKeyVersion, getKeyVersions, getMetadata, getKeysMetadata, getCurrentKey
ALL - all of the above

二、生成根证书并配置到kms-env.sh

tomcat根证书

  • keytool -genkey -alias tomcat -keyalg RSA

    • 过程中问到"What is your first and last name?"时,必须填写运行KMS Service那台机器的hostname
    • keystore的密码,这个密码假定为123456,需要记住,后面配置时需要用到它
    • 执行完后,会在用户的home目录下生成.keystore文件
      • 显示当前keystore里可用的证书

        • keytool -list -v -keystore .keystore -storepass 123456

在kms-env.sh增加根证书和密码:
                    export KMS_SSL_KEYSTORE_FILE=/home/hadoop/.keystore
                    export KMS_SSL_KEYSTORE_PASS=123456

导出crt文件

  • 以hadoop用户导出根证书为crt文件

    • keytool -export -alias tomcat -keystore /home/hadoop/.keystore -file /home/hadoop/tomcat.crt -storepass 123456

重启kms

三、操作生成key,创建加密分区,验证加密传输

key:

  • 生成key(会被保存到kms配置的keystore文件中)

    • hadoop key create testkey
  • 查看key
    • hadoop key list -metadata
  • 删除key
    • hadoop key delete testkey

加解密

  • 创建sz加密区 (key会被kms加密后保存到分区的metadata中,加密分区和非加密分区之间不可以mv,但是可以相互cp。)

    • hdfs crypto -createZone -keyName testkey -path /sz
  • 查看加密区
    • hdfs crypto -listZones

#上传下载文件测试

hdfs dfs -copyFromLocal  /本地文件     /sz

hdfs dfs -copyToLocal    /sz

通过在hdfs路径前加/.reserved/raw来直接查看加密分区文件发现是乱码,的确是加密了的.

也可以找到对应的block直接查看

四、总结

kms是一个独立的web服务,提供生成密钥,和对密钥的加解密的restAPI。

hadoop客户端处理加密分区文件时,向kms请求获取加密分区的密钥后,由hadoop客户端对文件进行加解密,加解密都在客户端。

hadoop hdfs本身不做加解密,只在创建加密分区时在namenode中加密分区的metadata中记录对应的keyName和加密后的密钥EDEK(kms可以解密EDEK为EDK,EDK可以解密加密分区的文件)。

五、可能遇到的问题:

1.kms启动失败报错找不到密码文件, 密码文件要在tomcat的classpath下,也有说放到conf下,或者直接写入kms-env.sh中优先级更高。

echo  123456 > ${HADOOP_HOME}/share/hadoop/kms/tomcat/conf/kms.keystore.password

echo  123456 > ${HADOOP_HOME}/share/hadoop/kms/tomcat/webapps/kms/WEB-INF/classes/kms.keystore.password

2.Can't cast key for kmskey in keystore file:/home/hadoop/kms.jks to a KeyMetadata. Key may have been added using  keytool or some other non-Hadoop method.

这个配置在 hadoop.kms.key.provider.uri的文件不需要自己生成,kms启动时会自动生成,删掉kms.jks和.kms.jks.cc重启kms即可。

3.重启kms服务后,无法读取kms.jks中的密钥,报错Can't recover key for testkey from keystore file

Caused by: java.security.UnrecoverableKeyException: Rejected by the jceks.key.serialFilter or jdk.serialFilter property
        at com.sun.crypto.provider.KeyProtector.unseal(KeyProtector.java:399)
        at com.sun.crypto.provider.JceKeyStore.engineGetKey(JceKeyStore.java:144)
        at java.security.KeyStore.getKey(KeyStore.java:1023)
        at org.apache.hadoop.crypto.key.JavaKeyStoreProvider.getMetadata(JavaKeyStoreProvider.java:408)

这个是因为jdk8u171之后增加了jceks.key.serialFilter来限制证书的序列化,提高安全性。只要把hadoop相关的类加入允许的配置里就可以了。修改两个地方jdk的jre/lib/security/java.security文件修改jceks.key.serialFilter=java.lang.Enum;java.security.KeyRep;java.security.KeyRep$Type;javax.crypto.spec.SecretKeySpec;com.sun.crypto.provider.SealedObjectForKeyProtector;org.apache.hadoop.crypto.key.**;!*

再修改hadoop的core-site.xml增加

<property><name>hadoop.security.crypto.jceks.key.serialfilter</name><value>java.lang.Enum;java.security.KeyRep;java.security.KeyRep$Type;javax.crypto.spec.SecretKeySpec;com.sun.crypto.provider.SealedObjectForKeyProtector;org.apache.hadoop.crypto.key.**;!*</value>
</property>

这样增加了com.sun.crypto.provider.SealedObjectForKeyProtector;org.apache.hadoop.crypto.key.**; 之后就不会再被Rejected了,就可以在kms重启之后从keystore文件里读取密钥条目了。java.security的配置会覆盖core-site.xml配置。

4.创建加密分区报错 no key provider is available

自己对照源码找原因Java KeyProviderCryptoExtension类代码示例 - 纯净天空

应该是配置缺少或者是没有给kms的tomcat生成根证书

hadoop key list -metadata -provider kms://http@localhost:16000/kms

我是直接按这个操作解决的KMS密钥管理服务(Hadoop)_weixin_34377065的博客-CSDN博客

附录:

keytool

  • 生成证书

    • keytool -genkey -alias kmskey -keysize 2048 -keyalg RSA -validity 3650 -keystore kms.jks -storetype JKS  -dname "CN=localhost, OU=localhost, O=localhost, L=FG, ST=AH, C=CN" -keypass 123456 -storepass 123456

      keytool -genkey -alias kmskey

      -genkey参数

      • - genkeypair:生成公私钥对条目,私钥不可见,公钥会以证书格式保存在keystore中。
      • - alias: 指定别名,区分不同条目,默认mykey
      • - keysize: 密钥长度
      • - keyalg: 公私钥算法
      • - validity: 证书过期时间
      • - keystore: 指定存储密钥库,若不存在会创建,若指定则在当前文件夹下生成。默认密钥库为用户目录下.keystore文件
      • - storetype: 密钥库类型  JKS PKCS等
  • 查看keystore中证书条目列表
    • keytool -list -v -keystore kms.jks -storepass 123456
  • 删除密钥库中的条目
    • keytool -delete -alias kmsjks -keystore kms.jks  -storepass 123456

restApi直接查询key的信息

参考:

​​​​​​Hadoopkms加密 - IT晓白 - 博客园

官网Hadoop KMS – Hadoop Key Management Server (KMS) - Documentation Sets

HDFS数据加密空间--Encryption zone_走在前往架构师的路上-CSDN博客

KMS介绍及环境搭建_xhh199090_新浪博客

HDFS加密存储(HDP、Ranger、Ranger KMS实现)_暗焰之珩的博客-CSDN博客_hdfs kms

快速搭建hadoop KMS开发集成环境 - 2012 - 博客园    (kms的restApi)

Java KeyProviderCryptoExtension类代码示例 - 纯净天空

Java™ SE Development Kit 8, Update 171 Release Notes

What is the cause of "java.security.UnrecoverableKeyException: Rejected by the jceks.key.serialFilter or jdk.serialFilter property"? - Stack Overflow
“java.security.UnrecoverableKeyException:由jceks.key.serialFilter或jdk.serialFilter属性拒绝”的原因是什么? - 堆栈内存溢出

hadoop-KMS密钥管理服务配置使用相关推荐

  1. ebs查看服务状态_浅析AWS KMS密钥管理服务

    AWS Key Management Service (AWS KMS) 是一个密钥管理服务,可以用来创建和管理您的主密钥,AWS KMS使用对称加密算法,即使用相同的算法和密钥来加密和解密数字数据. ...

  2. 【转】密钥管理服务(KMS)

    原文链接:https://blog.csdn.net/qq_39325340/article/details/123471184 背景介绍 密钥管理服务(KMS)是一套密钥管理系统, 可以针对云上数据 ...

  3. Hadoop KMS环境安装

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

  4. hadoop fs命令无法使用_「大数据」「Hadoop」HDFS的配置与管理

    HDFS(Hadoop Distributed File System)是Hadoop三个基础组件之一,为另外的组件以及大数据生态中的其他组件提供了最基本的存储功能,具有高容错.高可靠.可扩展.高吞吐 ...

  5. 【Big Data】HADOOP集群的配置(一)

    Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...

  6. 《Hadoop集群与安全》一2.1 在Hadoop集群中配置操作系统

    本节书摘来自华章出版社<Hadoop集群与安全>一书中的第2章,第2.1节,作者 (美)Danil Zburivsky Sudheesh Narayanan,更多章节内容可以访问云栖社区& ...

  7. Hadoop手动升级HA配置手册

    Hadoop手动升级HA配置手册 1 Hadoop组件升级 本文是Apache hadoop.Hbase升级至CDH版hadoop.Hbase,同时涵盖了Hadoop HA的配置的操作手册.. 2 H ...

  8. Apache Hadoop KMS 部署

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

  9. Hadoop的安装与配置(非常重要)

    官方的原生配置文档Hadoop3.1.0 HDFS的组成 NameNode secondaryNameNode DataNode 这是以主从模式来运行的,前两个在maser节点上,最后一个在slave ...

最新文章

  1. 读写测试_UFS3.0手机闪存测试曝光 读写速度足以秒杀超极本!
  2. 详解分布式系统与消息投递
  3. html5自定义属性作用,html5自定义属性:如何获取自定义属性值(附代码)
  4. python内置数据结构_Python基础知识2-内置数据结构(下)
  5. 用python写三角形_python写个三角形的问题
  6. Linu的sftp环境搭建
  7. CCF201512-4 送货(100分)
  8. lamda表达式和stream
  9. windows server 2003 系统提权
  10. B2B电子邮件营销:下一个突破口在哪?
  11. 支付宝当面付_没有营业执照也能开支付宝当面付啦
  12. C盘Administrator中 .m2/repository里面是什么
  13. Virtual Network----网卡offload特性和网络加速技术简述
  14. 2022黑马Python学习笔记
  15. 文献记录(part107)--Detecting Meaningful Clusters From High-Dimensional Data ...
  16. 堆排序、归并排序、快速排序
  17. 2020-8-18js练习
  18. iTunes备份路径,iTunes默认备份路径,iTunes修改备份路径
  19. ajax人力资源管理系统代码,README.md · 偉ing/JSP实现OA办公系统_人事管理系统 - Gitee.com...
  20. 51单片机独立按键控制LED状态

热门文章

  1. Youtube的value-based强化学习推荐系统
  2. 关闭算法推荐正如刻舟求剑?!
  3. 【报告分享】2020年金融科技十大关键词.pdf(附下载链接)
  4. 【白皮书分享】2020短视频内容营销趋势白皮书.pdf(附下载链接)
  5. Python实战从入门到精通第十七讲——将单方法的类转换为函数
  6. PHP心脏装置,“人工心脏”不再科幻 “钢铁侠”已成现实
  7. Star Schema完全参考手册读书笔记三
  8. 面试准备每日五题:C++(九)——vector、list、deque、priority_queue、mapset
  9. Leetcode每日一题:62.unique-paths(不同路径)
  10. 怎么改wps表格中折线图的横坐标?