HDFS 透明加密使用、Keystore和Hadoop KMS、加密区域、透明加密关键概念和架构、KMS配置
HDFS 透明加密使用、Keystore和Hadoop KMS、加密區域
HDFS中的數據會以block的形式保存在各臺數據節點的本地磁盤中,但這些block都是明文的,如果在操作系統下,直接訪問block所在的目錄,通過Linux的cat命令是可以直接查看里面的內容的,而且是明文。
下面我們直接去DataNode本地存儲block的目錄,直接查看block內容:
/export/data/hadoop-3.1.4/dfs/data/current/BP-1748151750-192.168.227.1511608259905540/current/finalized/subdir0/subdir0/1.2 背景和應用
1.2.1 常見的加密層級
-
? 應用層加密
這是最安全也是最靈活的方式。加密內容最終由應用程序來控制,并且可以精確的反映用戶的需求。但是,編寫應用程序來實現加密一般都比較困難。
-
? 數據庫層加密
類似于應用程序加密。大多數數據庫廠商都提供某種形式的加密,但是可能會有性能問題,另外比如說索引沒辦法加密。
-
? 文件系統層加密
這種方式對性能影響不大,而且對應用程序是透明的,一般也比較容易實施。但是應用程序細粒度的要求策略,可能無法完全滿足。
-
? 磁盤層加密
易于部署和高性能,但是相當不靈活,只能防止用戶從物理層面盜竊數據。
HDFS的透明加密屬于數據庫層和文件系統層的加密。擁有不錯的性能,且對于現有的應用程序是透明的。HDFS加密可以防止在文件系統或之下的攻擊,也叫操作系統級別的攻擊(OS-level attacks)。操作系統和磁盤只能與加密的數據進行交互,因為數據已經被HDFS加密了。
1.2.2 應用場景
數據加密對于全球許多政府,金融和監管機構都是強制性的,以滿足隱私和其他安全要求。例如,卡支付行業已采用“支付卡行業數據安全標準”(PCI DSS)來提高信息安全性。其他示例包括美國政府的《聯邦信息安全管理法案》(FISMA)和《健康保險可移植性和責任法案》(HIPAA)提出的要求。加密存儲在HDFS中的數據可以幫助您的組織遵守此類規定。
1.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位加密密鑰。
1.4 透明加密關鍵概念和架構
1.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三者關系如下所示:
1.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主要有以下幾個職責:
1.提供訪問保存的加密區域秘鑰(EZ key) 2.生成EDEK,EDEK存儲在NameNode上 3.為HDFS客戶端解密EDEK1.4.3 訪問加密區域內的文件
1.4.3.1 寫入加密文件過程
前提:創建HDFS加密區時會創建一個HDFS加密區(目錄),同時會在KMS服務里創建一個key及其EZ Key,及兩者之間的關聯。
1.Client向NN請求在HDFS某個加密區新建文件; 2.NN向KMS請求此文件的EDEK,KMS用對應的EZ key生成一個新的EDEK發送給NN; 3.這個EDEK會被NN寫入到文件的metadata中; 4.NN發送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,所以HDFS服務端也不能解密加密區文件。
1.4.3.2 讀取解密文件過程
讀流程與寫流程類型,區別就是NN直接讀取加密文件元數據里的EDEK返回給客戶端,客戶端一樣把EDEK發送給KMS獲取DEK。再對加密內容解密讀取。
EDEK的加密和解密完全在KMS上進行。更重要的是,請求創建或解密EDEK的客戶端永遠不會處理EZ密鑰。僅KMS可以根據要求使用EZ密鑰創建和解密EDEK。
1.5 KMS配置
1.5.1 關閉HDFS集群
在node1上執行stop-dfs.sh。
1.5.2 key密鑰生成
[root@node1 ~]# keytool -genkey -alias 'yida' 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]: yes Enter key password for <yida>(RETURN if same as keystore password): Re-enter new password:1.5.3 配置kms-site.xml
配置文件路徑:/export/server/hadoop-3.1.4/etc/hadoop/kms-site.xml
<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@node1:16000/kms</value></property><property><name>hadoop.kms.authentication.type</name><value>simple</value></property> </configuration>密碼文件通過類路徑在Hadoop的配置目錄中查找。
1.5.4 kms-env.sh
export KMS_HOME=/export/server/hadoop-3.1.4 export KMS_LOG=${KMS_HOME}/logs/kms export KMS_HTTP_PORT=16000 export KMS_ADMIN_PORT=160011.5.5 修改core|hdfs-site.xml
core-site.xml
<property><name>hadoop.security.key.provider.path</name><value>kms://http@node1:16000/kms</value> </property>hdfs-site.xml
<property><name>dfs.encryption.key.provider.uri</name><value>kms://http@node1:16000/kms</value> </property>同步配置文件到其他節點
1.5.5.1 KMS服務啟動
hadoop --daemon start kms1.5.5.2 HDFS集群啟動
start-dfs.sh1.6 透明加密使用
1.6.1 創建key
切換成普通用戶allenwoon操作
# su allenwoon # hadoop key create yida # hadoop key list -metadata1.6.2 創建加密區
使用root超級用戶操作
#作為超級用戶,創建一個新的空目錄,并將其設置為加密區域 hadoop fs -mkdir /zone hdfs crypto -createZone -keyName itcast -path /zone #將其chown給普通用戶 hadoop fs -chown allenwoon:allenwoon /zone1.6.3 測試加密效果
以普通用戶操作
#以普通用戶的身份放入文件,然后讀出來 echo helloitcast >> helloWorld hadoop fs -put helloWorld /zone hadoop fs -cat /zone /helloWorld #作為普通用戶,從文件獲取加密信息 hdfs crypto -getFileEncryptionInfo -path /zone/helloWorld`
1.6.3 測試加密效果
以普通用戶操作
#以普通用戶的身份放入文件,然后讀出來 echo helloitcast >> helloWorld hadoop fs -put helloWorld /zone hadoop fs -cat /zone /helloWorld #作為普通用戶,從文件獲取加密信息 hdfs crypto -getFileEncryptionInfo -path /zone/helloWorld直接下載文件的block 發現是無法讀取數據的。
總結
以上是生活随笔為你收集整理的HDFS 透明加密使用、Keystore和Hadoop KMS、加密区域、透明加密关键概念和架构、KMS配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6点点点运算符
- 下一篇: win7系统中建立家庭局域网