1、背景
咱们晓得,在 hdfs
中,咱们的数据是以 block
块存储在咱们的磁盘上的,那么默认状况下,它是以 密文
存储的,还是以 明文
存储的呢?如果是明文存储的,那么是否就不平安呢?那么在 hdfs
中是如何做能力做到数据的 通明加密
呢?
2、常见的加密层级
- 应用层加密: 这是
最平安
和最灵便
的办法。加密内容最终由应用程序来管制。并且能够准确的反馈用户的需要。然而,编写应用程序来实现加密个别都比拟艰难。 - 数据库层加密: 相似于应用程序级加密。大多数数据库供应商都提供某种模式的加密。然而
可能存在性能问题
。比方
:索引无奈加密。 - 文件系统层加密: 这种形式对性能影响不大,且对应用程序是通明的,个别也比拟容易施行。然而如果须要应答细粒度的要求策略,可能无奈齐全满足。比方:加密文件系统 (EFS) 用于在 (NTFS) 文件系统卷上存储已加密的文件。
- 磁盘层加密: 易于部署和高性能,然而相当不灵便,只能避免用户从物理层面偷盗数据。
3、通明加密介绍
- HDFS 通明加密(
Transparent Encryption
)反对端对端
的通明加密,启用当前,对于一些须要加密的 HDFS 目录里的文件能够实现通明的加密和解密,而不须要批改用户的业务代码。端对端是指加密和解密只能通过客户端来操作
。 - 对于
加密区域
里的文件,HDFS保留的即是加密后的文件
,文件加密的密钥也是加密的
。让非法用户即便从操作系统层面拷走文件,也是密文,没法查看。 - HDFS
集群治理
和密钥的治理
是相互独立
的职责
,由不同的用户角色(HDFS 管理员、密钥管理员)承当。 - 只有
HDFS 客户端
能够加密或解密数据,密钥治理在 HDFS 内部
,HDFS 无法访问未加密的数据或加密密钥。
4、HDFS 通明加密的外围概念
4.1 加密区域
加密区域
就是 HDFS 上的一个目录
,只不过该目录相对而言略微非凡点。 文件写入
的时候会被通明加密,文件读取
的时候会被通明解密。
4.2 加密区域密钥 -EZ KEY
当加密区域被创立时,都会有一个 加密区域密钥(EZ 密钥, encryption zone key)
与之对应,EZ 密钥存储在 HDFS 内部的密钥库中
。
4.3 数据加密密钥 -DEK
加密区域里的 每个文件
都有其本人
的加密密钥
,叫做 数据加密密钥(DEK, data. encryption key)
。
4.4 加密数据加密密钥 EDEK
DEK
会应用其各自的加密区域的 EZ
密钥进行 加密
,以造成 加密数据加密密钥(EDEK)
4.5 DEK 的加解密和文件的加解密
4.6 密钥库
存储密钥 (key) 的叫做密钥库 (keystore)
,将 HDFS 与内部企业级密钥库(keystore) 集成是部署通明加密的第一步。为什么密钥库独立与 HDFS 之外?
能够指摘拆散,而且也更加平安。这样hdfs 管理员
和keystore 管理员
就是 2 集体,各个解决各自的事件。
4.7 KMS 密钥治理服务
- Hadoop
密钥治理服务
(Key Management Server, 简称KMS
),用作HDFS 客户端
与密钥库
之间的代理
。 - KMS 次要有以下几个职责
- 拜访加密区域密钥(EZ Key)
- 生成 EDEK,
EDEK 存储在 NameNode 上
- 为 HDFS 客户端解密 EDEK
5、配置通明加密
5.1 敞开 hdfs 集群
[hadoopdeploy@hadoop01 sh]$ stop-dfs.sh
Stopping namenodes on [hadoop01]
Stopping datanodes
Stopping secondary namenodes [hadoop03]
[hadoopdeploy@hadoop01 sh]$
5.2 创立 keystore
密钥库的明码为Hadoop@123
[hadoopdeploy@hadoop01 ~]$ keytool -genkey -alias 'keystore_hadoop'
输出密钥库口令:
再次输出新口令:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省 / 市 / 自治区名称是什么?
[Unknown]:
该单位的双字母国家 / 地区代码是什么?
[Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 是否正确?
[否]: y
输出 <keystore_hadoop> 的密钥口令
(如果和密钥库口令雷同, 按回车):
再次输出新口令:
Warning:
JKS 密钥库应用专用格局。倡议应用 "keytool -importkeystore -srckeystore /home/hadoopdeploy/.keystore -destkeystore /home/hadoopdeploy/.keystore -deststoretype pkcs12" 迁徙到行业标准格局 PKCS12。[hadoopdeploy@hadoop01 ~]$ ll ~/.keystore
-rw-rw-r--. 1 hadoopdeploy hadoopdeploy 1992 6 月 15 22:20 /home/hadoopdeploy/.keystore
[hadoopdeploy@hadoop01 ~]$
5.3 编辑 kms-site.xml 文件
<configuration>
<!-- 设置密钥库的提供者,jceks: 标识的是 java 密钥库 -->
<property>
<name>hadoop.kms.key.provider.uri</name>
<value>jceks://file@/${user.home}/kms.jks</value>
</property>
<!-- 密钥库的密码文件, 该文件中保留的是拜访密钥库的明码, 须要搁置在 hadoop 的配置文件夹下 ...../etc/hadoop -->
<property>
<name>hadoop.security.keystore.java-keystore-provider.password-file</name>
<value>kms.keystore.password.txt</value>
</property>
<property>
<name>hadoop.kms.http.port</name>
<value>16000</value>
</property>
<!-- 对外裸露的 kms 服务地址 -->
<property>
<name>dfs.encryption.key.provider.uri</name>
<value>kms://http@hadoop01:16000/kms</value>
</property>
<!-- 认证形式 -->
<property>
<name>hadoop.kms.authentication.type</name>
<value>simple</value>
</property>
</configuration>
须要创立 kms.keystore.password.txt
文件,并设置密钥库的明码
[hadoopdeploy@hadoop01 hadoop]$ cat /opt/bigdata/hadoop-3.3.4/etc/hadoop/kms.keystore.password.txt
Hadoop@123
[hadoopdeploy@hadoop01 hadoop]$
5.4 编辑 kms-env.sh
export KMS_HOME=/opt/bigdata/hadoop-3.3.4
export KMS_LOG=${KMS_HOME}/logs/kms
export KMS_ADMIN_PORT=16001
5.5 批改 core-site.xml
<!-- 指定拜访 kms 服务的地址 -->
<property>
<name>hadoop.security.key.provider.path</name>
<value>kms://http@hadoop01:16000/kms</value>
</property>
5.6 批改 hdfs-site.xml
<!-- 指定拜访 kms 服务的地址 -->
<property>
<name>dfs.encryption.key.provider.uri</name>
<value>kms://http@hadoop01:16000/kms</value>
</property>
5.7 同步配置到集群另外的机器上
[hadoopdeploy@hadoop01 hadoop]$ scp kms-site.xml kms-env.sh core-site.xml hdfs-site.xml hadoop01:$PWD
[hadoopdeploy@hadoop01 hadoop]$ scp kms-site.xml kms-env.sh core-site.xml hdfs-site.xml hadoop02:$PWD
5.8 启动 hdfs 集群
[hadoopdeploy@hadoop01 hadoop]$ start-dfs.sh
Starting namenodes on [hadoop01]
Starting datanodes
Starting secondary namenodes [hadoop03]
[hadoopdeploy@hadoop01 hadoop]$ jps
2080 NameNode
2243 DataNode
2471 Jps
[hadoopdeploy@hadoop01 hadoop]$
5.9 启动 kms 服务
[hadoopdeploy@hadoop01 hadoop]$ hadoop --daemon start kms
WARNING: KMS_LOG has been replaced by HADOOP_LOG_DIR. Using value of KMS_LOG.
WARNING: /opt/bigdata/hadoop-3.3.4//temp does not exist. Creating.
WARNING: /opt/bigdata/hadoop-3.3.4/logs/kms does not exist. Creating.
[hadoopdeploy@hadoop01 hadoop]$ jps
2080 NameNode
2243 DataNode
2870 KMSWebServer
2904 Jps
[hadoopdeploy@hadoop01 hadoop]$
hadoop --daemon stop kms
进行 kms 服务
6、测试通明加密
需要
:在 hdfs 上创立 2 个目录logs
和datas
,只有是在 datas
目录中上传文件都须要通明加密,logs
目录不须要,同时往 logs
和datas
目录中上传一个文件,而后查看对应文件在磁盘上的 block 块,间接在操作系统上查看这个块,看文件是否加密。
6.1 筹备数据
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -mkdir /logs
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -mkdir /datas
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -ls /
Found 2 items
drwxr-xr-x - hadoopdeploy supergroup 0 2023-06-16 21:10 /datas
drwxr-xr-x - hadoopdeploy supergroup 0 2023-06-16 21:10 /logs
[hadoopdeploy@hadoop01 hadoop]$ echo 123456789 > 1.data
[hadoopdeploy@hadoop01 hadoop]$ cat 1.data
123456789
[hadoopdeploy@hadoop01 hadoop]$
在 /
目录下创立 2 个文件夹 logs
和 datas
, 并创立一个文件1.data
,内容为123456789
,1.data
先不传递到 logs
和datas
目录中。
6.2 创立 key
# 创立一个 key,名字是 ezk_datas
[hadoopdeploy@hadoop01 hadoop]$ hadoop key create ezk_datas
ezk_datas has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@3d5c822d has been updated.
# 查看 key 列表
[hadoopdeploy@hadoop01 hadoop]$ hadoop key list -metadata
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@2f8dad04
ezk_datas : cipher: AES/CTR/NoPadding, length: 128, description: null, created: Fri Jun 16 21:36:51 CST 2023, version: 1, attributes: [key.acl.name=ezk_datas]
[hadoopdeploy@hadoop01 hadoop]$
6.3 创立加密区域
[hadoopdeploy@hadoop01 hadoop]$ hdfs crypto -createZone -keyName ezk_datas -path /datas
Added encryption zone /datas
[hadoopdeploy@hadoop01 hadoop]$
ezk_datas
:为咱们创立的 ezk 的名字 /datas
:hdfs 上的一个目录
6.4 文件上传
# 往 /datas 目录上传一个文件
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -put 1.data /datas
# 往 /logs 目录上传一个文件
[hadoopdeploy@hadoop01 hadoop]$ hadoop fs -put 1.data /logs
[hadoopdeploy@hadoop01 hadoop]$
6.5 查看加密文件
7、参考资料
1、https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/TransparentEncryption.html