HDFS加密存儲(HDP、Ranger、Ranger KMS實現)

      HDFS加密存儲,在CSDN上可以看到很多的前輩整理的博客,但是按照https://blog.csdn.net/linlinv3/article/details/44963429所介紹的那樣在我的環境並不能達到預期效果,將自己對hdfs加密的理解和實際操作做一個簡單整理。

       首先,hdfs的加密方式爲AES加密,先對AES加密做一個簡單瞭解。

AES算法

對稱加密算法:AES加密算法

下面簡單介紹下各個部分的作用與意義:

密鑰K

用來加密明文的密碼,在對稱加密算法中,加密與解密的密鑰是相同的。密鑰爲接收方與發送方協商產生,但不可以直接在網絡上傳輸,否則會導致密鑰泄漏,通常是通過非對稱加密算法加密密鑰,然後再通過網絡傳輸給對方,實際中,一般是通過RSA加密AES的密鑰,傳輸到接收方,接收方解密得到AES密鑰,然後發送方和接收方用AES密鑰來通信。

或者直接面對面商量密鑰。密鑰是絕對不可以泄漏的,否則會被攻擊者還原密文,竊取機密數據。

AES加密函數

設AES加密函數爲E,則 C = E(K, P),其中P爲明文,K爲密鑰,C爲密文。也就是說,把明文P和密鑰K作爲加密函數的參數輸入,則加密函數E會輸出密文C。

AES解密函數

設AES解密函數爲D,則 P = D(K, C),其中C爲密文,K爲密鑰,P爲明文。也就是說,把密文C和密鑰K作爲解密函數的參數輸入,則解密函數會輸出明文P。

 

HDFS 透明加密

HDFS Encryption Zone加密空間,即HDFS透明加密,是一種端到端的加密模式,其中的加/解密過程對於客戶端來說是完全透明的。數據在客戶端讀操作的時候被解密,當數據被客戶端寫的時候被加密,所以HDFS服務端本身並不是一個主要的參與者。形象地說,在HDFS服務端,你看到的只是一堆加密的數據流。

這個功能作用就是保證處於加密空間內的數據不被非法查詢,只有經過認證的客戶端才能查看解密內容。

準備知識

Encryption Zone是HDFS中的一個抽象概念,它表示此空間的內容在寫的時候會被透明地加密,同時在讀的時候,被透明地解密;用戶往HDFS上存儲數據的時候,無需用戶做任何程序代碼的更改(意思就是調用KeyProvider API ,用於在數據存入到HDFS上面的時候進行數據加密,解密的過程一樣)。這意味着數據加密和解密由客戶端完成的。HDFS不會存儲或訪問未加密的數據或數據加密密鑰(由KMS管理)。

具體到細節:

  1. 每個Encryption Zone 會與每個Encryption Zone Key相關聯(EZ Key),這個Key會在創建Encryption Zone的時候同時被指定。
  2. 每個Encryption Zone中的文件會有其唯一的Data Encryption Key數據加密Key,簡稱就是DEK。
  3. DEK不會被HDFS直接處理,取而代之的是,HDFS只處理經過加密的DEK,就是Encrypted Data Encryption Key,縮寫就是EDEK。
  4. 客戶端詢問KMS服務去解密EDEK,然後利用解密後得到的DEK去讀/寫數據。KMS利用存儲的EZ Key來解密EDEK得到DEK。
  5. 在客戶端向KMS服務請求時候,會有相關權限驗證,不符合要求的客戶端將不會得到解密好的DEK。而且KMS的權限驗證是獨立於HDFS的,是自身的一套權限驗證。

 

EZKey使用hadoop key命令來創建,DEK使用keytool genkey來生成。(?待定)

Client向NN(HDFS組件的NameNode服務進程)請求在HDFS某個加密區新建文件;

NN向KMS請求此文件的EDEK,KMS用對應的EZ Key生成一個新的EDEK發送給NN;

NN 發送此EDEK給Client;

Client發送EDEK給KMS請求解密,KMS用對應的EZ Key將EDEK解密爲DEK發送給Client;

Client拿到對應的DEK後對文件進行加密和解密

綜上所述可知:HDFS Server端的進程(NameNode,DataNode)本身並不參與hdfs區域的加密和解密,Namenode所做的事情只是向KMS請求獲取EDEK後將它發送給hdfs client,以便於client將EDEK解密之後,對實際的hdfs區域進行加密與解密,hdfs的加密與解密都只在hdfs client端完成

HDFS加密測試(Ranger與Ranger KMS)

創建EZKey(此處創建的Key類型待定)

通過ranger快速連接,選擇“Ranger Admin UI”,以keyadmin/keyadmin登錄;點擊Encrytion tab -> 選擇Key Manager; Select Service= 集羣名+ _kms; 點擊Add New Key按鈕,添加key name爲key1的key。

修改hdfs配置,啓用Ranger for hdfs。

通過界面創建hdfs加密區

若此處提示RemoteException,是因爲hdfs被拉進了對應的黑名單,創建如下策略,給hdfs對應的權限,保存即可,請特別注意不要給予解密權限(Decrypt EEK)。

在本地創建文件

Hdfs提示權限問題直接將hdfs對應路徑的權限修改爲777即可。

由以上可知,如果使用者未給對應的用戶賦予Decrypt EEK的權限,對應的用戶是無法往加密區裏面讀或者寫東西的。這一點很好理解,對於別的用戶,即使可以拿到EDEK,但是沒有解密已加密的密鑰的權限,即無法得到真正的密鑰,所以無法對文件進行加密或者解密操作。

加密權限初步驗證

創建本地用戶test。

[root@node1 hdfsencrytest]# useradd test

利用ranger,以keyadmin用戶登錄ranger,點擊aaa_kms,先刪除掉之前爲hdfs分配的policy1,不然後續的policy創建可能不成功。再爲test用戶創建對應的policy。

Test用戶可以進行對加密區的一些列操作,如下所示

查看驗證

用如下命令查看加密區與非加密區域的文件,觀察明文與密文的對比。可見加密區aaa.txt密文顯示,非加密區明文顯示,至此,hdfs加密配置與驗證均完成。

疑問與思考

關於"通過ranger快速連接,選擇“Ranger Admin UI”,以keyadmin/keyadmin登錄;點擊Encrytion tab -> 選擇Key Manager; Select Service= 集羣名+ _kms; 點擊Add New Key按鈕,添加key name爲key1的key"即在Ranger UI裏面創建key1這一步,究竟創建的是EZ key還是DEK?

參考前輩的文章和官網介紹,利用hadoop kms的方式來創建hdfs加密區,都會在命令行利用hadoop key創建一個key,keytool來生成另一個key,Ranger Admin UI實質上只是把hadoop key -create的操作接口放到了前端。這裏hadoop key create到底生成的是哪一個key?我在之前的文本中寫生成了EZ key,其實並不見得如此。因爲通過Ranger KMS(Apache對hadoop kms的封裝,hadoop kms將密鑰存儲在文件中,Ranger KMS將密鑰存儲在安全數據庫中,且提供可視化界面)只進行了一次生成key的操作。假設我們在UI生成的是EZ key,則意味着實際用於加解密數據的DEK是KMS默認生成的,那麼如果用戶對實際加密和解密的密鑰長度與算法有要求,該怎麼處理?

看了一些人寫的KMS文檔,把我搞得有點迷糊,無奈之下只好用Navicat打開PostGres數據庫查看數據庫中存放的密鑰。rangerkms庫下有ranger_keystore和ranger_masterkey兩張表,其中在keystore中,自己創建的key1赫然在列,而masterkey(EZ key)表中,是一個長度爲256的非用戶創建的密鑰。於是由此推測,UI創建的是DEK。以上推測暫時也不確定,如有人對此部分比較瞭解,希望能批評指正,謝謝。

參考:

https://blog.csdn.net/qq_35440040/article/details/78780473

http://www.sohu.com/a/159593316_465944

https://blog.csdn.net/qq_28205153/article/details/55798628

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章