文档中心>对象存储>数据湖存储>数据加速器 GooseFS>数据安全>使用 Apache Ranger 控制 GooseFS 的访问权限

使用 Apache Ranger 控制 GooseFS 的访问权限

最近更新时间:2023-09-21 20:29:27

我的收藏

概述

Apache Ranger 是大数据生态系统中用于控制访问权限的一个标准鉴权组件,GooseFS 作为大数据和数据湖场景下的加速存储系统,也已经支持接入 Apache Ranger 的统一鉴权平台中,本文将介绍使用 Apache Ranger 控制 GooseFS 的资源访问权限。

优势

GooseFS 作为一款云原生加速存储系统,在 Apache Ranger 支持上已经做到了与 HDFS 近乎一致的访问控制行为。因此,原先使用 HDFS 的大数据用户可以非常轻松地迁移到 GooseFS 上来,并且直接复用 HDFS 的 Ranger 权限策略,即可获得一致的使用体验。
GooseFS with Ranger 相比 HDFS with Ranger 的鉴权架构,还额外提供了 Ranger + 原生 ACL 的联合鉴权选项,在 Ranger 鉴权失效时,还可选择使用原生 ACL 鉴权,可解决一些 Ranger 鉴权策略配置不完善的问题。

GooseFS with Ranger 的鉴权架构




为了支持将 GooseFS 集成到 Ranger 鉴权平台中,我们开发了 GooseFS Ranger Plugin,它同时部署在 GooseFS Master 节点和 Ranger Admin 侧。负责完成如下工作:
GooseFS Master 节点侧:
提供 Authorizer 接口,为 GooseFS Master 上的每一次元数据请求提供鉴权结果。
连接 Ranger Admin 获取用户配置的鉴权策略。
Ranger Admin 侧:
为 Ranger Admin 提供 GooseFS 的资源查找(resource lookup)的能力。
提供配置校验的能力。

开始部署

准备工作

在开始使用前,需确保环境中已部署并配置了 Ranger 相关的组件(即包括:Ranger Admin 和 Ranger UserSync),并且确保 Ranger 的 WebUI 可以正常打开和使用。

部署组件

在 Ranger Admin 侧部署 GooseFS Ranger Plugin 并注册对应服务

说明
单击 此处 下载 GooseFS Ranger Plugin。
部署步骤如下:
1. 在 Ranger 服务定义目录下新建 GooseFS 的目录(注意,目录权限至少保证 x 与 r 的权限)。
1.1 如果使用的是腾讯云 EMR 集群,则 Ranger 的服务定义目录在:/usr/local/service/ranger/ews/webapp/WEB-INF/classes/ranger-plugins
1.2 如果是自建 Hadoop 集群,则可以通过在 ranger 目录下查找 hdfs 等已经接入到 ranger 服务的组件,查找目录位置。
ranger 的服务定义目录


2. 在 GooseFS 的目录下,放入 goosefs-ranger-plugin-${version}.jar 和 ranger-servicedef-goosefs.json,并且具备读权限。
3. 重启 Ranger 服务。
4. 在 Ranger 上,按照如下命令,注册 GooseFS Service。
# 生成服务,需要传入 Ranger 管理员的账号和密码,以及 Ranger 的服务地址
# 对于腾讯云 EMR 集群,管理员用户是 root,密码是构建 EMR 集群时设置的 root 密码,ranger 服务的 IP 就是 EMR 服务的 Master IP
adminUser=root
adminPasswd=xxxx

rangerServerAddr=10.0.0.1:6080

curl -v -u${adminUser}:${adminPasswd} -X POST -H "Accept:application/json" -H "Content-Type:application/json" -d @./ranger-servicedef-goosefs.json http://${rangerServerAddr}/service/plugins/definitions

# 服务注册成功后,会返回一个服务 ID,请务必记录下这个ID
# 如果要删除 GooseFS 的服务,则传入刚刚返回的服务 ID,执行如下命令即可:
serviceId=104
curl -v -u${adminUser}:${adminPasswd} -X DELETE -H "Accept:application/json" -H "Content-Type:application/json" http://${rangerServerAddr}/service/plugins/definitions/${serviceId}
5. 创建成功后,在 Ranger 的 Web 控制台上即可看到 GooseFS 相关的服务:
ranger 的 web 控制台


6. 在 GooseFS 服务侧单击【+】,定义 goosefs 服务实例。
ranger 的 web 控制台上定义 goosefs 服务实例


7. 单击新生成的 goosefs 服务实例,即可添加鉴权 policy。
添加鉴权 policy



在 GooseFS Master 侧部署 GooseFS Ranger Plugin 并配置启用 Ranger 鉴权

1. 将 goosefs-ranger-plugin-${version}.jar 放入 ${GOOSEFS_HOME}/lib 路径下,并且至少具备读权限。
2. 将 ranger-goosefs-audit.xml、ranger-goosefs-security.xml 以及 ranger-policymgr-ssl.xml 三个文件放入\\${GOOSEFS_HOME}/conf路径下,并分别填写其必要配置:
ranger-goosefs-security.xml:
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<property>
<name>ranger.plugin.goosefs.service.name</name>
<value>goosefs</value>
</property>

<property>
<name>ranger.plugin.goosefs.policy.source.impl</name>
<value>org.apache.ranger.admin.client.RangerAdminRESTClient</value>
</property>

<property>
<name>ranger.plugin.goosefs.policy.rest.url</name>
<value>http://10.0.0.1:6080</value>
</property>

<property>
<name>ranger.plugin.goosefs.policy.pollIntervalMs</name>
<value>30000</value>
</property>

<property>
<name>ranger.plugin.goosefs.policy.rest.client.connection.timeoutMs</name>
<value>1200</value>
</property>

<property>
<name>ranger.plugin.goosefs.policy.rest.client.read.timeoutMs</name>
<value>30000</value>
</property>
</configuration>
ranger-goosefs-audit.xml(不开启审计,可不配置):
<configuration>
<property>
<name>xasecure.audit.is.enabled</name>
<value>false</value>
</property>

<property>
<name>xasecure.audit.db.is.async</name>
<value>true</value>
</property>

<property>
<name>xasecure.audit.db.async.max.queue.size</name>
<value>10240</value>
</property>

<property>
<name>xasecure.audit.db.async.max.flush.interval.ms</name>
<value>30000</value>
</property>

<property>
<name>xasecure.audit.db.batch.size</name>
<value>100</value>
</property>

<property>
<name>xasecure.audit.jpa.javax.persistence.jdbc.url</name>
<value>jdbc:mysql://localhost:3306/ranger_audit</value>
</property>

<property>
<name>xasecure.audit.jpa.javax.persistence.jdbc.user</name>
<value>rangerLogger</value>
</property>

<property>
<name>xasecure.audit.jpa.javax.persistence.jdbc.password</name>
<value>none</value>
</property>

<property>
<name>xasecure.audit.jpa.javax.persistence.jdbc.driver</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<property>
<name>xasecure.audit.credential.provider.file</name>
<value>jceks://file/etc/ranger/hadoopdev/auditcred.jceks</value>
</property>

<property>
<name>xasecure.audit.hdfs.is.enabled</name>
<value>true</value>
</property>

<property>
<name>xasecure.audit.hdfs.is.async</name>
<value>true</value>
</property>

<property>
<name>xasecure.audit.hdfs.async.max.queue.size</name>
<value>1048576</value>
</property>

<property>
<name>xasecure.audit.hdfs.async.max.flush.interval.ms</name>
<value>30000</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.encoding</name>
<value></value>
</property>

<!-- hdfs audit provider config-->
<property>
<name>xasecure.audit.hdfs.config.destination.directory</name>
<value>hdfs://NAMENODE_HOST:8020/ranger/audit/</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.destination.file</name>
<value>%hostname%-audit.log</value>
</property>

<proeprty>
<name>xasecure.audit.hdfs.config.destination.flush.interval.seconds</name>
<value>900</value>
</proeprty>

<property>
<name>xasecure.audit.hdfs.config.destination.rollover.interval.seconds</name>
<value>86400</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.destination.open.retry.interval.seconds</name>
<value>60</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.buffer.directory</name>
<value>/var/log/hadoop/%app-type%/audit</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.buffer.file</name>
<value>%time:yyyyMMdd-HHmm.ss%.log</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.buffer.file.buffer.size.bytes</name>
<value>8192</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.buffer.flush.interval.seconds</name>
<value>60</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.buffer.rollover.interval.seconds</name>
<value>600</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.archive.directory</name>
<value>/var/log/hadoop/%app-type%/audit/archive</value>
</property>

<property>
<name>xasecure.audit.hdfs.config.local.archive.max.file.count</name>
<value>10</value>
</property>

<!-- log4j audit provider config -->
<property>
<name>xasecure.audit.log4j.is.enabled</name>
<value>false</value>
</property>

<property>
<name>xasecure.audit.log4j.is.async</name>
<value>false</value>
</property>

<property>
<name>xasecure.audit.log4j.async.max.queue.size</name>
<value>10240</value>
</property>

<property>
<name>xasecure.audit.log4j.async.max.flush.interval.ms</name>
<value>30000</value>
</property>

<!-- kafka audit provider config -->
<property>
<name>xasecure.audit.kafka.is.enabled</name>
<value>false</value>
</property>

<property>
<name>xasecure.audit.kafka.async.max.queue.size</name>
<value>1</value>
</property>

<property>
<name>xasecure.audit.kafka.async.max.flush.interval.ms</name>
<value>1000</value>
</property>

<property>
<name>xasecure.audit.kafka.broker_list</name>
<value>localhost:9092</value>
</property>

<property>
<name>xasecure.audit.kafka.topic_name</name>
<value>ranger_audits</value>
</property>

<!-- ranger audit solr config -->
<property>
<name>xasecure.audit.solr.is.enabled</name>
<value>false</value>
</property>

<property>
<name>xasecure.audit.solr.async.max.queue.size</name>
<value>1</value>
</property>

<property>
<name>xasecure.audit.solr.async.max.flush.interval.ms</name>
<value>1000</value>
</property>

<property>
<name>xasecure.audit.solr.solr_url</name>
<value>http://localhost:6083/solr/ranger_audits</value>
</property>
</configuration>
ranger-policymgr-ssl.xml
<configuration>
<property>
<name>xasecure.policymgr.clientssl.keystore</name>
<value>hadoopdev-clientcert.jks</value>
</property>

<property>
<name>xasecure.policymgr.clientssl.truststore</name>
<value>cacerts-xasecure.jks</value>
</property>

<property>
<name>xasecure.policymgr.clientssl.keystore.credential.file</name>
<value>jceks://file/tmp/keystore-hadoopdev-ssl.jceks</value>
</property>

<property>
<name>xasecure.policymgr.clientssl.truststore.credential.file</name>
<value>jceks://file/tmp/truststore-hadoopdev-ssl.jceks</value>
</property>
</configuration>
3. 在 goosefs-site.properties 文件中,添加如下配置:
...
goosefs.security.authorization.permission.type=CUSTOM
goosefs.security.authorization.custom.provider.class=org.apache.ranger.authorization.goosefs.RangerGooseFSAuthorizer
...
4. ${GOOSEFS_HOME}/libexec/goosefs-config.sh 中,将 goosefs-ranger-plugin-${version}.jar 添加到 GooseFS 的类路径中:
...
GOOSEFS_RANGER_CLASSPATH="${GOOSEFS_HOME}/lib/ranger-goosefs-plugin-${version}.jar"
GOOSEFS_SERVER_CLASSPATH=${GOOSEFS_SERVER_CLASSPATH}:${GOOSEFS_RANGER_CLASSPATH}
...
至此,所有配置完成。

验证使用

例如,添加一条允许 hadoop 用户对 GooseFS 的根目录具备读取和执行权限,但是不允许写的策略,方法如下:
1. 添加策略,如下所示:
控制台下发策略


2. 策略添加成功后,对策略进行验证,即可看到策略已经生效,如下所示:
验证使用