HDFS透明加密 從入門到放棄

這篇文章需要一點hadoop框架的基礎,你最好需要知道什麼是hadoop,以及需要了解hadoop的文件系統hdfs。如果你不瞭解的話,我會嘗試用簡單的原理來解釋,希望能對你有用,這期內容可能有些燒腦,可以多讀幾遍,我也有學習不足的地方,歡迎提問。

目錄

一,什麼是HDFS

二,什麼是透明加密

三,用戶如何使用hdfs透明加密功能

四,hdfs如何實現透明加密


一,什麼是HDFS

hdfs全稱Hadoop分佈式文件系統,在網上搜索你一般會得到來自apache hadoop官方文檔的這樣一段話:

Hadoop分佈式文件系統(HDFS)被設計成適合運行在通用硬件(commodity hardware)上的分佈式文件系統。它和現有的分佈式文件系統有很多共同點。但同時,它和其他的分佈式文件系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。

我在之前的大數據框架中有提到,hadoop這個項目是源自Google公司的MapReduce論文實現而成,利用分佈式文件設計和mapreduce提高文件系統容錯性,框架可以自動處理節點故障,所以適合處理大數據的數據讀寫訪問。

 

hadoop工程中的主要子項目:

hadoop-hdfs-project: 分佈式文件系統,其中包括hadoop-hdfs-httpfs , hadoop-hdfs-nfs提供http網關服務和傳輸和hadoop-hdfs。

hadoop-common: 分離出hdfs和mapreduce的hadoop中的公共部分

hadoop-client: 客戶端接口

hadoop-MapReduce:提供MapReduce編程模型的實現,用於大規模數據處理。

hadoop-yarn: 負責管理集羣中的計算資源並將其用於調度用戶的應用程序

 

hdfs能做什麼?

1. 商用硬件

商用硬件的特點是流量極大而系統可靠性要求極高,一旦哪個節點崩了就可能造成大量損失,所以維護系統可靠性十分重要,而要實現如此流量大又可靠的文件系統服務投入的資金就很可觀了,所以hdfs的設計是讓你分佈式可以存儲在各個節點上,這些節點還可以廉價,通過hdfs的可靠性服務來自動處理節點故障。

2. 流式數據訪問

運行在HDFS上的應用和普通的應用不同,需要流式訪問它們的數據集。HDFS的設計中更多的考慮到了數據批處理,而不是用戶交互處理。比之數據訪問的低延遲問題,更關鍵的在於數據訪問的高吞吐量。POSIX標準設置的很多硬性約束對HDFS應用系統不是必需的。爲了提高數據的吞吐量,hdfs在一些關鍵方面對POSIX的語義做了一些修改。

3. 超大文件

普通文件讀寫遇到超大文件就會很頭疼,一旦遇到網絡問題,序列化過程或者文件磁盤問題就會中途斷掉,導致讀寫成功率很低,HDFS被調節以支持大文件存儲。採用一次寫入多次讀取的方式並且能提供整體上高的數據傳輸帶寬,在一個集羣裏擴展到數百個節點分佈式存儲數據文件。

hdfs在數據傳輸層面上也做了很多工作供了將它們自己移動到數據附近的接口,將計算移動到數據附近,比之將數據移動到應用所在顯然更好。不過相反需要低延遲,大量小文件和多用戶寫入的應用場景就不適合hdfs。


二,什麼是透明加密

然而本篇文章不是想講文件系統,而是要將透明加密,下邊進入正題。

透明加密技術是近年來針對企業文件保密需求應運而生的一種文件加密技術。它是指對使用者來說是無感知的。當使用者在打開或編輯指定文件時,系統將自動對未加密的文件進行加密,對已加密的文件自動解密。文件在硬盤上是密文,在內存中是明文。一旦離開使用環境,由於應用程序無法得到自動解密的服務而無法打開,從而起來保護文件內容的效果。

所以只要有數據的存儲就可以使用透明加密技術來保護用戶數據的安全。比較典型的一個場景是聊天通訊軟件,telegram是一個開源透明加密的通信軟件,我們在telegram上聊天,應用方並不知道我們的聊天內容,因爲系統會將文件進行端對端的加密解密,意思就是你發的消息在客戶端發送的時候已經被加密了,到達另一方的客戶端再解密,整個傳輸過程即使有人竊聽了消息,得到的也是加密過的密文,聽起來是不是很棒?不過相反如果有人談論的是違法內容,同樣也難以進行竊聽,可能導致的就是N號房事件,所以這也就是技術的兩面性吧。

所以具體應用場景每個廠商可能實現透明加密的方式會不同,你的聊天記錄是否泄露取決於企業應用實現的機制,不過要做區別的是這和你的搜索記錄是兩碼事,你的聊天記錄不一定被徵用,但你的搜索記錄是可以被記錄並用於大數據分析的,這個扯遠了有時間再說。

 

透明加密的分類:

應用程序級加密:這是最安全和最靈活的方法。應用程序對加密的內容有最終的控制,並且可以精確地反映用戶的要求。但是,編寫應用程序來做到這一點很困難。而且對於不支持加密的現有應用程序的客戶來說,可能就要更新換客戶端了。

數據庫級加密:類似於應用程序級加密的屬性。大多數數據庫供應商提供某種形式的加密。 但是,可能會有性能問題。一個例子是索引不能被加密。

文件系統級加密:該選項提供了高性能,應用程序透明性,並且通常易於部署。但是,它無法模擬某些應用程序級別的策略。例如,多租戶應用程序可能希望基於最終用戶進行加密。數據庫可能需要對存儲在單個文件中的每個列進行不同的加密設置。

磁盤級加密:易於部署和高性能,但也相當不靈活。只有真正防止物理盜竊的作用。


三,用戶如何使用hdfs透明加密功能

除了hdfs和client客戶端之外,還有一個重要的出場角色是KMS。

KMS(key management server)密鑰管理服務器,是一個在hadoop-common工程裏,獨立於hdfs的組件,它相當於一個管理密鑰的服務器有自己的dao層和後端數據庫,用來作爲發放透明加密密鑰的第三方。

 

透明加密步驟:

1. KMS生成可使用的密鑰

KMS的密鑰由特定權限的用戶管理,權限也是獨立於hdfs的,特權用戶登陸後通過

hadoop key create [keyName]

來創建密鑰,還可以通過-cipher 參數指定密鑰加密材料,-size參數指定位數,原理是通過jce框架的隨機數生成器通過默認的加密算法聲稱我們需要的密鑰,默認是AES/CTR方式/128bit

2. 初始化加密區

這一步需要hdfs的特殊用戶登陸操作,特殊用戶首先創建要加密的加密區

hadoop fs -mkdir /data-encrypt

把這一目錄的權限賦給普通用戶hive

hadoop fs -chown hive:hive /data-encrypt

然後使用生成的密鑰創建加密區

hdfs crypto -createZone -keyName [keyName] -path /data-encrypt

3. 用戶使用hdfs時,存到加密區的數據都會以數據塊形式存儲到hdfs節點的meta文件中,打開後是一堆亂碼,而客戶端用指令hadoop fs -cat還是get指令得到的都是明文,這就是端對端加密。我們可以通過以下方式得到加密文件的數據塊。

hdfs fsck /data-encrypt -files -blocks -locations 分別選擇加密/原文件查找存儲的數據塊

記下數據塊編號,進入hdfs存儲節點

cd /hadoop/data
find ./ -name blk_1073741827_1003*

就會找到加密後的數據塊文件。

 

過程詳解

在這個過程中,hdfs上的每個加密區都會與每個hdfs特殊用戶綁定的加密區密鑰相關聯(EK),這個Key在創建加密區的時候用hdfs crypto指令同時被指定。而這個由KMS頒發的E key並不會被文件加密直接使用,每個加密區中的文件會有其唯一的Data Encryption Key數據加密Key,簡稱就是DEK。同樣DEK不會被HDFS直接處理,取而代之的是,HDFS只處理經過加密的DEK,就是Encrypted Data Encryption Key,縮寫就是EDEK。

客戶端詢問KMS服務去解密EDEK,然後利用解密後得到的DEK去讀/寫數據。KMS利用存儲的EZ Key來解密EDEK得到DEK。
在客戶端向KMS服務請求時候,會有相關權限驗證,不符合要求的客戶端將不會得到解密好的DEK。而且KMS的權限驗證是獨立於HDFS的,是自身的一套權限驗證。這樣完成hdfs的一整套透明加密。

EK->KMS管理的加密密鑰

EDEK->hdfs能使用的作爲文件元數據的密鑰

DEK->數據加密使用的密鑰

EK加密DEK生成EDEK,DEK加密文件生成加密文件


四,hdfs如何實現透明加密

如下圖:

寫操作是:1->2->3a->4a

讀操作是:1->2->3b->4b->5b

在加密區域中寫新文件時,NameNode會要求KMS生成使用加密區域密鑰加密的新EDEK。然後將EDEK作爲文件元數據的一部分永久保存在NameNode上。

在讀取加密區域內的文件時,NameNode向客戶端提供文件的EDEK和用於加密EDEK的加密區密鑰版本。客戶端然後要求KMS解密EDEK,包括檢查客戶端是否有權訪問加密區密鑰版本。假設成功,客戶端使用DEK解密文件的內容

訪問加密的文件數據和元數據是由正常的HDFS文件系統權限控制的。這意味着如果HDFS受到攻擊(例如,通過未經授權訪問HDFS超級用戶帳戶),惡意用戶只能訪問密文和加密密鑰。但是,由於對加密區域密鑰的訪問由KMS和密鑰存儲區上單獨的一組權限控制,因此這不會構成安全威脅。

下邊是官文原話,還算易讀:

KMS實現了附加功能,可以創建和解密加密密鑰(EEK)。EEK的創建和解密完全在KMS上進行。重要的是,請求創建或解密EEK的客戶永遠不會處理EEK的加密密鑰。要創建一個新的EEK,KMS會生成一個新的隨機密鑰,並使用指定的密鑰對其進行加密,然後將EEK返回給客戶端。爲了解密EEK,KMS檢查用戶有權訪問加密密鑰,使用它來解密EEK,並返回解密的加密密鑰。

總結一下!就是由於hdfs一次寫多次讀的特性,加入kms機制多一層權限管理,使得hdfs完成端到端的透明加密,就是說hdfs只存儲加密文件和對應的EDEK,客戶端通過和KMS合作加解密文件,保護了用戶的數據安全。

 

參考文獻:

1. 官網: http://www.searchdoc.cn/hadoop/hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/TransparentEncryption.com.coder114.cn.html

2. AWS hadoop: https://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/emr-encryption-tdehdfs.html

3. AES加密:https://blog.csdn.net/qq_28205153/article/details/55798628

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