14、HDFS 透明加密KMS

编程入门 行业动态 更新时间:2024-10-18 08:24:41

Hadoop系列文章目录

1、hadoop3.1.4简单介绍及部署、简单验证
2、HDFS操作 - shell客户端
3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java
4、HDFS-java操作类HDFSUtil及junit测试(HDFS的常见操作以及HA环境的配置)
5、HDFS API的RESTful风格–WebHDFS
6、HDFS的HttpFS-代理服务
7、大数据中常见的文件存储格式以及hadoop中支持的压缩算法
8、HDFS内存存储策略支持和“冷热温”存储
9、hadoop高可用HA集群部署及三种方式验证
10、HDFS小文件解决方案–Archive
11、hadoop环境下的Sequence File的读写与合并
12、HDFS Trash垃圾桶回收介绍与示例
13、HDFS Snapshot快照
14、HDFS 透明加密KMS
15、MapReduce介绍及wordcount
16、MapReduce的基本用法示例-自定义序列化、排序、分区、分组和topN
17、MapReduce的分区Partition介绍
18、MapReduce的计数器与通过MapReduce读取/写入数据库示例
19、Join操作map side join 和 reduce side join
20、MapReduce 工作流介绍
21、MapReduce读写SequenceFile、MapFile、ORCFile和ParquetFile文件
22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件
23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化


文章目录

  • Hadoop系列文章目录
  • 一、介绍
    • 1、HDFS明文存储弊端
    • 2、HDFS透明加密
      • 1)、介绍
      • 2)、特点
    • 3、HDFS透明加密关键概念
      • 1)、加密区域
      • 2)、密钥
      • 3)、密钥库(keystore)
      • 4)、KMS(密钥管理服务)
      • 5)、写入加密文件过程
      • 6)、读取解密文件过程
  • 二、部署及使用
    • 1、关闭HDFS集群
    • 2、keystore密钥库
    • 3、配置kms-site.xml
    • 4、kms-env.sh
    • 5、修改core|hdfs-site.xml
    • 6、kms服务及集群启动
    • 7、透明加密使用
      • 1)、创建key
      • 2)、创建加密区
      • 3)、测试加密效果


本文旨在简单介绍hdfs的透明加密作用及其使用。
前提依赖:hadoop环境部署好且可用。部署文章可参考本专栏相关文章。
本文分为2部分,即介绍和部署及使用。

一、介绍

1、HDFS明文存储弊端

HDFS中的数据会以block的形式保存在各台数据节点的本地磁盘中,但这些block都是明文的。
通过Web UI页面找到Block的ID和副本位于的机器信息
如果在操作系统中直接访问block所在的目录,通过Linux的cat命令是可以直接查看里面的内容的,且是明文。

在datanode找到其文件为:
/usr/local/bigdata/hdfsdata/dfs/data/current/BP-285668707-192.168.10.41-1662533817886/current/finalized/subdir0/subdir0/blk_1073741834
[alanchan@server2 subdir0]$ pwd
/usr/local/bigdata/hdfsdata/dfs/data/current/BP-285668707-192.168.10.41-1662533817886/current/finalized/subdir0/subdir0
[alanchan@server2 subdir0]$ cat blk_1073741834
11
[alanchan@server2 subdir0]$ 

2、HDFS透明加密

1)、介绍

HDFS透明加密(Transparent Encryption)支持端到端的透明加密,启用以后,对于一些需要加密的HDFS目录里的文件可以实现透明的加密和解密,而不需要修改用户的业务代码。端到端是指加密和解密只能通过客户端。
对于加密区域里的文件,HDFS保存的即是加密后的文件,文件加密的秘钥也是加密的。让非法用户即使从操作系统层面拷走文件,也是密文

2)、特点

  • HDFS集群管理和密钥的管理是互相独立的职责,由不同的用户角色(HDFS管理员,密钥管理员)承担
  • 只有HDFS客户端可以加密或解密数据,密钥管理在HDFS外部,HDFS无法访问未加密的数据或加密密钥
  • block在操作系统是以加密的形式存储的,从而减轻了操作系统和文件系统级别的安全威胁
  • HDFS使用AES-CTR(支持128位加密密钥(默认))加密算法

3、HDFS透明加密关键概念

1)、加密区域

  • HDFS的透明加密有一个新的概念,加密区域(the encryption zone)
  • 加密区域就是HDFS上的一个目录
  • 加密区域里写入文件的时候会被透明加密,读取文件的时候又会被透明解密

2)、密钥

  • 当加密区域被创建时,都会有一个加密区域密钥(EZ密钥,encryption zone key)与之对应,EZ密钥存储在HDFS外部的密钥库中
  • 加密区域里的每个文件都有其自己加密密钥,叫做数据加密密钥(DEK,data encryption key)
  • DEK会使用其各自的加密区域的EZ密钥进行加密,以形成加密数据加密密钥(EDEK)

3)、密钥库(keystore)

存储密钥(key)的叫做密钥库(keystore),将HDFS与外部企业级密钥库(keystore)集成是部署透明加密的第一步。这是因为密钥(key)管理员和HDFS管理员之间的职责分离是此功能的非常重要的。但是,大多数密钥库都不是为Hadoop工作负载所见的加密/解密请求速率而设计的。

4)、KMS(密钥管理服务)

Hadoop密钥管理服务(Key Management Server,简写KMS),用作HDFS客户端与密钥库之间的代理。KMS主要有以下几个职责:

  • 访问加密区域秘钥(EZ key)
  • 生成EDEK,EDEK存储在NameNode上
  • 为HDFS客户端解密EDEK

5)、写入加密文件过程

提前:创建加密区,设置加密区密钥
1、Client向NameNode请求在HDFS某个加密区新建文件
2、NameNode从缓存中取出一个新的EDEK(后台不断从KMS拉取新的EDEK到缓存中)
3、获取到EDEK会被NameNode保存到文件的元数据中
4、然后NameNode将EDEK发送给Client
5、Client发送EDEK给KMS,KMS用对应的EZ key将EDEK解密出DEK发送给Client
6、Client用DEK加密文件内容发送给datanode进行存储

DEK是加解密一个文件的密钥,而KMS里存储的EZ key是用来加解密所有文件的密匙(DEK)的密匙。
所以,EZ Key是更为重要的数据,只在KMS内部使用(DEK的加解密只在KMS内存进行),不会被传递到外面使用;而HDFS服务端只能接触到EDEK。

6)、读取解密文件过程

  • 读流程与写流程类型,区别就是NameNode直接读取加密文件元数据里的EDEK返回给客户端,客户端一样把EDEK发送给KMS获取DEK。再对加密内容解密读取。
  • EDEK的加密和解密完全在KMS上进行。请求创建或解密EDEK的客户端永远不会处理EZ密钥。仅KMS可以根据要求使用EZ密钥创建和解密EDEK。

二、部署及使用

1、关闭HDFS集群

在server1上执行stop-dfs.sh

2、keystore密钥库

  • 存储密钥(key)的地方叫做密钥库(keystore)。
  • HDFS与keystore是互相独立的,两者之间通过KMS进行沟通。
  • KMS可以选择任何KeyProvider(密钥供应者)实现作为keystore 。
    此处的示例使用JavaKeyStoreProvider来作为keystore。
# https://hadoop.apache/docs/r3.1.4/hadoop-project-dist/hadoop-common/CredentialProviderAPI.html#Keystore_Passwords

keytool -genkey  -alias 'hdfs_keystore'
#密钥库的名字叫做hdfs,访问密钥库的密码是:123456
[alanchan@server1 ~]$ keytool -genkey  -alias 'hdfs_keystore'
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  
您的组织单位名称是什么?
  [Unknown]:  
您的组织名称是什么?
  [Unknown]:  
您所在的城市或区域名称是什么?
  [Unknown]:  
您所在的省/市/自治区名称是什么?
  [Unknown]:  
该单位的双字母国家/地区代码是什么?
  [Unknown]:  
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
  []:  y

输入 <hdfs_keystore> 的密钥口令
        (如果和密钥库口令相同, 按回车):  
[alanchan@server1 ~]$ ll -a
...
-rw-r--r--  1 alanchan root  1303 913 13:39 .keystore
...

3、配置kms-site.xml

hadoop.kms.key.provider.uri 设置密钥库的提供者 这里设置jceks,表示就是java密钥库

<configuration>
	<property>
		<name>hadoop.kms.key.provider.uri</name>
		<value>jceks://file@/${user.home}/kms.jks</value>
	</property>
	<property>
		<name>hadoop.security.keystore.java-keystore-provider.password-file</name>
		<value>kms.keystore.password</value>
	</property>
	<property>
		 <name>dfs.encryption.key.provider.uri</name>
		 <value>kms://http@server1:16000/kms</value>
	</property>
	<property>
		<name>hadoop.kms.authentication.type</name>
		<value>simple</value>
	</property>
</configuration>

#KMS访问java密钥库的密码文件kms.keystore.password需配置在Hadoop的配置目录下。不知道此步骤的具体作用
[alanchan@server1 hadoop]$ pwd
/usr/local/bigdata/hadoop-3.1.4/etc/hadoop
[alanchan@server1 hadoop]$ cat kms.keystore.password 
123456
[alanchan@server1 hadoop]$ 

4、kms-env.sh

export KMS_HOME=/usr/local/bigdata/hadoop-3.1.4
export KMS_LOG=${KMS_HOME}/logs/kms
export KMS_HTTP_PORT=16000
export KMS_ADMIN_PORT=16001

5、修改core|hdfs-site.xml

#在core|hdfs-site.xml增加下面jms配置
 <property>
		<name>hadoop.security.key.provider.path</name>
		<value>kms://http@server1:16000/kms</value>
</property>
#在server1上讲下面四个配置文件复制到server2、server3、server4

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml

scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh

[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
hdfs-site.xml                                                                                                                                                                                                                                       100% 4120     4.0KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
hdfs-site.xml                                                                                                                                                                                                                                       100% 4120     4.0KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
hdfs-site.xml                                                                                                                                                                                                                                       100% 4120     4.0KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
core-site.xml                                                                                                                                                                                                                                       100% 2314     2.3KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
core-site.xml                                                                                                                                                                                                                                       100% 2314     2.3KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/core-site.xml
core-site.xml                                                                                                                                                                                                                                       100% 2314     2.3KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
kms-site.xml                                                                                                                                                                                                                                        100% 1157     1.1KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
kms-site.xml                                                                                                                                                                                                                                        100% 1157     1.1KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-site.xml
kms-site.xml                                                                                                                                                                                                                                        100% 1157     1.1KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server2:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
kms-env.sh                                                                                                                                                                                                                                          100% 1491     1.5KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server3:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
kms-env.sh                                                                                                                                                                                                                                          100% 1491     1.5KB/s   00:00    
[alanchan@server1 ~]$ scp /usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh server4:/usr/local/bigdata/hadoop-3.1.4/etc/hadoop/kms-env.sh
kms-env.sh                                                                                                                                                                                                                                          100% 1491     1.5KB/s   00:00    
[alanchan@server1 ~]$ 

6、kms服务及集群启动

#关闭dfs
stop-dfs.sh
#启动dfs
start-dfs.sh

[alanchan@server1 ~]$ hadoop --daemon start kms
WARNING: KMS_LOG has been replaced by HADOOP_LOG_DIR. Using value of KMS_LOG.
WARNING: /usr/local/bigdata/hadoop-3.1.4/temp does not exist. Creating.
WARNING: /usr/local/bigdata/hadoop-3.1.4/logs/kms does not exist. Creating.
[alanchan@server1 ~]$ jps
13008 DFSZKFailoverController
15953 Jps
15154 QuorumPeerMain
15687 KMSWebServer
12189 NameNode
28893 ResourceManager
[alanchan@server1 ~]$ 

7、透明加密使用

1)、创建key

hadoop key create ezk
hadoop key list -metadata

[alanchan@server1 ~]$ hadoop key list -metadata
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@1ebd319f
[alanchan@server1 ~]$ hadoop key create test_ezk
test_ezk has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@55b53d44 has been updated.
[alanchan@server1 ~]$ hadoop key list -metadata
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@1ebd319f
test_ezk : cipher: AES/CTR/NoPadding, length: 128, description: null, created: Tue Sep 13 14:10:45 CST 2022, version: 1, attributes: [key.acl.name=test_ezk] 

2)、创建加密区

首先创建一个目录,然后把该目录设置为加密区(在HDFS集群中任何一台机器上执行都可以)

[alanchan@server4 ~]$ hadoop fs -ls /
Found 9 items
drwxr-xr-x   - alanchan supergroup          0 2022-09-09 02:24 /dest
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 01:25 /test
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 03:07 /testacl

[alanchan@server4 ~]$ hadoop fs -mkdir /zone
[alanchan@server4 ~]$ hadoop fs -ls /
Found 10 items
drwxr-xr-x   - alanchan supergroup          0 2022-09-09 02:24 /dest
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 01:25 /test
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 03:07 /testacl
drwxr-xr-x   - alanchan supergroup          0 2022-09-13 06:16 /zone
[alanchan@server4 ~]$ hdfs crypto -createZone -keyName test_ezk -path /zone
Added encryption zone /zone
[alanchan@server4 ~]$ 

3)、测试加密效果

上传文件到加密区,然后读取文件内容

[alanchan@server1 hadoop-3.1.4]$ hadoop fs -put 1.txt /zone
[alanchan@server1 hadoop-3.1.4]$ hadoop fs -ls /zone
Found 2 items
drwxrwxrwt   - alanchan supergroup          0 2022-09-13 14:18 /zone/.Trash
-rw-r--r--   3 alanchan supergroup          6 2022-09-13 14:21 /zone/1.txt
[alanchan@server1 hadoop-3.1.4]$ hadoop fs -cat /zone/1.txt
12345
[alanchan@server1 hadoop-3.1.4]$

获取文件加密信息

hdfs crypto -getFileEncryptionInfo -path /zone/1.txt

[alanchan@server1 hadoop-3.1.4]$ hdfs crypto -getFileEncryptionInfo -path /zone/1.txt
{cipherSuite: {name: AES/CTR/NoPadding, algorithmBlockSize: 16}, cryptoProtocolVersion: CryptoProtocolVersion{description='Encryption zones', version=2, unknownValue=null}, edek: 42b1e5b3176501141b4ed7da03fdd394, iv: b0d129f9bedc1e6e95dd3f6a0f5d4226, keyName: test_ezk, ezKeyVersionName: test_ezk@0}
[alanchan@server1 hadoop-3.1.4]$ 

切换不同用户进行文件读取操作只要具备read权限都可以读取文件的内容

[root@server1 hadoop-3.1.4]# hadoop fs -cat /zone/1.txt
12345

也就是对客户端来说是透明的,感觉不到文件被加密。
如果直接从DataNode的机器的本地文件系统读取Block信息。发现是无法读取数据的。
因为在存储数据的时候被加密了

[alanchan@server2 subdir0]$ pwd
/usr/local/bigdata/hdfsdata/dfs/data/current/BP-285668707-192.168.10.41-1662533817886/current/finalized/subdir0/subdir0
[alanchan@server2 subdir0]$ cat blk_1073741896
�D�R�I
[alanchan@server2 subdir0]$ 

下载到本地打开文件,已经加密了

更多推荐

14、HDFS 透明加密KMS

本文发布于:2023-06-14 05:05:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1440944.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:透明   HDFS   KMS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!