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主要有以下几个职责
  1. 访问加密区域密钥(EZ Key)
  2. 生成EDEK,EDEK存储在NameNode上
  3. 为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个目录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 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个文件夹 logsdatas, 并创建一个文件1.data,内容为1234567891.data先不传递到logsdatas目录中。

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

hdfs的透明加密记录的更多相关文章

  1. hadoop 透明加密

    hadoop 透明加密 hadoop 透明加密 kms transparent 2015年04月09日 18:12:20 糖糖_ 阅读数:12248 标签: transparenthadoop kms ...

  2. SqlServer2008数据库透明加密

    前几天研究了一下sql数据库的透明加密,记下来加深一下理解. 用脚本创建文件夹 --查文件夹有没有 EXEC master.dbo.xp_fileexist 'D:\DATA\storedcerts' ...

  3. KingbaseES 表空间加密-透明加密

    透明存储加密是指数据在写到磁盘上时对其进行加密,当授权用户重新读取数据时再对其进行解密.加密解密过程对用户都是透明的,无需对应用程序进行修改,授权用户甚至不会注意到数据已经在存储介质上加密.当前的透明 ...

  4. ORACLE透明加密

    --官网文档:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t概述Oracle 数据库 10g 第 2 版透明 ...

  5. .NET和JAVA同等加密方法,MD5和DES对称加密记录

    C#版: using System; using System.Security.Cryptography; using System.Text; namespace ConsoleApplicati ...

  6. 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)

    package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...

  7. Hadoop HDFS 源码解析记录

    版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处( https://www.cnblogs.com/mikevictor07/p/12047502.html ),以下内容为个人理解,仅 ...

  8. 读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理

    本文将通过一个演示工程来快速上手java调用HDFS的常见操作.接下来以创建文件为例,通过阅读HDFS的源码,一步步展开HDFS相关原理.理论知识的说明. 说明:本文档基于最新版本Hadoop3.2. ...

  9. (转)笔记320 SQLSERVER中的加密函数 2013-7-11

    1 --SQLSERVER中的加密函数 2013-7-11 2 ENCRYPTBYASYMKEY() --非对称密钥 3 ENCRYPTBYCERT() --证书加密 4 ENCRYPTBYKEY() ...

  10. Oracle中对列加密的方法

    Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...

随机推荐

  1. JS 一篇文章弄懂Object.defineProperty,现学现用,来试试相关笔试题吧

    壹 ❀ 引 早在大半年前,掘金某位用户分享的面试题整理中有一题,简述let与const区别,你能自己模拟实现它们吗?,题目意思大概如此,时间久远我也很难找到那篇文章,当时看到此题对于const实现我的 ...

  2. .NET周刊【2月第1期 2024-02-04】

    祝大家新年快乐,龙年大吉~ 国内文章 C#/.NET/.NET Core优秀项目和框架2024年1月简报 https://www.cnblogs.com/Can-daydayup/p/18000401 ...

  3. Mybatis的缓存过期机制和RedisCache

    MyBatis的缓存过期机制, flushInterval参数 在实际测试中, 发现Redis中的缓存数据TTL为-1, 在Hash中的key也无过期时间信息, 怀疑RedisCache的实现是否能正 ...

  4. Js中Array对象

    Js中Array对象 JavaScript的Array对象是用于构造数组的全局对象,数组是类似于列表的高阶对象. 描述 在JavaScript中通常可以使用Array构造器与字面量的方式创建数组. c ...

  5. win10无法保存代理服务器设置

    问题说明 通过Internet设置->链接->局域网设置->代理服务设置,填写完地址后点选"确定"无反应,关闭窗口后重新打开'局域网设置',数据全无. 通过 开始 ...

  6. Spring Boot图书管理系统项目实战-4.基础信息管理

    导航: pre:  3.用户登录 next:5.读者管理 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 出版社管理.语种管理.书架管 ...

  7. 学习go语言编程之常量

    什么在常量 在Golang中,常量是指在编译期就已知且不可改变的值. 字面常量 在程序中硬编码的常量值被称为字面常量,如: -12 // 整数类型常量 3.1415926 // 浮点类型常量 3.2+ ...

  8. channel管道

    channel 如果说goroutine是并发体的话,那么channels则是他们之间的通信机制.一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发生值 ...

  9. 【Python语法糖】闭包和装饰器

    Python闭包和装饰器 参考: https://zhuanlan.zhihu.com/p/453787908 https://www.bilibili.com/video/BV1JW411i7HR/ ...

  10. 【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题

    问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在A ...