透明数据加密 (TDE)
Ozone 透明数据加密(TDE,Transparent Data Encryption)允许你对静态数据进行加密。TDE 在创建存储桶时在桶级别启用。要使用 TDE,管理员必须先配置一个密钥管理服务器(KMS,Key Management Server)。Ozone 可以与 Hadoop KMS 和 Ranger KMS 配合使用。需要通过 core-site.xml 配置文件将 KMS 的 URI 提供给 Ozone。
配置好 KMS 后,用户可以创建一个加密密钥,然后使用该密钥创建加密存储桶。写入加密存储桶的所有数据都会在服务端被透明地加密,而从存储桶中读取的数据会被透明地解密。
配置 TDE
搭建密钥管理服务器(KMS):
- Hadoop KMS: 请按照 Hadoop KMS 文档中的说明进行操作。
- Ranger KMS: 也可以使用 Ranger KMS。对于 Ranger KMS,除了
hadoop key命令行接口外,还可以通过 Ranger KMS 管理控制台或其 REST API 来管理加密密钥。
配置 Ozone: 在 Ozone 的
core-site.xml中添加以下属性:<property> <name>hadoop.security.key.provider.path</name> <value>kms://http@kms-host:9600/kms</value> </property>
将 kms://http@kms-host:9600/kms 替换为你的 KMS 的实际 URI。例如 kms://http@kms1.example.com:9600/kms
创建加密密钥
使用 hadoop key create 命令在已配置的 KMS 中创建加密密钥:
hadoop key create <key_name> [-size <key_bit_length>] [-cipher <cipher_suite>] [-description <description>]<key_name>:加密密钥的名称。-size <key_bit_length>(可选): 指定密钥的位长度。默认为 128 位(由hadoop.security.key.default.bitlength定义)。Ranger KMS 同时支持 128 位和 256 位。Hadoop KMS 也通常使用 128 位和 256 位密钥;具体版本支持情况请参阅 Hadoop KMS 文档。有效的 AES 密钥长度为 128、192 和 256 位。-cipher <cipher_suite>(可选): 指定密码套件。目前仅支持AES/CTR/NoPadding(默认值)。-description <description>(可选):密钥的描述信息。
例如:
hadoop key create enckey -size 256 -cipher AES/CTR/NoPadding -description "Encryption key for my_bucket"创建加密存储桶
使用 Ozone shell 的 ozone sh bucket create 命令,并配合 -k(或 --bucketkey)选项来指定加密密钥:
ozone sh bucket create --bucketkey <key_name> /<volume_name>/<bucket_name>例如:
ozone sh bucket create --bucketkey enckey /vol1/encrypted_bucket现在,所有写入 /vol1/encrypted_bucket 的数据都将被静态加密。只要客户端配置正确以使用该密钥,这种加密对最终用户来说就是完全透明的。
TDE 的性能优化
由于 Ozone 采用了 Hadoop 的加密库,因此适用于与 HDFS 加密类似的性能优化策略:
硬件加速:架构支持
下述基于 OpenSSL 的硬件加速目前仅在 x86 架构上受支持,暂不支持 ARM64 架构。
启用 AES-NI 硬件加速:
- 安装 OpenSSL 开发库:在大多数 Linux 发行版上,安装
openssl-devel(Debian/Ubuntu 上为libssl-dev)以提供libcrypto.so,Hadoop 本地库会利用它进行硬件加速加密。 - 使用 CPU 支持 AES-NI 指令集和 RDRAND 指令的服务器(大多数现代 Intel 和 AMD CPU 均支持)
- 安装 OpenSSL 开发库:在大多数 Linux 发行版上,安装
安装并配置本地库:
确保本地
libhadoop.so库已正确安装ozone debug checknative输出中 Hadoop 库应显示为 "true"
若要排查 Ozone Datanode 及应用程序中本地库加载的问题,请将其日志级别配置为 DEBUG。以下日志消息仅为示例,实际路径可能有所不同。下面的日志消息表示 libhadoop 本地库加载失败:
25/06/14 01:25:21 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library... 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path 25/06/14 01:25:21 DEBUG util.NativeCodeLoader: java.library.path=/opt/hadoop/lib/native:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 25/06/14 01:25:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable而以下日志消息表示 OpenSSL 库加载失败:
25/06/14 01:18:53 DEBUG crypto.OpensslCipher: Failed to load OpenSSL Cipher. java.lang.UnsatisfiedLinkError: Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)! at org.apache.hadoop.crypto.OpensslCipher.initIDs(Native Method) at org.apache.hadoop.crypto.OpensslCipher.<clinit>(OpensslCipher.java:89) at org.apache.hadoop.crypto.OpensslAesCtrCryptoCodec.<init>(OpensslAesCtrCryptoCodec.java:50)
验证硬件加速:
若要确认 AES-NI 是否正在被使用,请检查 OpenSSL 加速情况:
openssl speed -evp aes-256-ctr
从 S3G 使用透明数据加密
Ozone 的 S3 网关(S3G)允许你访问已加密的存储桶。不过需要注意的是,Ozone 并不像 AWS S3 那样支持 S3-SSE(服务端加密)或 S3-CSE(客户端加密)。 话虽如此,Ozone S3 存储桶可以使用 Ranger KMS 或 Hadoop KMS 进行加密,从而提供与 S3-SSE 客户端提供密钥(SSE-C)类似的保证。
在创建将通过 S3G 访问的加密存储桶时:
在
/s3v卷下创建存储桶:/s3v卷是 S3 存储桶的默认卷。ozone sh bucket create --bucketkey <key_name> /s3v/<bucket_name> --layout=OBJECT_STORE或者,在其他位置创建加密存储桶并将其链接过来:
ozone sh bucket create --bucketkey <key_name> /<volume_name>/<bucket_name> --layout=OBJECT_STORE ozone sh bucket link /<volume_name>/<bucket_name> /s3v/<link_name>
注意 1:无法通过 S3 API 创建加密桶,必须使用如上所示的 Ozone shell 命令创建。创建加密桶之后,通过 s3g 添加到该桶中的所有键都会被加密。
注意 2:上述示例中指定了 --layout=OBJECT_STORE,以保证与 S3 的完全兼容(该值本就是 --layout 参数的默认值,这里显式写出只是为了强调这一点)。
使用 OBJECT_STORE 类型创建的桶将完全无法通过 HCFS(ofs 或 o3fs)访问,此类访问会被拒绝。例如:
$ ozone fs -ls ofs://ozone1/s3v/encryptedbucket/
-ls: Bucket: encryptedbucket has layout: OBJECT_STORE, which does not support file system semantics. Bucket Layout must be FILE_SYSTEM_OPTIMIZED or LEGACY.$ ozone fs -ls o3fs://encryptedbucket.s3v.ozone1/
22/02/07 00:00:00 WARN fs.FileSystem: Failed to initialize fileystem o3fs://encryptedbucket.s3v.ozone1/: java.lang.IllegalArgumentException: Bucket: encryptedbucket has layout: OBJECT_STORE, which does not support file system semantics. Bucket Layout must be FILE_SYSTEM_OPTIMIZED or LEGACY.
-ls: Bucket: encryptedbucket has layout: OBJECT_STORE, which does not support file system semantics. Bucket Layout must be FILE_SYSTEM_OPTIMIZED or LEGACY.如果希望同一个存储桶同时可通过 S3G 和 HCFS(ofs 与 o3fs)访问,请改用 --layout=FILE_SYSTEM_OPTIMIZED。
不过,对于采用 FILE_SYSTEM_OPTIMIZED 布局的存储桶,某些不规范的 S3 键名可能会被拒绝或被规范化,这可能并非期望的结果。
在访问启用了 S3G 的加密存储桶时:
需要将以下三项配置添加到 kms-site.xml 中,以允许 S3Gateway 主体作为其他用户的代理。在此示例中,假设 ozone.s3g.kerberos.principal 为 s3g。
<property>
<name>hadoop.kms.proxyuser.s3g.users</name>
<value>user1,user2,user3</value>
<description>
Specifies the list of users that the S3 Gateway (`s3g`) is allowed to impersonate when interacting with the KMS. Use `*` to allow all users.
</description>
</property>
<property>
<name>hadoop.kms.proxyuser.s3g.groups</name>
<value>group1,group2,group3</value>
<description>
Specifies the list of groups whose members `s3g` is allowed to impersonate when making requests to the KMS. Use `*` to allow all groups.
</description>
</property>
<property>
<name>hadoop.kms.proxyuser.s3g.hosts</name>
<value>s3g-host1.com</value>
<description>
Specifies the hostnames or IPs from which `s3g` is permitted to send proxy requests to the KMS. Use `*` to allow all hosts.
</description>
</property>KMS 授权
密钥管理服务器(KMS)可能会强制执行密钥访问授权。Hadoop KMS 支持 ACL(访问控制列表)以实现细粒度的权限控制,而 Ranger KMS 支持基于 Ranger 策略管理加密密钥。 请根据所使用的 KMS 类型,确保相应用户拥有必要的权限。
例如,当使用 Ranger KMS 进行授权时,若要允许用户 om(Ozone Manager 用户)访问密钥 enckey,并允许用户 hdfs(典型的 HDFS 服务用户)管理密钥,Ranger KMS 中的策略可能如下:
om用户(或运行 Ozone Manager 的用户)的策略:- 资源:
keyname=enckey - 权限:
DECRYPT_EEK(解密加密密钥)
- 资源:
S3 Gateway 代理用户的策略(例如
ozone.s3g.kerberos.principal中指定的用户,通常为s3g):- 资源:
keyname=enckey(或针对 S3 存储桶的特定密钥) - 权限:
DECRYPT_EEK
- 资源:
管理类用户的策略(例如
hdfs或某个密钥管理组):- 资源:
keyname=*(或特定密钥) - 权限:
CREATE_KEY、DELETE_KEY、GET_KEYS、ROLL_NEW_VERSION
- 资源:
如果使用的是 Ranger KMS,请参阅 Ranger 文档以获取配置 KMS 策略的详细说明。对于 Hadoop KMS,请查阅其 Hadoop KMS 文档 来管理 ACL。
延伸参考
- 如需了解透明数据加密的更多背景知识,可参阅 HDFS 中的透明加密文档。
- 有关 Hadoop KMS 的详细信息,请参阅 Hadoop KMS 文档。
- 关于 OpenSSL 加密性能调优,请参阅 Intel 的 AES-NI 优化指南。
评论
登录后参与评论
KnowForge