CDP集群安全指南-静态数据加密
[一]静态数据加密的架构
CDP 支持两种加密组件,这些组件可以组合成独特的解决方案。在选择密钥管理系统(KMS)时,您需要决定哪些组件能够满足企业的密钥管理和加密需求。
CDP 加密组件
以下是 Cloudera 用于静态数据加密的组件描述:
-
Ranger Key Management System (KMS)
Ranger 扩展了 Hadoop 原生 KMS 的功能,允许将密钥存储在安全的数据库中。它是一个支持 HDFS TDE(透明数据加密)的密码密钥管理服务,但并非通用密钥管理系统。与 Hadoop KMS 不同,Hadoop KMS 将密钥存储在基于文件的 Java Keystore 中,仅能通过 KeyProvider API 访问。 -
Navigator Encrypt
提供透明的静态数据加密和保护,无需对应用程序进行更改。
CDP 加密解决方案
您可以通过以下任意解决方案部署加密组件来实现静态数据加密:
-
仅使用 Ranger KMS(本文演示使用这种方式)
- 仅由 Ranger KMS 和提供密钥存储的后端数据库组成。
- Ranger KMS 提供企业级密钥管理。
-
Ranger KMS + HSM(硬件安全模块)
- 包含 Ranger KMS(带数据库)和与后端硬件安全模块(HSM)的集成。
- Ranger KMS 提供企业级密钥管理。
- HSM 提供加密区密钥保护,仅存储加密主密钥。
[二]静态数据加密的要求
熵要求
加密操作依赖熵来确保随机性,而随机性是防止攻击者预测或破解加密过程的关键。如果随机数缺乏足够的熵,整个加密系统的安全性就会受到威胁。因此,熵在加密中起着至关重要的作用。您可以通过运行以下命令来检查 Linux 系统上的可用熵:
cat /proc/sys/kernel/random/entropy_avail
该命令的输出会显示当前可用的熵值。建议多次检查熵值,以确定系统熵池的状态。如果熵值持续较低(500 或更少),则需要通过安装 rng-tools
并启动 rngd
服务来增加熵值。
【提醒】由于最近的 Linux 内核更改,内核报告的
entropy_avail
值将始终为 256。如果您更改了“主机熵阈值”(Host Entropy Thresholds)的默认设置,这可能会导致错误警报的触发。因此,您需要将这些阈值更改为反映entropy_avail
为 256 的实际情况。
Ranger KMS 安全需求
最低推荐硬件配置如下:
- 处理器:1 GHz 64 位四核处理器
- 内存:8 GB RAM
- 存储:20 GB 存储空间,建议使用中等至高性能的磁盘驱动器
有关支持的 Linux 发行版的信息,请参阅《Cloudera Navigator Encryption 产品兼容性矩阵》。
Ranger KMS 的工作负载对 CPU 要求较高。Cloudera 建议使用与您的 NameNode 主机相当性能的机器,特别是配备支持 AES-NI 的 Intel 处理器,以实现最佳性能。此外,Cloudera 强烈建议为 HDFS 和 Ranger 服务启用 TLS,以防止在 KMS 和 HDFS 数据节点之间传输明文密钥数据。
[三]安装配置Ranger KMS
1-添加服务
2-选择依赖
3-分配角色
4-数据库设置
CREATE DATABASE rangerkms DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'rangerkms'@'%' IDENTIFIED WITH mysql_native_password BY '!edc4rfVrangerkms';
GRANT ALL PRIVILEGES ON rangerkms.* TO 'rangerkms'@'%';
5-审核更改
6-命令详细信息
7-汇总
8-重启集群并部署客户端配置
【重要提醒】Ranger 为 Ranger 和 Ranger KMS 使用了独立的管理员用户。
- Ranger 管理员用户负责管理 Ranger 的访问策略。
- Ranger KMS 管理员用户(默认是
keyadmin
)负责管理 Ranger KMS 的访问策略和加密密钥,并可以访问与 Ranger 管理员用户不同的一组用户界面功能。为 Ranger 和 Ranger KMS 使用独立的管理员账户,可以将加密工作(如加密密钥和策略)与集群管理和访问策略管理分离开来。
[四]-管理一个加密区
1-测试加密优化是否有效
[root@cdp73-1 lib]# hadoop checknative
24/12/31 01:47:56 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
24/12/31 01:47:56 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
24/12/31 01:47:56 WARN erasurecode.ErasureCodeNative: ISA-L support is not available in your platform... using builtin-java codec where applicable
Native library checking:
hadoop: true /home/opt/cloudera/parcels/CDH-7.3.1-1.cdh7.3.1.p0.60371244/lib/hadoop/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
zstd : true /home/opt/cloudera/parcels/CDH-7.3.1-1.cdh7.3.1.p0.60371244/lib/hadoop/lib/native/libzstd.so.1
bzip2: true /lib64/libbz2.so.1
openssl: true /lib64/libcrypto.so
ISA-L: false libhadoop was built without ISA-L support
[root@cdp73-1 lib]#
如果您在 openssl
行中看到 true
,说明 Hadoop 已检测到正确版本的 libcrypto.so
,加密优化将正常工作。如果您在该行中看到 false
,说明您没有安装正确的版本。
2-创建加密用的key
[root@cdp73-1 lib]# kinit keyadmin
Password for keyadmin@BIGDATACDP.COM:
Warning: Your password will expire in less than one hour on Mon 13 Sep 2100 10:48:05 PM EDT
[root@cdp73-1 lib]# hadoop key create keytrustee_test
keytrustee_test has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@3d5c822d has been updated.
[root@cdp73-1 lib]# hadoop key list
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@2f8dad04
keytrustee_test
[root@cdp73-1 lib]#
3-创建加密区
[root@cdp73-1 lib]# kinit hdfs
Password for hdfs@BIGDATACDP.COM:
Warning: Your password will expire in less than one hour on Mon 13 Sep 2100 10:48:05 PM EDT
[root@cdp73-1 lib]# hadoop fs -mkdir /encryption_zone
[root@cdp73-1 lib]# hdfs crypto -createZone -keyName keytrustee_test -path /encryption_zone
Added encryption zone /encryption_zone
[root@cdp73-1 lib]# hdfs crypto -listZones
/encryption_zone keytrustee_test
[root@cdp73-1 lib]#
这样任何上传到hdfs/encryption_zone目录下的文件都是被加密的状态
【重要提醒】默认情况下,
distcp
使用文件系统提供的校验和(checksum)来验证数据是否成功复制到目标位置。然而,当从加密位置复制时,文件系统的校验和将不匹配,因为底层块数据不同。这无论目标位置是否加密,情况都相同。在这种情况下,您可以指定-skipcrccheck
和-update
标志以跳过校验和验证。使用-skipcrccheck
时,distcp
会在每个文件复制完成后,通过文件大小比较来检查文件完整性。