1、背景

咱们晓得,在hdfs中,咱们的数据是以block块存储在咱们的磁盘上的,那么默认状况下,它是以密文存储的,还是以明文存储的呢?如果是明文存储的,那么是否就不平安呢?那么在hdfs中是如何做能力做到数据的通明加密呢?

2、常见的加密层级

  1. 应用层加密: 这是最平安最灵便的办法。加密内容最终由应用程序来管制。并且能够准确的反馈用户的需要。然而,编写应用程序来实现加密个别都比拟艰难。
  2. 数据库层加密: 相似于应用程序级加密。大多数数据库供应商都提供某种模式的加密。然而可能存在性能问题比方:索引无奈加密。
  3. 文件系统层加密: 这种形式对性能影响不大,且对应用程序是通明的,个别也比拟容易施行。然而如果须要应答细粒度的要求策略,可能无奈齐全满足。比方:加密文件系统(EFS)用于在(NTFS)文件系统卷上存储已加密的文件。
  4. 磁盘层加密: 易于部署和高性能,然而相当不灵便,只能避免用户从物理层面偷盗数据。

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.shStopping namenodes on [hadoop01]Stopping datanodesStopping 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.txtHadoop@123[hadoopdeploy@hadoop01 hadoop]$

5.4 编辑 kms-env.sh

export KMS_HOME=/opt/bigdata/hadoop-3.3.4export KMS_LOG=${KMS_HOME}/logs/kmsexport 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.shStarting namenodes on [hadoop01]Starting datanodesStarting secondary namenodes [hadoop03][hadoopdeploy@hadoop01 hadoop]$ jps2080 NameNode2243 DataNode2471 Jps[hadoopdeploy@hadoop01 hadoop]$

5.9 启动kms服务

[hadoopdeploy@hadoop01 hadoop]$ hadoop --daemon start kmsWARNING: 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]$ jps2080 NameNode2243 DataNode2870 KMSWebServer2904 Jps[hadoopdeploy@hadoop01 hadoop]$

hadoop --daemon stop kms 进行kms服务

6、测试通明加密

需要: 在hdfs上创立2个目录logsdatas,只有是在datas目录中上传文件都须要通明加密,logs目录不须要,同时往logsdatas目录中上传一个文件,而后查看对应文件在磁盘上的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 itemsdrwxr-xr-x   - hadoopdeploy supergroup          0 2023-06-16 21:10 /datasdrwxr-xr-x   - hadoopdeploy supergroup          0 2023-06-16 21:10 /logs[hadoopdeploy@hadoop01 hadoop]$ echo 123456789 > 1.data[hadoopdeploy@hadoop01 hadoop]$ cat 1.data123456789[hadoopdeploy@hadoop01 hadoop]$

/ 目录下创立2个文件夹 logsdatas, 并创立一个文件1.data,内容为1234567891.data先不传递到logsdatas目录中。

6.2 创立key

# 创立一个key ,名字是 ezk_datas[hadoopdeploy@hadoop01 hadoop]$ hadoop key create ezk_datasezk_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 -metadataListing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@2f8dad04ezk_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 /datasAdded 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