Ranger 鉴权
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 及以上版本。
配置流程总览
- 在 Ranger 服务端安装 Doris 插件(上传 Jar 与服务定义 JSON)。
- 在 Ranger WebUI 中创建 Doris 服务并填写连接信息。
- 在 Doris FE 侧配置
access_controller_type=ranger-doris并放置ranger-doris-security.xml。 - (可选)若 Ranger Admin 启用 Kerberos,合并
krb5.conf并在配置中追加 UGI 参数。 - 重启 Doris 集群,在 Ranger 中为用户配置策略并在 Doris 中验证。
安装和配置 Doris Ranger 插件
安装插件
-
下载以下文件:
注意ranger-doris-plugin-3.0.0-SNAPSHOT.jar需要下载对应分支的 Jar 包,否则会导致无法使用。 -
将下载好的文件放到 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 -
重启 Ranger 服务。
-
下载 ranger-servicedef-doris.json。
注意ranger-servicedef-doris.json需要下载对应分支的 JSON 文件,否则会导致无法使用。 -
执行以下命令将服务定义文件上传到 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 插件:

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

Config Properties 部分参数含义如下:
| 参数 | 说明 |
|---|---|
Service Name | 服务名称,Doris 根据该名称拉取相关权限,需与 ranger-doris-security.xml 中 ranger.plugin.doris.service.name 保持一致,建议填写 doris。不一致会导致 Doris 拉取不到权限,从而鉴权失败 |
Username / Password | Doris 集群的用户名密码,建议使用 Admin 用户 |
jdbc.driver_class | 连接 Doris 使用的 JDBC 驱动,例如 com.mysql.cj.jdbc.Driver |
jdbc.url | Doris 集群的 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 配置
-
在
fe/conf/fe.conf文件中配置鉴权方式为 Ranger:access_controller_type=ranger-doris -
在所有 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 中创建的服务名一致,默认 dorisranger.plugin.doris.policy.pollIntervalMs策略拉取轮询间隔,单位毫秒 -
启动集群。
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.principal | keytab 文件中实际存在的 principal,例如 hive/your-host@YOUR-REALM.COM,可使用 klist -kt /path/to/hive.keytab 查看 |
ranger.plugin.hive.ugi.keytab.file | keytab 文件的绝对路径,需确保运行 Doris FE 进程的用户对该文件有读权限(建议 chmod 400) |
- 如果使用的是 Doris Ranger 鉴权(
ranger-doris-security.xml),则将上述配置中的hive替换为doris,例如ranger.plugin.doris.ugi.initialize等。 - 配置完成后需要重启 FE 使配置生效。
目前 Doris 中嵌入的 Ranger Plugin 依赖 Hadoop 的 UserGroupInformation (UGI) 进行 Kerberos 登录。由于 JVM 进程中通常共享同一个全局登录用户状态,当您在 Doris 中配置了多个开启 Kerberos 认证的 Ranger Catalog(且它们使用了不同的 Principal)时,会出现 UGI 互相覆盖的问题。
具体表现:
- Catalog A 初始化并使用
keytab_A登录后,全局 UGI 为Principal_A。 - 随后 Catalog B 初始化并使用
keytab_B登录,全局 UGI 会被覆写为Principal_B。 - 此时 Catalog A 的 Ranger 插件后台线程在向 Ranger Admin 拉取权限策略时,会错误地携带
Principal_B的票据,导致鉴权失败,策略拉取报错。
当前建议:在同一个 Doris 集群中,针对开启了 Ranger 的所有 Kerberos 数据源,强烈建议统一规划,使用相同的 Kerberos Principal 与同一份 Keytab 文件,以避免互相覆盖导致鉴权失效。
权限示例
按以下步骤为 Doris 用户授权:
- 在 Doris 中创建
user1。 - 在 Doris 中,先使用
admin用户创建一个 Catalog:hive。 - 在 Ranger 中创建
user1。目前 Ranger 不能从 Doris 自动同步用户,Doris 也不能从 Ranger 同步用户,需要手动创建用户,和 Doris 同名即可。Ranger 创建用户的步骤见 Ranger 官方文档,在Settings -> Users中创建用户。
Ranger 中可为 Doris 配置的权限范围如下表所示:
| 权限范围 | 等价的 Doris GRANT 语句 | 选择方式 |
|---|---|---|
| 全局权限 | grant select_priv on *.*.* to user1 | Catalog 同级下拉框选择 global,输入框只能输入 * |
| Catalog 权限 | grant select_priv on hive.*.* to user1 | Catalog 下拉框中选择目标 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 user1 | Catalog 同级下拉框选择 resource |
| Workload Group 权限 | grant usage_priv on workload group 'group1' to user1 | Catalog 同级下拉框选择 workload group |
| Compute Group 权限(3.0.6+) | grant usage_priv on compute group 'group1' to user1 | Catalog 同级下拉框选择 compute group |
| Storage Vault 权限(3.0.6+) | grant usage_priv on storage vault 'vault1' to user1 | Catalog 同级下拉框选择 storage vault |
下面给出每种权限的 Ranger 配置示例。
全局权限
相当于 Doris 内部授权语句的 grant select_priv on *.*.* to user1:
- Catalog 同级下拉框可以找到
global选项。 - 输入框里只能输入
*。

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

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

Table 权限
这里的 table 泛指表 / 视图 / 异步物化视图。
相当于 Doris 内部授权语句的 grant select_priv on hive.tpch.user to user1:

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

Resource 权限
相当于 Doris 内部授权语句的 grant usage_priv on resource 'resource1' to user1:
- Catalog 同级下拉框可以找到
resource选项。

Workload Group 权限
相当于 Doris 内部授权语句的 grant usage_priv on workload group 'group1' to user1:
- Catalog 同级下拉框可以找到
workload group选项。

Compute Group 权限
3.0.6 版本支持。
相当于 Doris 内部授权语句的 grant usage_priv on compute group 'group1' to user1:
- Catalog 同级下拉框可以找到
compute group选项。

Storage Vault 权限
3.0.6 版本支持。
相当于 Doris 内部授权语句的 grant usage_priv on storage vault 'vault1' to user1:
- Catalog 同级下拉框可以找到
storage vault选项。

行权限示例
2.1.3 版本支持。
-
参考 权限示例 给
user1分配internal.db1.user表的select权限。 -
在 Ranger 中添加一个 Row Level Filter policy:

-
使用
user1登录 Doris。执行select * from internal.db1.user,只能看到满足id > 3且age = 2的数据。
数据脱敏示例
2.1.3 版本支持。
-
参考 权限示例 给
user1分配internal.db1.user表的select权限。 -
在 Ranger 中添加一个 Masking policy:

-
使用
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。如需配置多个用户拥有全部权限,用 , 分隔。

Q: 使用 Ranger 鉴权后,Doris 内部授权还有用吗?
不能使用,也不能创建 / 删除角色。所有权限均需在 Ranger 中配置。