背景:
历史原因有A、B两个HDP集群,集群间的数据经常需要互相关联,已经通过Kyuubi+Spark实现了两个集群的联邦查询,简化了ETL流程。但是对于Ad hoc和OLAP场景Spark并不是非常适合。因此希望基于Doris的external catalog和向量化引擎实现上述场景的加速。
方案:
1、数据安全
目前主要解决身份认证和权限认证问题。在之前的定位中,Doris作为DM层为上层应用提供数据服务,开通的都是公共账号,而对于数据开发场景使用的主要是个人账号。
1.1 身份认证
因此第一步是如何让开发人员方便的接入Doris而不用记住多个账号,同时也方便数据平台的管理员维护账号及权限,这里采用了LDAP的认证方式。
(PS:之前也考虑过为每个开发人员在Doris建立账号,但是遇到一个限制,就是账号里不能包含中横线,这不符合我们这边的现状。)
具体做法:
- 在LDAP服务上建立用户组,将相关用户拉入组内;
- 在Doris上建立与LDAP服务用户组名相同的角色;
- 这样通过LDAP登录的用户就有了默认的角色,后续基于角色赋予catalog的查询权限。
1.2 权限认证
目前的hive、iceberg、hudi 都基于HMS管理元数据、HDFS存储数据,权限认证使用的是ranger。接下来就是要解决对接多个ranger的问题。
CREATE CATALOG hive_x comment 'hive_x location catalog' PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9083',
'hadoop.username' = 'hadoop',
'dfs.nameservices'='hivex',
'dfs.ha.namenodes.hivex'='nn1,nn2',
'dfs.namenode.rpc-address.hivex.nn1'='192.168.1.1:8020',
'dfs.namenode.rpc-address.hivex.nn2'='192.168.1.2:8020',
'dfs.client.failover.proxy.provider.hivex'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
'access_controller.properties.ranger.service.name'='doris',
'access_controller.class'='org.apache.doris.catalog.authorizer.ranger.hive.RangerHiveAccessControllerFactory'
);
Doris的hive catalog在创建时可以指定 access_controller 为ranger,
具体行为是通过解析执行计划,识别出库、表、列然后和ranger的权限策略做比对来拦截越权行为,之后通过hms内的元数据找到数据的存储位置,然后通过hdfs client去直接读数据。
当执行CREATE CATALOG 时,会基于access_controller.properties.ranger.service.name的值去加载 Doris FE/conf 下面关于ranger的配置文件
具体为:
例子中ranger.service.name为doris, 就会加载 ranger-doris-security.xml、ranger-doris-audit.xml、ranger-doris-policymgr-ssl.xml
(PS:这个加载是动态的,添加新的文件不需要重启fe, 应该是会加载当前master fe 下的文件。)
同时会在这些文件中寻找 ranger.plugin.doris 开头的配置项,用于初始化ranger的client.
如果找不到必要的配置项,会抛出异常,但是Doris这边没有正确处理异常,反应到客户端看到的是:
Failed to init access controller: bound must be positive
1.3 问题:
ranger配置文件可以复制相应集群上hive的配置文件,但是最好做精简,在测试过程中,出现了读hdfs时dfs.nameservices混乱的问题,比如读A集群的表用的是B集群的nameservice,后来简化了配置文件,问题消失。
配置项可以参考:https://doris.apache.org/zh-CN/docs/admin-manual/auth/authorization/ranger