本文并不是解决具体某些什么问题,更相当于一个解决方案,是各个云厂商相对通用的解决方案。
当我们使用各个框架的时候,总有各种各样的权限,关系型数据库的权限可能相对比较好处理,大多数都是创建个账号,grant授权下增删改查的权限
但是到了大数据领域,如hdfs的目录和文件的权限,hive中的表,hbase中的表,presto中的表等等相关的一堆框架权限又如何控制呢?
这时候,我们需要2个东西,一个叫授权(Authorization),一个叫认证(Authentication)
一、授权
我们希望有一个框架,能够管理大多数框架的授权,包括:
- hdfs的目录读写权限
- 各种大数据框架中的表的权限,列级(字段)权限,甚至行级权限,函数权限等等相关资源的权限
- 还有是否能帮忙做数据脱敏?
所以一个叫Ranger的框架就应运而生,这个框架结构如下:
主要有3个部分:
1、Ranger UserSync
同步unix(当前那台服务器上用户和用户组)或者LDAP中的用户和用户组的信息到ranger的用户管理中
2、Ranger Admin
提供WebUI配置权限
与Ranger Plugin进行交互,将权限同步至Ranger Plugin所在节点
你看到的User Source里写的Internal,就是你在Ranger里创建的用户,这个用户主要是用来登录Ranger的WebUI,初始状态下,该用户仅能查看Ranger Service和Policy,管理员用户admin可以在用户管理中,升级普通用户为管理员用户
3、Plugin
集成到服务中进行权限控制,每个组件的权限分开配置,像插件一样
不同组件的权限配置,还是麻烦大家自行百度或者看下Ranger的官方文档
这里单独提两个
(1)、一个是HDFS的权限策略如下图
先检查HDFS原生的权限控制,如果能通过,就不会去看Ranger中配置的任何内容
原生HDFS鉴权为拒绝时,才会通过Ranger进行权限控制
(2)、另一个是Hive的权限策略是生效于Hiveserver2的(也就是说hivecli是限制不了的)
Hive有自带的权限策略:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization
有兴趣的同学可以好好读一读上面的连接
有四种:
- 基于metastore的权限控制(可以控制hivecli的权限,粗粒度)
- 基于sql语法规范的权限控制(就是grant设置权限,只能控制hiveserver2,粒度比较细,可以和上面那种结合使用)
- 基于Ranger或者Sentry权限权限控制(也是控制hiveserver2,粒度可以到列,行,甚至数据脱敏)
- 默认的过时的权限策略(不推荐)
具体怎么配置我就不在这里说了,大家自行百度
二、认证
有了上面的授权,其实还不太够,hiveserver默认是没有做用户名和密码的认证的
也就是说,就算你设置了hive用户是最高权限,但是因为没有认证,任何一个用户都可以jdbc链接hiveserver2,指定hive用户(这样授权就没有意义了)
这时候就要说一个叫LDAP的框架,具体他是啥,有太多介绍的文档,我就不在这里说了
有些文章还是写的很不错的:
你可以这么理解,我在LDAP里面通过目录树的方式保存了不同的用户,并且这些用户会有各自的uid,邮箱,用户组等等一系列的信息
然后最关键的一点,LDAP可以很好的集成到各种不同的框架中,这样就可以实现,一个公司里员工的基础信息都记录在LDAP中,然后公司的不同系统都对接LDAP,这样公司的员工都可以用统一的账号和密码登录公司的不同平台,甚至大数据的这些框架也可以对接LDAP,比如Hiveserver2或者Presto对接LDAP后,就有用户名密码的认证!
LDAP在制作层级的时候,可以像这样做
在people下创建user,然后在group下创建公司不同的组,然后把uid加到对应的组里面(通过LDAP脚本实现)
三、实现的功能
有了以上两个东西之后,我们可以实现什么功能呢?
1、公司新来一个员工,只需要在ldap上为他创建一个uid,由于公司各个框架都对接了LDAP,所以该员工可以使用一个账号密码,登录公司的各个系统
2、员工的大数据框架的权限,可以通过Ranger来控制
- 添加权限的时候要么直接添加该用户的权限,要么添加某个组的权限
- Ranger的Ranger UserSync默认是同步Unix的用户,可以先把Ranger UserSync改成同步LDAP里的用户和用户组信息,不过这里有个注意点:如果Ranger要集成LDAP组的权限,还需要配置hadoop group mapping,否则就是Ranger里能同步到LDAP的user的group信息,但是直接添加group,但是权限不生效
以上就是本文想要说的所有内容,当然这里只是提出了一个比较常见通用的解决方案,各位可以当做参考来建立自己公司的权限策略方案~
当然如果有哪里说的有误的,或者有更好的方案,欢迎大家留言评论~
菜鸡一只,努力学习~
其实很早以前就想写一篇关于Ranger的文档,但是一方面了解的不够深,另一方面感觉单纯讲Ranger的配置和使用,意义不是特别的大
有时候我们要关注的不是单个框架或者某个技术的使用,而是怎么把这些框架组合起来,完成某个业务场景或者实现某个解决方案!