跳到主要内容
最后于 更新

Ranger-Doris 鉴权

Apache Ranger 是一个用来在 Hadoop 平台上进行监控、启用服务以及全方位数据安全访问管理的安全框架。在 Apache Doris 中启用 Ranger 后,权限管理将从 Doris 内部的 GRANT 语句迁移到 Ranger 侧统一配置,便于与 Hive、HDFS 等组件共享同一套权限体系。

本文介绍如何为 Doris 安装并配置 Ranger 插件,以及如何在 Ranger 中定义全局、Catalog、库、表、列、行级与脱敏等各类策略。

适用场景​

场景说明
统一权限管控已使用 Ranger 管理 Hive/HDFS,希望 Doris 复用同一套权限策略
细粒度授权需要对列、行级数据、敏感字段做精细化授权与脱敏
Kerberos 环境Ranger Admin 已开启 Kerberos,Doris 需以 Kerberos 身份拉取策略
替代内部授权希望弃用 Doris 内部 GRANT/REVOKE,由 Ranger 集中授权

前置条件​

  • 已部署 Apache Ranger Admin 服务(推荐 2.x 及以上版本),且能通过 HTTP/HTTPS 访问。
  • 已部署 Apache Doris 集群,FE/BE 节点能访问 Ranger Admin 服务。
  • 拥有 Ranger WebUI 的管理员账号,用于创建服务定义与策略。
  • 行级过滤、数据脱敏需 Doris 2.1.3 及以上版本;Compute Group、Storage Vault 权限需 Doris 3.0.6 及以上版本。

配置流程总览​

  1. 在 Ranger 服务端安装 Doris 插件(上传 Jar 与服务定义 JSON)。
  2. 在 Ranger WebUI 中创建 Doris 服务并填写连接信息。
  3. 在 Doris FE 侧配置 access_controller_type=ranger-doris 并放置 ranger-doris-security.xml。
  4. (可选)若 Ranger Admin 启用 Kerberos,合并 krb5.conf 并在配置中追加 UGI 参数。
  5. 重启 Doris 集群,在 Ranger 中为用户配置策略并在 Doris 中验证。

安装和配置 Doris Ranger 插件​

安装插件​

  1. 下载以下文件:

    注意

    ranger-doris-plugin-3.0.0-SNAPSHOT.jar 需要下载对应分支的 Jar 包,否则会导致无法使用。

  2. 将下载好的文件放到 Ranger 服务的 ranger-plugins/doris 目录下,例如:

    /usr/local/service/ranger/ews/webapp/WEB-INF/classes/ranger-plugins/doris/ranger-doris-plugin-3.0.0-SNAPSHOT.jar
    /usr/local/service/ranger/ews/webapp/WEB-INF/classes/ranger-plugins/doris/mysql-connector-java-8.0.25.jar
  3. 重启 Ranger 服务。

  4. 下载 ranger-servicedef-doris.json。

    注意

    ranger-servicedef-doris.json 需要下载对应分支的 JSON 文件,否则会导致无法使用。

  5. 执行以下命令将服务定义文件上传到 Ranger 服务,从而注册 Apache Doris 的插件定义:

    curl -u user:password -X POST \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    http://172.21.0.32:6080/service/plugins/definitions \
    -d@ranger-servicedef-doris.json

    其中:

    • 用户名和密码为登录 Ranger WebUI 所使用的用户名密码。
    • 服务地址端口可在 ranger-admin-site.xml 配置文件的 ranger.service.http.port 配置项中查看。

    如执行成功,会返回 JSON 格式的服务定义,例如:

    {
    "id": 207,
    "guid": "d3ff9e41-f9dd-4217-bb5f-3fa9996454b6",
    "isEnabled": true,
    "createdBy": "Admin",
    "updatedBy": "Admin",
    "createTime": 1705817398112,
    "updateTime": 1705817398112,
    "version": 1,
    "name": "doris",
    "displayName": "Apache Doris",
    "implClass": "org.apache.ranger.services.doris.RangerServiceDoris",
    "label": "Doris",
    "description": "Apache Doris",
    "options": {
    "enableDenyAndExceptionsInPolicies": "true"
    },
    ...
    }

    如需重新创建,可使用以下命令删除服务定义后再重新上传(其中 207 为创建时返回的 id):

    curl -v -u user:password -X DELETE \
    http://172.21.0.32:6080/service/plugins/definitions/207

    删除前,需在 Ranger WebUI 界面删除已创建的 Doris 服务。也可以通过以下命令列举当前已添加的服务定义,以获取 id:

    curl -v -u user:password -X GET \
    http://172.21.0.32:6080/service/plugins/definitions/

配置插件​

安装完毕后,打开 Ranger WebUI,可在 Service Manager 界面看到 Apache Doris 插件:

ranger

点击插件旁边的 + 号添加一个 Doris 服务:

ranger2

Config Properties 部分参数含义如下:

参数说明
Service Name服务名称,Doris 根据该名称拉取相关权限,需与 ranger-doris-security.xml 中 ranger.plugin.doris.service.name 保持一致,建议填写 doris。不一致会导致 Doris 拉取不到权限,从而鉴权失败
Username / PasswordDoris 集群的用户名密码,建议使用 Admin 用户
jdbc.driver_class连接 Doris 使用的 JDBC 驱动,例如 com.mysql.cj.jdbc.Driver
jdbc.urlDoris 集群的 JDBC URL,例如 jdbc:mysql://172.21.0.101:9030?useSSL=false
resource.lookup.timeout.value.in.ms额外参数,获取元信息的超时时间,建议填写 10000(即 10 秒)

可以点击 Test Connection 检查连通性。

备注

如果此时 Doris 已经启动完成,且 fe.conf 已经配置 access_controller_type=ranger-doris,点击 Test Connection 会显示 fail。这是因为此时 Ranger 鉴权服务还没有创建完成,Doris 拉取权限会失败,属于正常现象,直接创建服务即可。

之后点击 Add 添加服务。返回 Service Manager 界面的 Apache Doris 插件中即可看到创建的服务,点击服务即可开始配置 Ranger 策略。

在 Doris 侧启用 Ranger​

更改 Doris 配置​

  1. 在 fe/conf/fe.conf 文件中配置鉴权方式为 Ranger:

    access_controller_type=ranger-doris
  2. 在所有 FE 节点的 conf 目录下创建 ranger-doris-security.xml 文件,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
    <name>ranger.plugin.doris.policy.cache.dir</name>
    <value>/path/to/ranger/cache/</value>
    </property>
    <property>
    <name>ranger.plugin.doris.policy.pollIntervalMs</name>
    <value>30000</value>
    </property>
    <property>
    <name>ranger.plugin.doris.policy.rest.client.connection.timeoutMs</name>
    <value>60000</value>
    </property>
    <property>
    <name>ranger.plugin.doris.policy.rest.client.read.timeoutMs</name>
    <value>60000</value>
    </property>
    <property>
    <name>ranger.plugin.doris.policy.rest.url</name>
    <value>http://172.21.0.32:6080</value>
    </property>
    <property>
    <name>ranger.plugin.doris.policy.source.impl</name>
    <value>org.apache.ranger.admin.client.RangerAdminRESTClient</value>
    </property>
    <property>
    <name>ranger.plugin.doris.service.name</name>
    <value>doris</value>
    </property>
    </configuration>

    其中需要修改的关键配置项:

    配置项说明
    ranger.plugin.doris.policy.cache.dir用于存放从 Ranger Server 获取的权限缓存文件,该目录需手动创建并保证存在
    ranger.plugin.doris.policy.rest.urlRanger Admin 服务地址,需替换为实际地址
    ranger.plugin.doris.service.name与 Ranger WebUI 中创建的服务名一致,默认 doris
    ranger.plugin.doris.policy.pollIntervalMs策略拉取轮询间隔,单位毫秒
  3. 启动集群。

Ranger Server 开启 Kerberos 时的配置​

当 Ranger Admin 服务本身开启了 Kerberos 认证时,Doris 的 Ranger Client 在拉取策略时需要以 Kerberos 身份向 Ranger Admin 鉴权,否则会导致策略拉取失败、鉴权无法生效。此时需要额外完成以下两步配置。

1. 合并 krb5.conf​

Doris 的 Ranger Client 在执行 Kerberos 登录时,底层使用 JVM 的 Krb5LoginModule,它从每台 FE/BE 节点上的 /etc/krb5.conf 读取 KDC 地址。如果你的环境中同时存在多个 Kerberos Realm(例如 HDFS 集群的 Realm 和 Ranger Admin 所在集群的 Realm 不同),则需要将所有 Realm 的 KDC 信息合并到同一个 /etc/krb5.conf 文件中,并将该文件部署到所有 FE 和 BE 节点。

合并后的 krb5.conf 示例如下:

[libdefaults]
default_realm = HADOOP.EXAMPLE.COM
dns_lookup_realm = true
dns_lookup_kdc = true

[realms]
# HDFS / Hive 集群的 Realm
HADOOP.EXAMPLE.COM = {
kdc = hadoop-kdc.example.com:88
admin_server = hadoop-kdc.example.com
}
# Ranger Admin 所在集群的 Realm(如与上方不同,则需合并进来)
RANGER.EXAMPLE.COM = {
kdc = ranger-kdc.example.com:88
admin_server = ranger-kdc.example.com
}

[domain_realm]
hadoop-kdc.example.com = HADOOP.EXAMPLE.COM
ranger-admin.example.com = RANGER.EXAMPLE.COM
注意

修改或新增 /etc/krb5.conf 后,需要重启所有 FE 和 BE 才能使配置生效。

2. 配置 ranger-hive-security.xml(或 ranger-doris-security.xml)中的 Kerberos UGI​

在 FE 节点的 fe/conf/ 目录下,找到(或创建)ranger-hive-security.xml(使用 Hive Ranger 鉴权时)或 ranger-doris-security.xml(使用 Doris Ranger 鉴权时),在 <configuration> 中追加以下 4 个配置项:

<!-- 开启 UGI Kerberos 登录 -->
<property>
<name>ranger.plugin.hive.ugi.initialize</name>
<value>true</value>
</property>
<!-- 登录方式:keytab -->
<property>
<name>ranger.plugin.hive.ugi.login.type</name>
<value>keytab</value>
</property>
<!-- keytab 文件中对应的 principal -->
<property>
<name>ranger.plugin.hive.ugi.keytab.principal</name>
<value>hive/hostname@RANGER.EXAMPLE.COM</value>
</property>
<!-- keytab 文件路径(需要部署到每台 FE 节点) -->
<property>
<name>ranger.plugin.hive.ugi.keytab.file</name>
<value>/etc/security/keytabs/hive.keytab</value>
</property>

各配置项含义如下:

配置项说明
ranger.plugin.hive.ugi.initialize是否在插件加载时初始化 UGI Kerberos 登录
ranger.plugin.hive.ugi.login.type登录方式,固定为 keytab
ranger.plugin.hive.ugi.keytab.principalkeytab 文件中实际存在的 principal,例如 hive/your-host@YOUR-REALM.COM,可使用 klist -kt /path/to/hive.keytab 查看
ranger.plugin.hive.ugi.keytab.filekeytab 文件的绝对路径,需确保运行 Doris FE 进程的用户对该文件有读权限(建议 chmod 400)
说明
  • 如果使用的是 Doris Ranger 鉴权(ranger-doris-security.xml),则将上述配置中的 hive 替换为 doris,例如 ranger.plugin.doris.ugi.initialize 等。
  • 配置完成后需要重启 FE 使配置生效。
已知限制:多 Catalog 下的全局 UGI 覆盖问题

目前 Doris 中嵌入的 Ranger Plugin 依赖 Hadoop 的 UserGroupInformation (UGI) 进行 Kerberos 登录。由于 JVM 进程中通常共享同一个全局登录用户状态,当您在 Doris 中配置了多个开启 Kerberos 认证的 Ranger Catalog(且它们使用了不同的 Principal)时,会出现 UGI 互相覆盖的问题。

具体表现:

  1. Catalog A 初始化并使用 keytab_A 登录后,全局 UGI 为 Principal_A。
  2. 随后 Catalog B 初始化并使用 keytab_B 登录,全局 UGI 会被覆写为 Principal_B。
  3. 此时 Catalog A 的 Ranger 插件后台线程在向 Ranger Admin 拉取权限策略时,会错误地携带 Principal_B 的票据,导致鉴权失败,策略拉取报错。

当前建议:在同一个 Doris 集群中,针对开启了 Ranger 的所有 Kerberos 数据源,强烈建议统一规划,使用相同的 Kerberos Principal 与同一份 Keytab 文件,以避免互相覆盖导致鉴权失效。

权限示例​

按以下步骤为 Doris 用户授权:

  1. 在 Doris 中创建 user1。
  2. 在 Doris 中,先使用 admin 用户创建一个 Catalog:hive。
  3. 在 Ranger 中创建 user1。目前 Ranger 不能从 Doris 自动同步用户,Doris 也不能从 Ranger 同步用户,需要手动创建用户,和 Doris 同名即可。Ranger 创建用户的步骤见 Ranger 官方文档,在 Settings -> Users 中创建用户。

Ranger 中可为 Doris 配置的权限范围如下表所示:

权限范围等价的 Doris GRANT 语句选择方式
全局权限grant select_priv on *.*.* to user1Catalog 同级下拉框选择 global,输入框只能输入 *
Catalog 权限grant select_priv on hive.*.* to user1Catalog 下拉框中选择目标 Catalog
Database 权限grant select_priv on hive.tpch.* to user1指定 Catalog 与 Database
Table 权限grant select_priv on hive.tpch.user to user1指定 Catalog、Database 与表
列权限grant select_priv(name,age) on hive.tpch.user to user1在表权限基础上选择列
Resource 权限grant usage_priv on resource 'resource1' to user1Catalog 同级下拉框选择 resource
Workload Group 权限grant usage_priv on workload group 'group1' to user1Catalog 同级下拉框选择 workload group
Compute Group 权限(3.0.6+)grant usage_priv on compute group 'group1' to user1Catalog 同级下拉框选择 compute group
Storage Vault 权限(3.0.6+)grant usage_priv on storage vault 'vault1' to user1Catalog 同级下拉框选择 storage vault

下面给出每种权限的 Ranger 配置示例。

全局权限​

相当于 Doris 内部授权语句的 grant select_priv on *.*.* to user1:

  • Catalog 同级下拉框可以找到 global 选项。
  • 输入框里只能输入 *。

global

Catalog 权限​

相当于 Doris 内部授权语句的 grant select_priv on hive.*.* to user1:

catalog

Database 权限​

相当于 Doris 内部授权语句的 grant select_priv on hive.tpch.* to user1:

database

Table 权限​

这里的 table 泛指表 / 视图 / 异步物化视图。

相当于 Doris 内部授权语句的 grant select_priv on hive.tpch.user to user1:

table

列权限​

相当于 Doris 内部授权语句的 grant select_priv(name,age) on hive.tpch.user to user1:

column

Resource 权限​

相当于 Doris 内部授权语句的 grant usage_priv on resource 'resource1' to user1:

  • Catalog 同级下拉框可以找到 resource 选项。

resource

Workload Group 权限​

相当于 Doris 内部授权语句的 grant usage_priv on workload group 'group1' to user1:

  • Catalog 同级下拉框可以找到 workload group 选项。

group1

Compute Group 权限​

3.0.6 版本支持。

相当于 Doris 内部授权语句的 grant usage_priv on compute group 'group1' to user1:

  • Catalog 同级下拉框可以找到 compute group 选项。

compute group

Storage Vault 权限​

3.0.6 版本支持。

相当于 Doris 内部授权语句的 grant usage_priv on storage vault 'vault1' to user1:

  • Catalog 同级下拉框可以找到 storage vault 选项。

storage vault

行权限示例​

2.1.3 版本支持。

  1. 参考 权限示例 给 user1 分配 internal.db1.user 表的 select 权限。

  2. 在 Ranger 中添加一个 Row Level Filter policy:

    Row Policy 示例

  3. 使用 user1 登录 Doris。执行 select * from internal.db1.user,只能看到满足 id > 3 且 age = 2 的数据。

数据脱敏示例​

2.1.3 版本支持。

  1. 参考 权限示例 给 user1 分配 internal.db1.user 表的 select 权限。

  2. 在 Ranger 中添加一个 Masking policy:

    Data Mask 示例

  3. 使用 user1 登录 Doris。执行 select * from internal.db1.user,看到的 phone 字段是按照指定规则脱敏后的数据。

常见问题​

Q: Ranger 访问失败,怎么查看日志?​

在所有 FE 的 conf 目录创建 log4j.properties 文件,内容如下:

log4j.rootLogger = warn,stdout,D

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /path/to/fe/log/ranger.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

其中:

  • log4j.appender.D.File 改为实际值,用于存放 Ranger 插件的日志。
  • log4j.rootLogger 可以根据需要调整日志级别(如 debug、info 等)。注意 debug 只能用于调试,不能用于生产环境,否则日志量会非常大,也会导致鉴权性能下降。

Q: 配置了 Row Level Filter policy,但是用户查询时报没有权限?​

Row Level Filter policy 仅用来限制用户访问表中数据的特定记录,仍需通过 ACCESS POLICY 为用户授权。

Q: 创建服务后,默认仅 admin 用户有权限,root 用户没有权限?​

如图所示,创建服务的时候,添加配置 default.policy.users。如需配置多个用户拥有全部权限,用 , 分隔。

default policy

Q: 使用 Ranger 鉴权后,Doris 内部授权还有用吗?​

不能使用,也不能创建 / 删除角色。所有权限均需在 Ranger 中配置。