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


1.概述




数据加密是安全级别要求较高企业所必须的,比如说金融行业,医疗行业或者政府。我们知道HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的,如果在操作系统下,直接访问block所在的目录,通过Linux的cat命令是可以直接查看里面的内容的,而且是明文。


我们知道在Hadoop集群中,可以通过开启Kerberos/LDAP来实现用户身份的认证,通过Sentry/Ranger实现数据访问的权限控制。但是这些其实无法控制非法用户在操作系统层面直接访问数据,比如直接拷走disk里的所有block文件,这些都是明文,是可以直接查看的。这个时候我们就需要对关键数据进行加密,让非法用户即使从操作系统层面拷走文件,也是密文,没法查看。


HDFS支持端到端的透明加密,启用以后,对于一些需要加密的HDFS目录里的文件可以实现透明的加密和解密,而不需要修改用户的业务代码。端到端是指加密和解密只能通过客户端。对于加密区域里的文件,HDFS保存的即是加密后的文件,文件加密的秘钥也是加密的,HDFS不会存储和直接访问秘钥。


HDFS的透明加密支持两种方式的加密:静态(at-rest)数据加密,比如持久化保存在磁盘上的数据,传输(in-transit)数据加密,比如通过网络传输的数据。


2.背景




传统数据管理软件或者硬件的加密包含了不同的层级,在不同的层级加密有不同的优点和缺点。


1.应用层加密,这是最安全也是最灵活的方式。加密内容最终由应用程序来控制,并且可以精确的反映用户的需求。但是,编写应用程序来实现加密一般都比较困难,而且有些应用程序可能不支持加密。


2.数据库层加密,类似于应用程序加密。大多数数据库厂商都提供某种形式的加密,但是可能会有性能问题,另外比如说索引没办法加密。


3.文件系统层加密,这种方式对性能影响不大,而且对应用程序是透明的,一般也比较容易实施。但是应用程序细粒度的要求策略,可能无法完全满足。比如,多租户应用程序可能需要对最终用户进行加密,数据库可能需要对单个文件里的每个列进行不同的加密设置。


4.磁盘层加密,易于部署和高性能,但是相当不灵活,只能防止用户从物理层面盗窃数据。

 

HDFS的透明加密属于数据库层和文件系统层的加密。它有很多好处,比如不错的性能,对于现有的应用程序是透明的。在制定策略时,HDFS也比传统的文件系统有更多的选择。


HDFS加密可以防止在文件系统或之下的攻击,也叫操作系统级别的攻击(OS-level attacks)。操作系统和磁盘只能与加密的数据进行交互,因为数据已经被HDFS加密了。


3.场景




一些政府,金融和监管机构都会要求数据加密。比如医疗行业有HIPAA法规,支付卡行业有PCI DSS法规,美国政府有FISMA法规。HDFS的透明加密可以使企业很容易的遵守这些规定。

 

通过HDFS的集成,加密也可以在应用层执行,同时应用层可以不做修改而直接对加密数据进行访问。这种架构可以更好的与HDFS的其他功能进行协作。


4.架构

4.1概述




HDFS的透明加密有一个新的概念,加密区域(the encryption zone)。加密区域是一个特殊的目录,写入文件的时候会被透明加密,读取文件的时候又会被透明解密。当加密区域被创建时,都会有一个加密区域秘钥(encryption zone key)与之对应。加密区域里的每个文件都有一个唯一的数据加密秘钥(DEK,data encryption key)。HDFS不会直接处理DEK,HDFS只会处理加密后的DEK(encrypted data encryption key,EDEK)。客户端会解密EDEK,然后用后续的DEK来读取和写入数据。HDFS的DataNode只能看到一串加密字节。

 

HDFS支持嵌套的加密区域,从而能在文件系统的不同部分使用不同的加密区域秘钥。在创建加密区域之后,比如是根目录/,用户可以用不同的秘钥在子目录比如/home/fayson上创建更多的加密区域。文件的EDEK会使用最近的(the closet ancestor)加密区的秘钥生成。

 

如果要启用HDFS的透明加密,你需要安装一个额外的服务,KMS(Hadoop

,用来管理秘钥。KMS主要有以下几个职责:


1.提供访问保存的加密区域的秘钥


2.生成存储在NameNode上的加密后的数据加密秘钥(EDEK)


3.为HDFS客户端解密EDEK


4.2 在加密区域里访问数据




当在加密区域中创建好一个文件后,NameNode会要求KMS生成一个新的EDEK,这会被加密区域秘钥(encryption zone’s key)加密。EDEK会作为NameNode的元数据持久化保存起来。

 

当在加密区域里读取一个文件时,NameNode会给客户端提供EDEK,然后加密区域秘钥(encryption zone’s key)的版本,这个是用来解密EDEK的。然后客户端找KMS来解密EDEK,当然会检查客户端是否有权限在KMS中访问这个版本的加密区域秘钥(encryption zone’s key)。如果成功,客户端会使用DEK来解密文件内容。

 

所有上面这些读写路径的步骤都会自动的在DFSClient,NameNode以及KMS之间完成。

 

访问加密的文件数据和元数据是由正常的HDFS文件系统权限控制的。这意味着如果HDFS受到攻击,比如,未经授权的HDFS超级用户,这个恶意用户只能访问加密文件,以及加密后的文件加密秘钥(EDEK)。这是因为对加密区域秘钥(encryption zone’s key)的访问是由KMS控制的,因此这不会构成威胁。


4.3Key Management Server,KeyProvider, EDEKs




KMS是代表HDFS和客户端与后端的秘钥存储进行交互的代理服务。后端的秘钥存储库和KMS都实现了Hadoop KeyProvider API,更多内容请参考:

​http://hadoop.apache.org/docs/stable/hadoop-kms/index.html​

 

在KeyProvider API中,每个加密秘钥都有一个唯一的秘钥名称。秘钥可以有多个版本,每个版本的秘钥都有自己的秘钥内容(在加密和解密时使用的实际加密字节)。加密秘钥可以通过秘钥名称返回秘钥的最新版本,或者根据版本号来获取特定版本的秘钥。

 

KMS还实现了一些附加功能,可以创建和解密加密后的秘钥(encrypted encryption keys,EEKs)。创建和解密EEK都是在KMS中进行的。所以请求创建和解密EEK的客户端,不会处理EEK的加密秘钥。要创建一个新的EEK,KMS会生成一个新的随机秘钥,并会使用指定的秘钥对其进行加密,然后将EEK返回给客户端。为了解密EEK,KMS会检查用户是否有权限访问加密秘钥,然后使用它来解密EEK,并返回解密的加密秘钥。

 

在HDFS透明加密的场景中,EEK是加密数据加密秘钥的秘钥(EDEK),数据加密秘钥用来(DEK)用来加密和解密文件数据。通常,秘钥存储库会配置为只允许最终用户访问用户加密DEK的秘钥。意思就是说EDEK可以被HDFS安全的存储和处理,因为HDFS用户将不能访问未加密的加密秘钥。


5.总结




大家是不是都晕了呢,Fayson简单总结一下,那么多秘钥大概有以下几种:


1.Encryption Zone Key,EZ Key,是加密区域的秘钥,每创建一个HDFS的加密区域也即是一个目录就会生成一个,一般保存在后端的秘钥存储库中,比如数据库。


2.Data Encryption Key,DEK,每个加密区域里的每个文件唯一的加密秘钥。


3.Encrypted Data Encryption Key,EDEK,每个加密区域里的每个文件唯一的加密秘钥,然后被EZ Key加密后的秘钥。保存在NameNode的元数据中。


什么是HDFS透明加密_数据


所以HDFS的超级用户顶多只能拿到加密后的数据以及EDEK,没有KMS里相应的权限拿到对应的EZ Key,无法解密EDEK,然并卵,还是无法解密数据。一般在企业来说,Hadoop平台的管理员可能是HDFS超级用户,但是后端的秘钥存储库可能是另外的DBA管理员,至少要两个人一起联合起来干坏事,才能解密它不该看的数据。权限分离来保证数据的最终安全。

 

后面Fayson会通过实操来说明如何实现HDFS数据透明加密。


6.参考




​https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_sg_hdfs_encryption.html​

​http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/TransparentEncryption.html​



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

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







安装





推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

什么是HDFS透明加密_客户端_02

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操