静态加密的HDFS数据实现了对HDFS读取和写入数据的端到端加密。端到端加密意味着数据仅由客户端加密和解密。其中的加/解密过程对于客户端来说是完全透明的。数据在客户端读操作的时候被解密,当数据被客户端写的时候被加密,所以HDFS服务端本身并不是一个主要的参与者。形象地说,在HDFS服务端,你看到的只是一堆加密的数据流。HDFS无法访问未加密的数据或密钥。
HDFS加密方式:AES加密算法
密钥K:
用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
AES加密函数:
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
AES解密函数:
设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
Ranger密钥管理服务(Ranger KMS)是一种开源,可扩展的加密密钥管理服务,支持HDFS“静态数据”加密。
Ranger KMS基于最初由Apache社区开发的Hadoop KMS。默认情况下,Hadoop KMS将密钥存储在基于文件的Java密钥库中。Ranger允许您将密钥存储在安全的数据库中,从而扩展了本机Hadoop KMS功能。
Ranger通过Ranger管理门户提供密钥管理服务器的集中管理。
Ranger KMS有三个主要功能:
1. 密钥管理:
Ranger admin提供使用Web UI或REST API创建、更新或删除密钥的功能。所有Hadoop KMS API都使用密钥管理员用户名和密码与Ranger KMS配合使用。
2. 访问控制策略:
Ranger admin还提供了在Ranger KMS中管理访问控制策略的功能。访问策略控制生成或管理密钥的权限,为在Hadoop中加密的数据添加另一层安全性。
3. 审计:
Ranger提供Ranger KMS执行的所有操作的完整审计跟踪。
Hadoop提供了几种加密存储数据的方法:
卷加密
,可在物理被盗或意外丢失磁盘卷后保护数据。整个卷都是加密的;此方法不支持对特定文件或目录进行更细粒度的加密。此外,卷加密不能防止系统运行时发生的病毒或其他攻击。应用程序级加密
(在Hadoop之上运行的应用程序内加密)支持更高级别的粒度并防止“恶意管理”访问,但为应用程序架构增加了一层复杂性。静态加密的HDFS数据
,加密HDFS中存储的(“静止”)所选文件和目录。此方法使用专门指定的HDFS目录,称为“加密区域
”。HDFS加密涉及以下几个要素:
1. 加密密钥:
除标准HDFS权限外,还提供基于权限的新级别访问保护。
2. HDFS加密区:
一种特殊的HDFS目录
,其中所有数据在写入时加密,并在读取时解密。
3. Ranger密钥管理服务(Ranger KMS):
基于Hadoop KeyProviderAPI的开源密钥管理服务 。
对于HDFS加密,Ranger KMS有三个基本职责:
工作流程如下:
# 验证客户端主机是否已准备好使用AES-NI指令集优化进行HDFS加密
[root@manager241 ~]# yum install openssl-devel -y
[root@manager241 ~]# hadoop checknative
19/08/27 00:52:56 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/08/27 00:52:56 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
19/08/27 00:52:56 WARN erasurecode.ErasureCodeNative: Loading ISA-L failed: Failed to load libisal.so.2 (libisal.so.2: cannot open shared object file: No such file or directory)
19/08/27 00:52:56 WARN erasurecode.ErasureCodeNative: ISA-L support is not available in your platform... using builtin-java codec where applicable
Native library checking:
hadoop: true /usr/hdp/3.0.0.0-1634/hadoop/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
zstd : false
snappy: true /usr/hdp/3.0.0.0-1634/hadoop/lib/native/libsnappy.so.1
lz4: true revision:10301
bzip2: true /lib64/libbz2.so.1
openssl: true /lib64/libcrypto.so
ISA-L: false Loading ISA-L failed: Failed to load libisal.so.2 (libisal.so.2: cannot open shared object file: No such file or directory
验证 “openssl: true ” Hadoop的检测的正确版本libcrypto.so
如果 “openssl: false ” 则表示没有正确的版本。
[root@manager241 ~]# su - hdfs
1. 验证密钥的创建
[hdfs@manager241 ~]$ hadoop key list -metadata
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@2892dae4
key3 : cipher: AES/CTR/NoPadding, length: 128, description: , created: Mon Aug 26 21:32:51 CST 2019, version: 1, attributes: [key.acl.name=key3]
key2 : cipher: AES/CTR/NoPadding, length: 128, description: , created: Mon Aug 26 17:10:30 CST 2019, version: 2, attributes: [key.acl.name=key2]
key1 : cipher: AES/CTR/NoPadding, length: 128, description: , created: Thu Aug 22 19:42:23 CST 2019, version: 3, attributes: [key.acl.name=key1]
2. 作为HDFS管理员,创建一个新的空目录
[hdfs@manager241 ~]$ hdfs dfs -mkdir /zone_encr
3. 使用加密密钥,使目录成为加密区域,完成后,NameNode会将该文件夹/zone_encr识别为HDFS加密区域
[hdfs@manager241 ~]$ hdfs crypto -createZone -keyName key1 -path /zone_encr
Added encryption zone /zone_encr
4. 查看加密区及密钥
[hdfs@manager241 ~]$ hdfs crypto -listZones
/zone_encr key1
具有足够HDFS和Ranger KMS权限的客户端和HDFS应用程序可以从/向加密区读取和写入文件。
客户端写入过程概述
客户端读取过程概述
1. 上传文件到加密区
修改该目录用户和用户组
[hdfs@manager241 ~]$ hdfs dfs -chown -R hive:hive /zone_encr
切换hive用户,hive用户权限(Decrypt EEK)
[root@manager241 ~]# su - hive
在/home/hive目录下新建文件test.txt
hello world
hello zhengzhou
hello ranger
[hive@manager241 ~]$ hdfs dfs -copyFromLocal test.txt /zone_encr
2. 从加密区下载文件
[hive@manager241 ~]$ hdfs dfs -copyToLocal /zone_encr/test.txt test_down.txt
[hive@manager241 ~]$ ll
-rw-r--r--. 1 hive hadoop 41 Aug 27 03:04 test_down.txt
-rw-r--r--. 1 hive hadoop 41 Aug 27 03:02 test.txt
3. 读取加密区文件数据内容
[hive@manager241 ~]$ hdfs dfs -cat /zone_encr/test.txt
hello world
hello zhengzhou
hello ranger
[root@manager241 ~]# su - ranger
[ranger@manager241 ~]$ hdfs dfs -cat /zone_encr/test.txt
cat: User:ranger not allowed to do 'DECRYPT_EEK' on 'key1'
参考资料: