Ranger 鉴权
Apache Ranger 是一个用来在 Hadoop 平台上进行监控,启用服务,以及全方位数据安全访问管理的安全框架。 使用 ranger 后,会通过在 Ranger 侧配置权限代替在 Doris 中执行 Grant 语句授权。 Ranger 的安装和配置见下文:安装和配置 Doris Ranger 插件
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.plugin.doris.policy.rest.url改为实际值。 -
启动集群
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.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 中创建
user1。 - 在 Doris 中,先使用
admin用户创建一个 Catalog:hive。 - 在 Ranger 中创建
user1。
全局权限
相当于 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 是按照指定规则脱敏后的数据。
常见问题
-
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 插件的日志。 -
配置了 Row Level Filter policy ,但是用户查询时报没有权限
Row Level Filter policy 仅用来限制用户访问表中数据的特定记录, 仍需通过 ACCESS POLICY 为用户授权
-
创建服务后,默认仅
admin用户有权限,root用户没有权限如图所示,创建服务的时候,添加配置
default.policy.users,如需配置多个用户拥有全部权限,用,分隔
-
使用 ranger 鉴权后,内部授权还有用么?
不能用,也不能创建/删除角色
安装和配置 Doris Ranger 插件
安装插件
-
下载以下文件
-
将下载好的文件放到 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 服务:
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"
},
...
}如想重新创建,则可以使用以下命令删除服务定义后,再重新上传:
curl -v -u user:password -X DELETE \
http://172.21.0.32:6080/service/plugins/definitions/207其中
207是创建时返回的 id。删除前,需在 Ranger WebUI 界面删除已创建的 Doris 服务。也可以通过以下命令列举当前已添加的服务定义,以便获取 id:
curl -v -u user:password -X GET \
http://172.21.0.32:6080/service/plugins/definitions/
配置插件
安装完毕后,打开 Ranger WebUI,可以再 Service Manger 界面中看到 Apache Doris 插件:

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

Config Properties 部分参数含义如下:
Username/Pasword:Doris 集群的用户名密码,这里建议使用 Admin 用户。jdbc.driver_class:连接 Doris 使用的 JDBC 驱动。com.mysql.cj.jdbc.Driverjdbc.url:Doris 集群的 JDBC url 连接串。jdbc:mysql://172.21.0.101:9030?useSSL=false- 额外参数:
resource.lookup.timeout.value.in.ms:获取元信息的超时时间,建议填写10000,即 10 秒。
可以点击 Test Connection 检查是否可以联通。
之后点击 Add 添加服务。
之后,可以在 Service Manger 界面的 Apache Doris 插件中看到创建的服务,点击服务,即可开始配置 Ranger。