1.文档编写目的

Cloudera 提供两类 Sentry 迁移工具:

  • Replication Manager:在定制 Hive 复制作业的时候,勾选import both Hive object and URL permissions 或者 import only Hive object permissions

  • authzmigrator:在导出 Sentry acl 的过程中,将其转换为 Ranger 可以读取的格式,然后通过 CM 界面执行 Import Sentry Policies命令 导入Ranger。

推荐使用第二种 authzmigrator 进行 Sentry 迁移。

 

从 Sentry 到 Ranger 的转换规则如下:

  • 授予角色的 Ranger 权限将授予 Ranger 中的 group。

  • 授予父对象的 Ranger 权限也会被授予子对象。迁移过程保留了应用于子对象的权限。例如,在数据库级别应用的权限也将应用于该数据库内的表。

  • Sentry OWNER 特权会被转换为 Ranger OWNER 特权。

  • Sentry OWNER WITH GRANT OPTION 将转换为 Ranger OWNER with Delegated Admin 勾选。

  • Sentry 不会区分表和视图。对于视图权限,会将它们视为表名。

  • 如果集群包含 Kafka 服务,并且 Kafka sentry 策略具有“ action”:“ ALL”权限,那么迁移后的 Ranger 策略将缺少“ alter”权限。升级后,将需要手动添加该策略。请注意:缺少此权限不会产生任何功能影响。仅出于完整性考虑,才需要在升级后添加“alter”权限,因为拥有“configure”权限同样允许“alter”操作。

 

  • 测试环境

1.CDH5.16.1、启用Kerberos

2.CDP7.1.6 、启用Kerberos

3.元数据库版本:MariaDB 5.5.60

2.操作步骤

2.1前置条件

1.CDP 的 CM 节点与 CDH 的元数据库节点没有网络限制,并且CDP 集群中的CM节点可以正常使用 sentry 元数据的用户密码登陆 CDH 的 sentry 元数据库

2. 在 CDP 集群CM界面中中下载并分发(不激活)目标 CDH 集群的 Parcel 包如下所示

2.2Step1. 修改配置文件sentry-site.xml

sentry-site.xml 其中的配置请参考 CDH5 的 sentry 节点:

/run/cloudera-scmagent/process/xxx-sentry-create-dbtables/sentry-site.xml

编辑sentry-site.xml

<configuration>
  <property>
    <name>sentry.store.jdbc.url</name>
    <value>jdbc:mysql://mysqlhosts:3306/sentry?useUnicode=true&amp;characterEncoding=UTF-8</value> 
  </property>
  <property>
    <name>sentry.store.jdbc.driver</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>sentry.store.jdbc.user</name>
    <value>sentry</value>
  </property>
  <property>
    <name>sentry.store.jdbc.password</name>
    <value>cloudera</value>
  </property>
</configuration>

配置说明如下:

2.3 Step2. 修改配置文件authorization-migration-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <name>authorization.migration.export.target_services</name>
    <value>HIVE,KAFKA,HDFS,SOLR</value>
  </property>
  <property>
    <name>authorization.migration.export.migration_objects</name>
    <value></value>
  </property>
  <property>
    <name>authorization.migration.export.cluster_name</name>
    <value>Tiger1</value>
  </property>
  <property>
    <name>authorization.migration.export.output_file</name>
    <value>hdfs:///user/sentry/export-permissions/permissions.json</value>
  </property>
  <property>
    <name>authorization.migration.role.permissions</name>
    <value>true</value>
  </property>
  <property>
    <name>authorization.migration.translate.url.privileges</name>
    <value>false</value>
  </property>
  <property>
    <name>authorization.migration.ingest.hive.service.user</name>
    <value>hive</value>
  </property>
  <property>
    <name>authorization.migration.ingest.hive.service.group</name>
    <value>hive</value>
  </property>
  <property>
    <name>authorization.migration.create.hdfs.policy</name>
    <value>false</value>
  </property>
</configuration>

2.4 Step3. 修改运行脚本run.sh

#!/bin/bash
# Reference:
#http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
 DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 SOURCE="$(readlink "$SOURCE")"
 [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we
need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
export CLOUDERA_ROOT=/opt/cloudera
export PARCEL_ROOT=${CLOUDERA_ROOT}/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3
CLASSPATH=/etc/hadoop/conf
CLASSPATH=${CLASSPATH}:${CLOUDERA_ROOT}/cm/lib/dr/authz-common-1.2.0.jar
CLASSPATH=${CLASSPATH}:${CLOUDERA_ROOT}/cm/lib/dr/authz-exporter-1.2.0.jar
CLASSPATH=${CLASSPATH}:${CLOUDERA_ROOT}/cm/lib/dr/authz-ingestor-1.2.0.jar
CLASSPATH=${CLASSPATH}:${CLOUDERA_ROOT}/cm/lib/dr/authz-main-1.2.0.jar
CLASSPATH=${CLASSPATH}:${CLOUDERA_ROOT}/cm/lib/dr/authz-translator-1.2.0.jar
CLASSPATH=${CLASSPATH}:${CLOUDERA_ROOT}/cm/lib/mysql-connector-java.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/hadoop/*
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/hadoop/lib/*
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/hadoop-hdfs/*
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/jars/commons-cli-1.2.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/jars/metrics-core-3.0.2.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/jars/datanucleus-api-jdo-3.2.6.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/jars/datanucleus-core-3.2.12.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/jars/datanucleus-rdbms-3.2.12.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/sentry/lib/jdo-api-3.0.1.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/sentry/lib/sentry-core-common.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/sentry/lib/sentry-hdfs-common.jar
CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/sentry/lib/server/bonecp-0.7.1.RELEASE.jar
export CLASSPATH=${CLASSPATH}:${PARCEL_ROOT}/lib/sentry/lib/sentry-provider-db.jar
#/usr/java/jdk1.8.0_232-cloudera/bin/java 为 java 的运行路径,请根据自己的 jdk 目录修改
/usr/java/jdk1.8.0_232-cloudera/bin/java –cp
${CLASSPATH} com.cloudera.enterprise.authzmigrator.Main --command export --confdir ${DIR}

配置说明如下:

2.5 Step4. 运行导出权限脚本

执行如下命令 
mkdir -p /tmp/sentry-export 
#需要将 mysql jdbc 的包拷贝到 /opt/cloudera/cm/lib/ 
cp ~/mysql-connector-java.jar /opt/cloudera/cm/lib/ 
cp ~/authorization-migration-site.xml /tmp/sentry-export
cp ~/sentry-site.xml /tmp/sentry-export
cp ~/run.sh /tmp/sentry-export 
#需要将 hadoop core-site.xml 拷贝到 run.sh 运行路径 
cp /etc/hadoop/conf/core-site.xml /tmp/sentry-export 
#需要一个有权限的用户执行
kinit etl_user
cd /tmp/sentry-export 
#执行 run.sh 
sh run.sh

根据上述配置导出的权限 json 文件在 CDP 集群的 hdfs:///user/sentry/export-permissions/permissions.json 目录下,这也是 CDP 集群中导入 sentry 权限到 ranger 中的默认数据路径

2.6 Step5. 导入Ranger

在CM > Ranger >Ranger Admin > 操作 > Import Sentry Policies 点击执行

运行如下表示成功完成

登录Ranger 页面查看验证发现权限和角色都已成功导入

3.总结

与 Sentry 相比,Ranger 提供了更好的用户体验。Ranger 有更好的 UI,更灵活的访问控 制模型,该模型包括基于属性的访问控制以及与 Atlas 集成,以及基于用户、用户组、角色的多种权限分配机制,而且对于权限的管理粒度也更细,相对之下毫无疑问Ranger 是更合适的选择。

 

最后修改于 2021-06-02 13:55:28
上一篇