HDFS提供了多层次的数据安全保护机制,包括回收站、目录保护、数据加密传输等功能,确保数据的机密性和完整性。
配置HDFS回收站
HDFS回收站机制是一种数据保护功能。当用户删除文件时,文件不会被立即永久删除,而是被移动到回收站目录(通常是 /user/<用户名>/.Trash/),并在设定的保留时间(如 fs.trash.interval)后才会被真正清理。
优点
防止误删,提升数据安全性
用户或管理员误操作删除关键文件时,可以快速从回收站恢复,避免数据丢失。这是回收站最核心的价值。
用户自助恢复,减少管理员介入
普通用户不需要管理员权限即可自行恢复被删除的文件,提高效率,降低管理成本。
支持保留期可配置,灵活适应不同场景
管理员可以通过fs.trash.interval和 fs.trash.checkpoint.interval 控制文件和目录的保留时长,满足不同业务对数据留存周期的要求。
缺点
占用额外存储空间
回收站中的文件仍然占用实际的HDFS 存储空间,直到过期后被清理。对于存储资源紧张的环境,回收站可能造成不必要的空间浪费,尤其当频繁删除大量数据时。
增加NameNode 元数据压力
回收站中的文件也需要在NameNode 中记录元数据(如文件块信息),大量未被清理的回收站文件会增加 NameNode 的内存开销,影响NameNode性能。
配置参考
| 配置参数 | 默认值 | 描述 |
|---|---|---|
| fs.trash.interval | 10080 | 回收站中数据保留时间(分钟)。建议合理配置,以减少因误删导致的数据丢失风险。 |
| fs.trash.checkpoint.interval | 360 | 回收站检查点间隔(分钟)。应小于等于“fs.trash.interval”参数的值。 |
修改配置参数后,需要重启NameNode实例。
配置HDFS目录保护
该机制主要用于保护HDFS目录等关键路径,防止误删操作导致集群数据丢失。当 NameNode 收到删除(delete)或重命名(rename)请求时,检查目标路径是否命中fs.protected.directories配置。当命中保护规则后,若目录下不为空,删除或重命名操作会失败。即使拥有超级用户权限也无法直接删除操作,需移除该目录的保护配置或当保护目录下为空时才允许删除。
配置参考
| 配置参数 | 默认值 | 描述 |
|---|---|---|
| fs.protected.directories | - | 受保护的目录路径;默认为空;多个目录可使用”,”分隔。 |
| dfs.protected.subdirectories.enable | false | 保护目录下的子目录是否也受保护。 |
修改配置参数后,需要重启NameNode实例。
配置RPC安全增强
HDFS支持对RPC通信进行加密,保护客户端与HDFS服务端之间的数据传输。RPC加密通过设置hadoop.rpc.protection配置项来启用。这是Hadoop RPC 通信的核心安全配置项,定义了 RPC 连接的数据保护级别(认证 + 完整性 + 加密)。它同时作用于 HDFS 和 YARN 的 RPC 通道。
hadoop.rpc.protection配置值参考
| 配置值 | 描述 | 适用场景 |
|---|---|---|
| authentication | 仅认证;只验证通信双方身份,不保护数据内容。 | 内网可信环境,对性能要求极高,数据本身不敏感。 |
| integrity | 认证+ 完整性;在认证基础上,保证数据在传输过程中不被篡改,但不加密内容。 | 内网环境,需要防止数据被篡改(如防止恶意节点伪造RPC 响应),但数据内容不涉及敏感信息、无需加密。 |
| privacy | 认证+ 完整性 + 加密;最高保护级别,在认证和完整性基础上,对数据全文加密。 | 跨不可信网络传输、数据含敏感信息(如用户数据路径、权限信息)。 |
修改配置参数后,需要重启HDFS实例。
配置HDFS块数据加密传输
HDFS数据传输加密确保客户端与DataNode之间的数据传输安全。
传输加密机制
客户端从NameNode获取数据块位置和加密信息。
客户端与DataNode建立加密连接(TCP + SSL)。
数据在传输过程中被加密保护。
DataNode和客户端使用相同的密钥进行加解密。
优点
保障数据传输机密性(核心价值)。
所有在网络上传输的HDFS 数据块都会被加密,防止通过网络嗅探或中间人攻击窃取数据。
对上层应用透明。
加密和解密过程由HDFS 客户端和 DataNode 在底层自动完成。Hadoop 生态组件(如 Hive、Spark、MapReduce)和用户代码无需任何修改即可受益。
缺点
显著的性能开销(核心挑战)
CPU 负载增加:加密/解密是计算密集型操作。启用后,HDFS 客户端和 DataNode 的 CPU 使用率会显著上升,尤其是在高吞吐量的读/写场景下。
延迟增加:每次数据传输都需要额外的加密/解密步骤,会引入微秒到毫秒级的延迟。
吞吐量下降:在CPU 成为瓶颈的情况下,整体 I/O 吞吐量可能会下降 20%-50% 或更多,具体取决于硬件、算法和并发量。
仅保护传输中的数据,不保护静态数据。
配置参考
| 配置参数 | 默认值 | 描述 |
|---|---|---|
| dfs.encrypt.data.transfer | false | 是否应该对从HDFS 读取/写入的实际块数据进行传输加密。这个只需要在 NameNode和DataNode上设置,客户端会自动推断。 |
| dfs.encrypt.data.transfer.algorithm | - | 这个值可以设置为“3des” 或 “rc4”。如果没有设置,那么系统上配置的 JCE 默认值会被使用(通常是 3DES)。大家普遍认为 3DES 的加密更安全,但 RC4 要快得多。需要注意的是,如果客户端和服务器都支持 AES,那么这个加密算法只会用于最初传输 AES 的密钥。(参见 dfs.encrypt.data.transfer.cipher.suites.)。 |
| dfs.encrypt.data.transfer.cipher.suites | - | 这个值可以未定义,也可以是AES/CTR/NoPadding。如果定义了,那么 dfs.encrypt.data.transfer 会使用指定的密码套件进行数据加密。如果没有定义,那么只会使用 dfs.encrypt.data.transfer.algorithm 中指定的算法。默认情况下,这个属性是未定义的。 |
| dfs.encrypt.data.transfer.cipher.key.bitlength | 128 | dfsclient 和 datanode 协商的加密密钥位长度。这个值可以设置为 128、192 或 256。 |