HDFS透明加密(Transparent Data Encryption, TDE)是Hadoop原生支持的高級加密功能,通過**加密區域(Encryption Zones)**實現對指定目錄下數據的自動加密(寫入時加密、讀取時解密),無需修改應用程序代碼,是生產環境最常用的加密方案。
hdfs
用戶對密鑰庫路徑有讀寫權限。修改Hadoop核心配置文件(core-site.xml
和hdfs-site.xml
),添加以下關鍵配置:
core-site.xml
<property>
<name>hadoop.security.encryption.key.provider.path</name>
<value>hdfs:///etc/hadoop/conf/encryption.keystore.jceks</value> <!-- 密鑰庫路徑(JCEKS格式) -->
</property>
<property>
<name>hadoop.security.encryption.region.size</name>
<value>10485760</value> <!-- 加密區域塊大?。?0MB,默認值) -->
</property>
hdfs-site.xml
<property>
<name>dfs.encrypt.data.transfer</name>
<value>true</value> <!-- 啟用數據傳輸加密(可選,增強傳輸層安全) -->
</property>
<property>
<name>dfs.encrypt.data.transfer.algorithm</name>
<value>AES_CBC</value> <!-- 傳輸加密算法(默認AES_CBC) -->
</property>
<property>
<name>dfs.encrypt.data.transfer.key.length</name>
<value>256</value> <!-- 密鑰長度(256位,符合合規要求) -->
</property>
<property>
<name>dfs.encryption.zone.enabled</name>
<value>true</value> <!-- 啟用加密區域功能 -->
</property>
配置完成后,重啟HDFS集群使參數生效:
sudo systemctl restart hadoop-hdfs-namenode
sudo systemctl restart hadoop-hdfs-datanode
加密密鑰是TDE的核心,需通過hdfs crypto
命令創建并存儲在安全位置(如HDFS的/etc/hadoop/conf/
目錄):
# 創建JCEKS格式密鑰庫(若不存在)
keytool -importkeystore -srckeystore /path/to/keystore.jceks -destkeystore /path/to/keystore.jceks -deststoretype jceks
# 生成AES-256加密密鑰(名稱需唯一,如"myZoneKey")
hdfs crypto -createKey -keyName myZoneKey -providerURI hdfs:///etc/hadoop/conf/encryption.keystore.jceks
注意:密鑰庫密碼需妥善保管(如通過KMS或離線介質存儲),丟失將無法恢復加密數據。
選擇需要加密的HDFS目錄(如/user/hdfs/encrypted_data
),通過hdfs crypto
命令創建加密區域并關聯密鑰:
# 創建加密目錄
hdfs dfs -mkdir -p /user/hdfs/encrypted_data
# 將目錄標記為加密區域,并關聯密鑰"myZoneKey"
hdfs crypto -createZone -keyName myZoneKey -path /user/hdfs/encrypted_data
將現有明文數據移動至加密區域,移動后數據會自動加密(存儲為密文):
hdfs dfs -mv /user/hdfs/plain_data/* /user/hdfs/encrypted_data/
hdfs dfs -put /local/plain_file.txt /user/hdfs/encrypted_data/
hdfs dfs -cat /user/hdfs/encrypted_data/plain_file.txt
hdfs crypto -listZones
若不想使用透明加密,可通過配置HDFS客戶端,在客戶端本地完成數據加密后再寫入HDFS,讀取時由客戶端解密。適用于需要端到端加密的場景(如數據離開客戶端后無需HDFS解密)。
修改客戶端core-site.xml
文件,添加以下配置:
<property>
<name>dfs.encrypt.data.transfer</name>
<value>true</value> <!-- 啟用客戶端傳輸加密 -->
</property>
<property>
<name>dfs.encryption.key.provider.path</name>
<value>/local/path/to/client_keystore.jceks</value> <!-- 客戶端本地密鑰庫路徑 -->
</property>
客戶端寫入數據時,會自動加密;讀取時自動解密,無需修改HDFS集群配置。
若HDFS原生加密無法滿足需求(如需要文件系統級加密),可使用第三方工具(如EncFS、eCryptfs)實現數據加密。這類工具通過掛載加密目錄的方式,將HDFS目錄映射為本地加密目錄,數據在寫入本地目錄時加密,讀取時解密。
sudo apt-get install encfs # Debian/Ubuntu
sudo yum install encfs # CentOS/RHEL
mkdir /local/encrypted_hdfs /local/decrypted_hdfs
encfs /local/encrypted_hdfs /local/decrypted_hdfs
/local/decrypted_hdfs
(自動加密并同步至HDFS);/local/decrypted_hdfs
讀取數據(自動解密)。dfs.encrypt.data.transfer
參數)。