这篇文章需要一点hadoop框架的基础,你最好需要知道什么是hadoop,以及需要了解hadoop的文件系统hdfs。如果你不了解的话,我会尝试用简单的原理来解释,希望能对你有用,这期内容可能有些烧脑,可以多读几遍,我也有学习不足的地方,欢迎提问。
目录
一,什么是HDFS
二,什么是透明加密
三,用户如何使用hdfs透明加密功能
四,hdfs如何实现透明加密
hdfs全称Hadoop分布式文件系统,在网上搜索你一般会得到来自apache hadoop官方文档的这样一段话:
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
我在之前的大数据框架中有提到,hadoop这个项目是源自Google公司的MapReduce论文实现而成,利用分布式文件设计和mapreduce提高文件系统容错性,框架可以自动处理节点故障,所以适合处理大数据的数据读写访问。
hadoop工程中的主要子项目:
hadoop-hdfs-project: 分布式文件系统,其中包括hadoop-hdfs-httpfs , hadoop-hdfs-nfs提供http网关服务和传输和hadoop-hdfs。
hadoop-common: 分离出hdfs和mapreduce的hadoop中的公共部分
hadoop-client: 客户端接口
hadoop-MapReduce:提供MapReduce编程模型的实现,用于大规模数据处理。
hadoop-yarn: 负责管理集群中的计算资源并将其用于调度用户的应用程序
hdfs能做什么?
1. 商用硬件
商用硬件的特点是流量极大而系统可靠性要求极高,一旦哪个节点崩了就可能造成大量损失,所以维护系统可靠性十分重要,而要实现如此流量大又可靠的文件系统服务投入的资金就很可观了,所以hdfs的设计是让你分布式可以存储在各个节点上,这些节点还可以廉价,通过hdfs的可靠性服务来自动处理节点故障。
2. 流式数据访问
运行在HDFS上的应用和普通的应用不同,需要流式访问它们的数据集。HDFS的设计中更多的考虑到了数据批处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。为了提高数据的吞吐量,hdfs在一些关键方面对POSIX的语义做了一些修改。
3. 超大文件
普通文件读写遇到超大文件就会很头疼,一旦遇到网络问题,序列化过程或者文件磁盘问题就会中途断掉,导致读写成功率很低,HDFS被调节以支持大文件存储。采用一次写入多次读取的方式并且能提供整体上高的数据传输带宽,在一个集群里扩展到数百个节点分布式存储数据文件。
hdfs在数据传输层面上也做了很多工作供了将它们自己移动到数据附近的接口,将计算移动到数据附近,比之将数据移动到应用所在显然更好。不过相反需要低延迟,大量小文件和多用户写入的应用场景就不适合hdfs。
然而本篇文章不是想讲文件系统,而是要将透明加密,下边进入正题。
透明加密技术是近年来针对企业文件保密需求应运而生的一种文件加密技术。它是指对使用者来说是无感知的。当使用者在打开或编辑指定文件时,系统将自动对未加密的文件进行加密,对已加密的文件自动解密。文件在硬盘上是密文,在内存中是明文。一旦离开使用环境,由于应用程序无法得到自动解密的服务而无法打开,从而起来保护文件内容的效果。
所以只要有数据的存储就可以使用透明加密技术来保护用户数据的安全。比较典型的一个场景是聊天通讯软件,telegram是一个开源透明加密的通信软件,我们在telegram上聊天,应用方并不知道我们的聊天内容,因为系统会将文件进行端对端的加密解密,意思就是你发的消息在客户端发送的时候已经被加密了,到达另一方的客户端再解密,整个传输过程即使有人窃听了消息,得到的也是加密过的密文,听起来是不是很棒?不过相反如果有人谈论的是违法内容,同样也难以进行窃听,可能导致的就是N号房事件,所以这也就是技术的两面性吧。
所以具体应用场景每个厂商可能实现透明加密的方式会不同,你的聊天记录是否泄露取决于企业应用实现的机制,不过要做区别的是这和你的搜索记录是两码事,你的聊天记录不一定被征用,但你的搜索记录是可以被记录并用于大数据分析的,这个扯远了有时间再说。
透明加密的分类:
应用程序级加密:这是最安全和最灵活的方法。应用程序对加密的内容有最终的控制,并且可以精确地反映用户的要求。但是,编写应用程序来做到这一点很困难。而且对于不支持加密的现有应用程序的客户来说,可能就要更新换客户端了。
数据库级加密:类似于应用程序级加密的属性。大多数数据库供应商提供某种形式的加密。 但是,可能会有性能问题。一个例子是索引不能被加密。
文件系统级加密:该选项提供了高性能,应用程序透明性,并且通常易于部署。但是,它无法模拟某些应用程序级别的策略。例如,多租户应用程序可能希望基于最终用户进行加密。数据库可能需要对存储在单个文件中的每个列进行不同的加密设置。
磁盘级加密:易于部署和高性能,但也相当不灵活。只有真正防止物理盗窃的作用。
除了hdfs和client客户端之外,还有一个重要的出场角色是KMS。
KMS(key management server)密钥管理服务器,是一个在hadoop-common工程里,独立于hdfs的组件,它相当于一个管理密钥的服务器有自己的dao层和后端数据库,用来作为发放透明加密密钥的第三方。
透明加密步骤:
1. KMS生成可使用的密钥
KMS的密钥由特定权限的用户管理,权限也是独立于hdfs的,特权用户登陆后通过
hadoop key create [keyName]
来创建密钥,还可以通过-cipher 参数指定密钥加密材料,-size参数指定位数,原理是通过jce框架的随机数生成器通过默认的加密算法声称我们需要的密钥,默认是AES/CTR方式/128bit
2. 初始化加密区
这一步需要hdfs的特殊用户登陆操作,特殊用户首先创建要加密的加密区
hadoop fs -mkdir /data-encrypt
把这一目录的权限赋给普通用户hive
hadoop fs -chown hive:hive /data-encrypt
然后使用生成的密钥创建加密区
hdfs crypto -createZone -keyName [keyName] -path /data-encrypt
3. 用户使用hdfs时,存到加密区的数据都会以数据块形式存储到hdfs节点的meta文件中,打开后是一堆乱码,而客户端用指令hadoop fs -cat还是get指令得到的都是明文,这就是端对端加密。我们可以通过以下方式得到加密文件的数据块。
hdfs fsck /data-encrypt -files -blocks -locations 分别选择加密/原文件查找存储的数据块
记下数据块编号,进入hdfs存储节点
cd /hadoop/data
find ./ -name blk_1073741827_1003*
就会找到加密后的数据块文件。
过程详解
在这个过程中,hdfs上的每个加密区都会与每个hdfs特殊用户绑定的加密区密钥相关联(EK),这个Key在创建加密区的时候用hdfs crypto指令同时被指定。而这个由KMS颁发的E key并不会被文件加密直接使用,每个加密区中的文件会有其唯一的Data Encryption Key数据加密Key,简称就是DEK。同样DEK不会被HDFS直接处理,取而代之的是,HDFS只处理经过加密的DEK,就是Encrypted Data Encryption Key,缩写就是EDEK。
客户端询问KMS服务去解密EDEK,然后利用解密后得到的DEK去读/写数据。KMS利用存储的EZ Key来解密EDEK得到DEK。
在客户端向KMS服务请求时候,会有相关权限验证,不符合要求的客户端将不会得到解密好的DEK。而且KMS的权限验证是独立于HDFS的,是自身的一套权限验证。这样完成hdfs的一整套透明加密。
EK->KMS管理的加密密钥
EDEK->hdfs能使用的作为文件元数据的密钥
DEK->数据加密使用的密钥
EK加密DEK生成EDEK,DEK加密文件生成加密文件
如下图:
写操作是:1->2->3a->4a
读操作是:1->2->3b->4b->5b
在加密区域中写新文件时,NameNode会要求KMS生成使用加密区域密钥加密的新EDEK。然后将EDEK作为文件元数据的一部分永久保存在NameNode上。
在读取加密区域内的文件时,NameNode向客户端提供文件的EDEK和用于加密EDEK的加密区密钥版本。客户端然后要求KMS解密EDEK,包括检查客户端是否有权访问加密区密钥版本。假设成功,客户端使用DEK解密文件的内容
访问加密的文件数据和元数据是由正常的HDFS文件系统权限控制的。这意味着如果HDFS受到攻击(例如,通过未经授权访问HDFS超级用户帐户),恶意用户只能访问密文和加密密钥。但是,由于对加密区域密钥的访问由KMS和密钥存储区上单独的一组权限控制,因此这不会构成安全威胁。
下边是官文原话,还算易读:
KMS实现了附加功能,可以创建和解密加密密钥(EEK)。EEK的创建和解密完全在KMS上进行。重要的是,请求创建或解密EEK的客户永远不会处理EEK的加密密钥。要创建一个新的EEK,KMS会生成一个新的随机密钥,并使用指定的密钥对其进行加密,然后将EEK返回给客户端。为了解密EEK,KMS检查用户有权访问加密密钥,使用它来解密EEK,并返回解密的加密密钥。
总结一下!就是由于hdfs一次写多次读的特性,加入kms机制多一层权限管理,使得hdfs完成端到端的透明加密,就是说hdfs只存储加密文件和对应的EDEK,客户端通过和KMS合作加解密文件,保护了用户的数据安全。
参考文献:
1. 官网: http://www.searchdoc.cn/hadoop/hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/TransparentEncryption.com.coder114.cn.html
2. AWS hadoop: https://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-encryption-tdehdfs.html
3. AES加密:https://blog.csdn.net/qq_28205153/article/details/55798628