Hadoop生态圈(十八)- HDFS Transparent Encryption透明加密
目錄
- 前言
- 1. HDFS明文存儲弊端
- 2. 背景和應用
- 2.1 常見的加密層級
- 2.2 應用場景
- 3. 透明加密介紹
- 4. 透明加密關鍵概念和架構
- 4.1 加密區域和密鑰
- 4.2 Keystore和Hadoop KMS
- 4.3 訪問加密區域內的文件
- 4.3.1 寫入加密文件過程
- 4.3.2 讀取解密文件過程
- 5. KMS配置
- 5.1 關閉HDFS集群
- 5.2 key密鑰生成
- 5.3 配置kms-site.xml
- 5.4 kms-env.sh
- 5.5 修改core|hdfs-site.xml
- 5.6 服務啟動
- 5.6.1 KMS服務啟動
- 5.6.2 HDFS集群啟動
- 6. 透明加密使用
- 6.1 創建key
- 6.2 創建加密區
- 6.3 測試加密效果
原文地址:https://program-park.github.io/2022/01/25/hadoop_22/
前言
部分內容摘自尚硅谷、黑馬等等培訓資料
1. HDFS明文存儲弊端
??HDFS 中的數據會以 block 的形式保存在各臺數據節點的本地磁盤中,但這些 block 都是明文的,如果在操作系統下,直接訪問block所在的目錄,通過Linux的cat命令是可以直接查看里面的內容的,而且是明文。
??下面我們直接去 DataNode 本地存儲 block 的目錄,直接查看 block 內容:
2. 背景和應用
2.1 常見的加密層級
- 應用層加密
- 這是最安全也是最靈活的方式。加密內容最終由應用程序來控制,并且可以精確的反映用戶的需求。但是,編寫應用程序來實現加密一般都比較困難。
- 數據庫層加密
- 類似于應用程序加密。大多數數據庫廠商都提供某種形式的加密,但是可能會有性能問題,另外比如說索引沒辦法加密。
- 文件系統層加密
- 這種方式對性能影響不大,而且對應用程序是透明的,一般也比較容易實施。但是應用程序細粒度的要求策略,可能無法完全滿足。
- 磁盤層加密
- 易于部署和高性能,但是相當不靈活,只能防止用戶從物理層面盜竊數據。
??HDFS 的透明加密屬于數據庫層和文件系統層的加密。擁有不錯的性能,且對于現有的應用程序是透明的。HDFS 加密可以防止在文件系統或之下的攻擊,也叫操作系統級別的攻擊(OS-level attacks)。操作系統和磁盤只能與加密的數據進行交互,因為數據已經被 HDFS 加密了。
2.2 應用場景
??數據加密對于全球許多政府,金融和監管機構都是強制性的,以滿足隱私和其他安全要求。例如,卡支付行業已采用 “支付卡行業數據安全標準”(PCI DSS)來提高信息安全性。其他示例包括美國政府的《聯邦信息安全管理法案》(FISMA)和《健康保險可移植性和責任法案》(HIPAA)提出的要求。加密存儲在HDFS中的數據可以幫助您的組織遵守此類規定。
3. 透明加密介紹
??HDFS透明加密(Transparent Encryption)支持端到端的透明加密,啟用以后,對于一些需要加密的 HDFS 目錄里的文件可以實現透明的加密和解密,而不需要修改用戶的業務代碼。端到端是指加密和解密只能通過客戶端。對于加密區域里的文件,HDFS 保存的即是加密后的文件,文件加密的秘鑰也是加密的。讓非法用戶即使從操作系統層面拷走文件,也是密文,沒法查看。
??HDFS 透明加密具有以下功能特點:
- 只有 HDFS 客戶端可以加密或解密數據。
- 密鑰管理在 HDFS 外部。HDFS 無法訪問未加密的數據或加密密鑰。HDFS 的管理和密鑰的管理是獨立的職責,由不同的用戶角色(HDFS 管理員,密鑰管理員)承擔,從而確保沒有單個用戶可以不受限制地訪問數據和密鑰。
- 操作系統和 HDFS 僅使用加密的 HDFS 數據進行交互,從而減輕了操作系統和文件系統級別的威脅。
- HDFS 使用高級加密標準計數器模式(AES-CTR)加密算法。AES-CTR 支持 128 位加密密鑰(默認),或者在安裝 Java Cryptography Extension(JCE)無限強度 JCE 時支持 256 位加密密鑰。
4. 透明加密關鍵概念和架構
4.1 加密區域和密鑰
??HDFS 的透明加密有一個新的概念,加密區域(the encryption zone)。加密區域是一個特殊的目錄,寫入文件的時候會被透明加密,讀取文件的時候又會被透明解密。
??當加密區域被創建時,都會有一個加密區域秘鑰(EZ密鑰,encryption zone key)與之對應,EZ 密鑰存儲在 HDFS 外部的備份密鑰庫中。加密區域里的每個文件都有其自己加密密鑰,叫做數據加密秘鑰(DEK,data encryption key)。DEK 會使用其各自的加密區域的 EZ 密鑰進行加密,以形成加密數據加密密鑰(EDEK)HDFS 不會直接處理 DEK,HDFS 只會處理 EDEK。客戶端會解密 EDEK,然后用后續的 DEK 來讀取和寫入數據。
??關于 EZ 密鑰、DEK、EDEK 三者關系如下所示:
4.2 Keystore和Hadoop KMS
??存儲密鑰(key)的叫做密鑰庫(keystore),將 HDFS 與外部企業級密鑰庫(keystore)集成是部署透明加密的第一步。這是因為密鑰(key)管理員和 HDFS 管理員之間的職責分離是此功能的非常重要的方面。但是,大多數密鑰庫都不是為 Hadoop 工作負載所見的加密/解密請求速率而設計的。
??為此,Hadoop 進行了一項新服務的開發,該服務稱為Hadoop密鑰管理服務器(Key Management Server,簡寫KMS),該服務用作 HDFS 客戶端與密鑰庫之間的代理。密鑰庫和 Hadoop KMS 相互之間以及與 HDFS 客戶端之間都必須使用 Hadoop 的 KeyProvider API 進行交互。
??KMS 主要有以下幾個職責:
4.3 訪問加密區域內的文件
4.3.1 寫入加密文件過程
??前提:創建 HDFS 加密區時會創建一個 HDFS 加密區(目錄),同時會在 KMS 服務里創建一個 key 及其 EZ Key,及兩者之間的關聯。
??DEK是加解密一個文件的密匙,而KMS里存儲的EZ key是用來加解密所有文件的密匙(DEK)的密匙。所以,EZ Key 是更為重要的數據,只在 KMS 內部使用(DEK 的加解密只在 KMS 內存進行),不會被傳遞到外面使用,而 HDFS 服務端只能接觸到 EDEK,所以 HDFS 服務端也不能解密加密區文件。
4.3.2 讀取解密文件過程
??讀流程與寫流程類型,區別就是 NN 直接讀取加密文件元數據里的 EDEK 返回給客戶端,客戶端一樣把 EDEK 發送給 KMS 獲取 DEK。再對加密內容解密讀取。
??EDEK的加密和解密完全在KMS上進行。更重要的是,請求創建或解密 EDEK 的客戶端永遠不會處理 EZ 密鑰。僅 KMS 可以根據要求使用 EZ 密鑰創建和解密 EDEK。
5. KMS配置
5.1 關閉HDFS集群
??在 hadoop1 上執行stop-dfs.sh。
5.2 key密鑰生成
[hadoop@hadoop1 hadoop-3.3.1]$ keytool -genkey -alias 'itcast' Enter keystore password: Re-enter new password: What is your first and last name?[Unknown]: What is the name of your organizational unit?[Unknown]: What is the name of your organization?[Unknown]: What is the name of your City or Locality?[Unknown]: What is the name of your State or Province?[Unknown]: What is the two-letter country code for this unit?[Unknown]: Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?[no]: yesEnter key password for <itcast>(RETURN if same as keystore password): Re-enter new password:5.3 配置kms-site.xml
??配置文件路徑:/data/hadoop-3.3.1/etc/hadoop/kms-site.xml
<configuration><!-- ${user.home}/kms.jks : 它會根據用戶名來設定值,需要注意的:在前面執行keytool 命令的用戶需要與后面執行kms.sh start是同一個用戶。原因:keytool執行命令之后,會在當前用戶的根目錄下面生成一個配置文件: --><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@192.168.68.101:16000/kms</value></property><property><name>hadoop.kms.authentication.type</name><value>simple</value></property> </configuration>??KMS 訪問 java 密鑰庫的密碼文件需配置在 Hadoop 的配置目錄下:
5.4 kms-env.sh
export KMS_HOME=/data/hadoop-3.3.1 export KMS_LOG=${KMS_HOME}/logs/kms export KMS_HTTP_PORT=16000 export KMS_ADMIN_PORT=160015.5 修改core|hdfs-site.xml
??core-site.xml
<property><name>hadoop.security.key.provider.path</name><value>kms://http@192.168.68.101:16000/kms</value> </property>??hdfs-site.xml
<property><name>dfs.encryption.key.provider.uri</name><value>kms://http@192.168.68.101:16000/kms</value> </property>??同步配置文件:
scp core-site.xml hadoop@192.168.68.102:$PWD scp core-site.xml hadoop@192.168.68.103:$PWD scp hdfs-site.xml hadoop@192.168.68.102:$PWD scp hdfs-site.xml hadoop@192.168.68.103:$PWD scp kms-site.xml hadoop@192.168.68.102:$PWD scp kms-site.xml hadoop@192.168.68.103:$PWD scp kms-env.sh hadoop@192.168.68.102:$PWD scp kms-env.sh hadoop@192.168.68.103:$PWD5.6 服務啟動
5.6.1 KMS服務啟動
hadoop --daemon start kms5.6.2 HDFS集群啟動
??start-dfs.sh
6. 透明加密使用
6.1 創建key
??切換為普通用戶test操作:
su test hadoop key create itcast hadoop key list -metadata6.2 創建加密區
??使用hadoop用戶操作:
#創建一個新的空目錄,并將其設置為加密區域 hadoop fs -mkdir /zone hdfs crypto -createZone -keyName itcast -path /zone #將其chown給普通用戶 hadoop fs -chown test:test /zone6.3 測試加密效果
??以普通用戶操作:
#以普通用戶的身份放入文件,然后讀出來 echo helloitcast >> helloWorld hadoop fs -put helloWorld /zone hadoop fs -cat /zone /helloWorld #作為普通用戶,從文件獲取加密信息 hdfs crypto -getFileEncryptionInfo -path /zone/helloWorld
??直接下載文件的 block,發現是無法讀取數據的。
總結
以上是生活随笔為你收集整理的Hadoop生态圈(十八)- HDFS Transparent Encryption透明加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux和windows局域网连接网络
- 下一篇: 计算机网络的结构有,计算机网络的组成部分