使用 Apache Ranger
Ranger 与 Kerberos 都是 Hadoop 下与数据安全密不可分的组件,简而言之,Ranger 提供了创建“哪些用户能够访问哪些文件”的安全规则的能力,而 Kerberos 则解决了用户认证的问题。二者可以搭配使用以获得最佳的数据安全性,也可以单独启用来满足特定的使用需要。
HDFS 默认使用类似于 POSIX 文件系统权限管理的方式管理文件权限。另外也提供了对 POSIX ACL 的支持,为特定的指定用户或指定组提供更细化的规则来增强文件权限。Apache Ranger 为 HDFS 提供了类似于 POSIX ACL 的能力,可以方便地使用 Ranger Admin Web UI 对整个 Hadoop 生态中如 HDFS、Hive 等进行细粒度的数据访问控制。
HDFS 中的 Ranger
HDFS NameNode 服务通过 Ranger HDFS Plugin 定时从 Ranger Admin 服务获得用户所配置的规则并存储在本地磁盘和内存中,后续 HDFS 客户端的请求会通过 Ranger HDFS Plugin 使用这些规则进行验证。
如果开启 AuditLog,Ranger HDFS Plugin 则会将它们写入配置的 AuditLog 存储,以供用户通过 Ranger Admin 查询。
JuiceFS 中的 Ranger
JuiceFS>=4.8 的 Java SDK 开始支持 Ranger,暂不支持 audit 功能。
由于 JuiceFS 元数据服务是 SaaS 服务,不能直接连接客户内网所布置的 Ranger Admin 服务,所以在实现上和 HDFS 有所不同。
JuiceFS 与 Ranger Admin 的通信是由部署在客户网络的 JuiceFS Hadoop SDK 客户端去完成的。JuiceFS 客户端会定期从 Ranger Admin 读取最新的规则,并存入 JuiceFS。为了避免很多客户端同时访问 Ranger Admin 造成很大压力,JuiceFS 会任意选出一个客户端和 Ranger Admin 通信,其它客户端只需要从 JuiceFS 读取更新规则即可。规则的验证由 JuiceFS 客户端去完成。
由于大数据系统可能会同时存在很多 JuiceFS 客户端,如果每个客户端都同时写入 AuditLog 存储,可能会带来比较大的压力。因此暂时没有实现 AuditLog 功能。
开启 Ranger 支持
-
准备工作
如果 Ranger 尚未部署,请先部署 Ranger Admin,参考:Apache Ranger
-
在 JuiceFS 控制台开启 Ranger 支持
在文件系统的设置页面启用 Ranger,并填写 Ranger Admin 地址 和 Ranger HDFS 服务名称:
注意,如果 Ranger 的
ranger.spnego.kerberos.principal
配置的值第二部分是机器hostname
,则这里 Ranger Admin 地址也必须是hostname
,不能使用 IP 地址。Ranger HDFS 服务名称可以在 Ranger Admin UI 的 Service Manager 中 HDFS service 找到:
-
可选:配置 Kerberos
开启 Kerberos 会导致业务使用的 JuiceFS 客户端无法下载 Ranger 安全规则,你需要在 Ranger Admin Web UI - HDFS Service 配置
policy.download.auth.users
和tag.download.auth.users
来为指定的用户赋予下载安全规则的权限,多个用户用逗号','隔开。配置完成以后,你还需要使用该用户来更新 JuiceFS 中保存的规则。
更新安全规则文件的命令如下(建议配置成定时任务自动更新),注意将
{PRINCIPAL}
替换为policy.download.auth.users
配置的用户:hadoop jar juicefs-hadoop.jar com.juicefs.Main \
ranger \
--fs jfs://{VOL_NAME}/ \
--keytab /path/to/keytab \
--principal {PRINCIPAL}
验证
通过 Ranger Admin UI 在 HDFS Service 内为 user test
添加一条 Deny Condition Policy,Resource Path 设置在根目录 /
:
运行下方命令,检验规则是否生效:
# 非 kerberos 环境
HADOOP_USER_NAME=test hadoop fs -ls jfs://vol/
ls: Permission denied: user=test, access=READ_EXECUTE, path="/"
# kerberos 环境
kinit test
hadoop fs -ls jfs://vol/
ls: Permission denied: user=test, access=READ_EXECUTE, path="/"