控制台指南

最佳实践

开发者指南

API 文档

SDK 文档

填写文档满意度调查问卷,赢取缤纷好礼> HOT
文档中心 > 对象存储 > 数据湖加速器 GooseFS > 数据安全 > 使用 Apache Ranger 控制 GooseFS 的访问权限

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

最近更新时间:2022-01-12 09:23:24

概述

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 的服务定义目录
  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. 策略添加成功后,对策略进行验证,即可看到策略已经生效,如下所示:
    验证使用
目录