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分配调度计算与优化
本文旨在简单介绍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]$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
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.org/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 9月 13 13:39 .keystore
...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
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]$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
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
- 1
- 2
- 3
- 4
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 ~]$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
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 ~]$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
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]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
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 ~]$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
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]$
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
获取文件加密信息
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]$
- 1
- 2
- 3
- 4
- 5
切换不同用户进行文件读取操作只要具备read权限都可以读取文件的内容
[root@server1 hadoop-3.1.4]# hadoop fs -cat /zone/1.txt
12345
- 1
- 2
也就是对客户端来说是透明的,感觉不到文件被加密。
如果直接从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]$
- 1
- 2
- 3
- 4
- 5
下载到本地打开文件,已经加密了
评论记录:
回复评论: