背景
数据权限的治理也是一个挺有意思的话题, 你可以把权限管理放到应用层, 当用户提交查询到 hive/presto/spark 的时候, 首先进行SQL的检查, 得知该用户是否有相关的权限. 没有的话就直接拦截, 不往 database(db) 层传了. 还有另外一种权限管理的方法, 就是把权限管理下放到 db 层. 这样做的好处很多:
应用层可以随时换, 不担心权限管理问题, 不重复造轮子.
比如使用 Hue, 报表系统, 及其他 BI 工具, 完全不担心权限的接入问题, 因为 db 层已经严格监管了每一个查询.支持系统账号的数据计算需求.
用户账号通过应用层如 Hue 等与 db 交互完全没问题, 当公司的一个部门平台(系统账号)想要不定期的提取数据进行计算, 提供一个应用层的接口就会有很多问题. 如应用层需要登录(手机扫码或短信验证码), 就会碰到机器怎么绕过登录的问题, 以及应用层的 nginx 超时的限制, 应用层是否提供 thrift 接口等, 都会对系统账号的数据消费/计算造成很多障碍. 而如果系统账号可以直接访问 database 层, 以上的问题就都不存在了.
调研下来, Apache Ranger 和 Apache Sentry 解决的就是 database 层的权限管理问题.
这两个项目对比后, 个人更加倾向于使用 Apache Ranger, 后续可以再详细介绍一下这两者的对比.
Ranger 项目结构
以下的项目分析都是基于 Ranger 1.2.0 版本.
Apache Ranger 这个项目在15, 16年还是比较活跃的, 现在看来, 应该不会有后续的版本迭代了, 连现在比较流行的spark和presto的插件都没有实现. Anyway~
Apache Ranger 使用Java开发, 提供了主流大数据组件的权限管理, 如hive, hbase, hdfs, kafka 等. 整体的项目结构划分很清晰, 每个插件是一个模块, 公共的功能如 audit(审计) 和 policyengine(权限决策引擎) 都单独抽出来作为一个模块. Ranger 提供了一个admin web服务, 该服务用来配置和管理各个插件, 存储 policy(策略) 的一个web server. 各个插件会每隔 30 秒从 Ranger admin web 拉取用户权限的信息, 插件本地也有缓存, 所以即使web server挂了, 仍然不影响插件的权限管控.
Ranger admin web server
找到 [security-admin-web] 模块, 该模块包含了web后台 RESTful API的代码, dao, biz, view 层; 以及前端的 js 代码.
通过 maven 打包后, 可在 target/
目录下找到 ranger-1.2.0-admin.tar.gz
, 解压后根据官网 https://cwiki.apache.org/confluence/display/RANGER/Ranger+Installation+Guide#RangerInstallationGuide-Steps
的步骤进行安装即可. 安装过程中如果 solr 不想配置, 可以不填 audit 部分的配置信息(填了反而出现很多 db grant 方面的权限问题...). 安装后 ranger 注册成为系统服务, 实际是通过把 [embeddedwebserver] 模块中的 scripts/ranger-admin-initd
copy 一份到 /etc/init.d/
中. 才得以通过 service ranger-admin start
启动.
Ranger hive plugin
ranger 的 plugin 开发都差不多, 就以 hive 为例简单介绍一下. hive 插件的工作原理是以 jar 包的形式, 放到 hive 的 /etc/hive/lib
目录下, 当 hiveserver 启动后, 这个 jar 包会出现在 classpath 中, 从而开始产生影响.
值得一提的是, hive 插件只能管控 hiveserver, 不能对metastore 起到管理作用, hive的 cli 也是不在管控范围内.
hive plugin通过实现 ranger 和 hive 的一些接口, 完成了权限的管理, 决策引擎最终也会被打入 hive plugin 的 jar 包中. 上面提到过, policyengine 是在 [ranger-plugins-common] 模块中.
以上是 Apache Ranger 的项目剖析, 以后再慢慢深入, 如怎么开发一个插件, 脱离ranger, 怎么自己写权限插件?
谢谢阅读, 如有问题, 可以私信~~