tencent cloud

文档反馈

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

最后更新时间:2024-01-06 11:17:59

    概述

    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. 如果使用的是腾讯云 EMR 集群,则 Ranger 的服务定义目录在:/usr/local/service/ranger/ews/webapp/WEB-INF/classes/ranger-plugins
    2. 如果是自建 Hadoop 集群,则可以通过在 ranger 目录下查找 hdfs 等已经接入到 ranger 服务的组件,查找目录位置。
    ranger 的服务定义目录
    
    3. 在 GooseFS 的目录下,放入 goosefs-ranger-plugin-${version}.jar 和 ranger-servicedef-goosefs.json,并且具备读权限。
    4. 重启 Ranger 服务。
    5. 在 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}
    6. 创建成功后,在 Ranger 的 Web 控制台上即可看到 GooseFS 相关的服务:
    ranger 的 web 控制台
    
    7. 在 GooseFS 服务侧单击【+】,定义 goosefs 服务实例。
    ranger 的 web 控制台上定义 goosefs 服务实例
    
    8. 单击新生成的 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. 策略添加成功后,对策略进行验证,即可看到策略已经生效,如下所示:
    验证使用
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持