大数据权限与安全

2020-07-17  本文已影响0人  专职掏大粪

权限的管控,历来是大数据平台中最让人头疼的问题之一。管得严了,业务不流畅,用户不开心,放得宽了,安全没有底,你能放心?而且大数据平台组件,服务众多;架构,流程复杂,有时候,就是你想管,也未必能管得起来。

涉及到具体的技术方案层面,Kerberos,LDAP,Sentry,Ranger,Quota,ACL,包括各个组件自己的权限管控方案,这些话题,不是一小节的篇幅能够覆盖的,所以,不打算在这里详细讨论各种技术方案。

所以,还是让我们来谈一下权限管控的目标。从我司当前阶段来看,我们的权限管控目标,是防君子不防小人。此话怎讲?权限管控,大家都知道,有两个步骤:认证(authentication)和授权(authorization)。前者鉴定身份,后者根据身份赋予权限。

我司当前的权限建设重点目标在于授权这个环节。如何对权限点进行集中统一的管理;如何让用户自主的申请权限;如何把权限的管理工作交给具体的业务负责人而不是平台管理员;如何在不同的组件之间,不同的用户之间打通权限关系。这些工作,在当前复杂的生态环境中已经够我们忙一阵子了。

至于用户身份的鉴定这个环节,比如Kerberos这种方案,我们就暂时没有采用。原因很简单:覆盖面不全,应用代价太高,收益不明显。对于用户身份的鉴定,我们的主要目标是防止无意的误操作,而非蓄意的身份伪造。有很多种代价更低的用户认证方式能达到这个目标。

所以,权限的管控,做多少,怎么做,花多少代价,取决于你的目标出发点,我司集成开发环境的权限管控目标:是对用户常规的业务行为范围进行限定,敏感数据的控制固然是一方面,但更重要的是对业务逻辑和流程的约束,通过减少用户不必要的权限,减小受害面,降低可能的业务风险,同时也便于明确用户的权责归属关系。

常见开源方案

权限管理相关工作可以分为两部分内容: 一、管理用户身份,也就是用户身份认证(Authentication) 二、用户身份和权限的映射关系管理,也就是授权(Authorization

前者,用户身份认证这一环节,在Hadoop生态系中常见的开源解决方案是 Kerberos+LDAP,而后者授权环节,常见的解决方案有Ranger,Sentry等,此外还有像knox这种走Gateway代理服务的方案。

下面简单介绍一下这些开源项目,目的不是为了讲解这些方案的实现原理,而是从整体架构流程的角度来看看他们的目标问题和解决思想,以及适用场景等,这样当你在选择或者开发适合自己平台的权限管理方案时,也可以做到知其然,知其所以然。

至于Hadoop生态系的各个组件比如HDFS/Hive/HBase自身的权限管理模型,针对的是单一的具体组件,也是权限管控体系中的重要组成部分,但限于篇幅原因,本文就不加以讨论了

Kerberos

Kerberos是Hadoop生态系中应用最广的集中式统一用户认证管理框架。

最后,用户身份认证只是权限管理环节中很小的一部分,虽然技术难度大,但是从实际影响来看,合理的权限模型和规范的管理流程,通常才是数据安全的关键所在。所以,上不上Kerberos需要结合你的实际场景和安全需求加以考量。

Sentry和Ranger

Sentry和Ranger的目标都是统一的授权管理框架/平台,不光目标,这两个项目在思想和架构方面也大同小异,那么为什么会有两套如此类似的系统?当然是因为Cloudera和Hortonworks两家互相不鸟,必须各搞一套呗,目前看起来,Sentry借CDH用户基数大的东风,普通用户比较容易接受,但Ranger在功能完整性方面似乎略微占点上风。

相比用户身份认证,授权这件事情和具体服务的业务逻辑关联性就大多了,如果是纯SQL交互的系统,通过解析脚本等方式,从外部去管理授权行为有时是可行的,其它情况,通常都要侵入到具体服务的内部逻辑中才有可能实现权限的控制逻辑。

所以Sentry和Ranger都是通过Hook具体后台服务的流程框架,深度侵入代码,添加授权验证逻辑的方式来实现权限管控的,只不过具体的权限管理相关数据的存储,查询,管理工作实际是对接到外部独立的系统中承接实现的,进而实现各种存储计算集群权限的统一管理。

要Hook具体后台服务的流程框架,最理想的是原系统本身就提供插件式的权限管理方案可供扩展,否则就需要对原系统进行针对性的改造,另外各个系统自身既有的权限模型也未必能满足或匹配Sentry和Ranger所定义的统一权限管理模型,是否能改造本身就是个问题。

加上权限验证流程通过查询外部服务实现,因此在权限的同步,对原系统的性能影响等方面常常也需要小心处理或者针对性的优化。因此,统一的授权管理平台这一目标也是一个浩大的工程。所以至今无论Sentry还是Ranger都未能全面覆盖Hadoop生态系中常见的计算存储框架。

当然,要用一个框架彻底打通所有组件的权限管理工作,除了插件化,其它其实也没有特别好的方式,而插件化自然需要框架和具体组件的双向合作努力。只能说就当前发展阶段而言,这一整套方案尚未足够成熟,没到完美的程度,也没有事实统一的标准。所以无论是Sentry还是Ranger,当前的实现如果刚好适合你的需求自然最好,如果不适合,那还需要自己再想办法,且看他们将来的发展吧。

Knox

最后来说一下Knox项目,它的思想是通过对Hadoop生态系的组件提供GateWay的形式来加强安全管控,你可以近似的认为他就是一个Rest/HTTP的服务代理/防火墙

所有用户对集群的Rest/HTTP请求都通过Knox代理转发,既然是代理,那么就可以在转发的过程中做一些身份认证,权限验证管理的工作,因为只针对Rest/HTTP服务,所以他并不是一个完整的权限管理框架

使用Gateway的模式有很大的局限性,比如单点,性能,流程等等,不过对于Rest/HTTP的场景倒也算是匹配。它的优势是通过收拢Hadoop相关服务的入口,可以隐藏Hadoop集群的拓扑逻辑,另外,对于自身不支持权限认证管理的服务,通过Gateway也能自行叠加一层权限管控。

开源项目中常见的权限模型概念:RBAC / ACL / POSIX / SQL Standard 首先来看RBAC模型,RBAC从标准规范的角度来看,绝对是一个复杂的标准,但是实际情况下,各种开源系统在讨论RBAC的时候,通常重点指的就是权限和用户之间需要通过角色的概念进行一次二次映射,目的是为了对同类权限或同类用户进行归类,减少需要维护的映射关系的数量。至于RBAC理论层面上各种层级的约束,条件,规范等等,其实谈得很少。

而在其它模型中,也或多或少有组/角色的概念,只是比如:组的涵盖范围,是否允许存在多重归属,能否交叉,能否嵌套,是否允许用户和权限直接挂钩等具体规则上有所区别。不过基本上,如果你要宣称自己是一个RBAC模型的话,那么基本上还是要重点强调角色模型和映射关系的建设。而在其它模型中,组/角色的概念相对来说可能并没有那么突出或者重要。

然后谈POSIX的权限模型,谈这个,当然是因为HDFS的文件权限模型,很长一段时间以来,只支持POSIX标准文件的权限管理模型,即一个文件对应一个OWNER和一个GROUP,对OWNER和GROUP以及其它用户配置RWAC这样的读写通过管理等权限。

POSIX模型很直白,很容易理解,实现也简单,但POSIX模型最大的问题是文件的共享很难处理。因为要将权限赋予一拨人,只能通过单一固定的组的概念,你无法针对不同的人群和不同的文件进行分组授权,所以很难做到精细化的授权管理。

为了解决权限多映射精细管理问题,HDFS又引入了ACL模型,Access Control List,故名思意,就是针对访问对象,有一个授权列表。那么对不同对象给不同用户赋予不同的权限也就不成问题了。当然,HDFS的ACL模型也不是范本,事实上各种系统中所谓的ACL模型,具体设计都不尽相同,唯一可能共通的地方就是:对访问对象赋予一个授权列表这个概念,而不是像POSIX这样固定分类的授权模式。

ACL模型理论上看起来很理想,但在HDFS集群这个具体场景中,麻烦的地方在于如果集群规模比较大,授权列表的数量可能是海量的,性能,空间和效率上都可能成为问题,而事实上,ACL对象精细化的管理也并不那么容易。当然这些也并不能算是ACL模型自身的问题,更多的是具体的实现和上层业务规划方面的问题。

最后所谓的SQL标准的权限模型,从模型的角度来说和ACL模型并没有什么本质的区别,只不过是在类SQL语法的系统中,模仿了Mysql等传统数据库中标准的授权语法来与用户进行交互。具体的实现例子,比如Hive Server2中支持的SQL标准授权模型

基于开发平台服务入口的权限管控思路 了解了相关的解决方案和思路,在我们自己的大数据平台的权限管理方案的实施过程中,不管是全面使用开源方案,还是局部混搭,又或者是完全自行构建,我们都可以从身份认证与授权管理,集中式管控与Gateway边界管理等角度来拆解,思考和分析问题,寻找适合自身业务场景的整合方案。

我司的整体思路,是尽可能通过构建产品化的大数据开发平台,将各种集群以服务的形式对外提供,换句话说,类似于上述Gateway的思想(但不是knox这种http代理),尽可能让用户通过开发平台来提交任务,管理数据,而不是直接通过API连接集群。

当所有的用户都通过开发平台来和集群进行交互时,开发平台就具备了统一的用户身份认证和权限管理的基础前提条件。当然实际情况并没有那么理想,不管是出于技术原因,实现代价原因,程序效率性能原因,还是业务流程原因,总会有些业务流程和任务无法通过开发平台来统一管控。这时候就需要结合其它方案来弥补了。

HDFS集群的文件读写的权限认证为例,大部分涉及到HDFS文件读写的任务,比如Hive/Presto/SparkSQL等相关任务,如果我们管控了这些任务作业的提交入口,相关的集群由我们提供,那么多数权限管控工作我们都是能够在开发平台层面完成管控的。

但还有很大一部分需要读写HDFS数据的业务,自身并不运行在大数据开发平台提供的服务上。比如内网的简历系统需要存取简历,商家的证照文件需要备份,广告的算法模型,特征数据需要在各个子系统间传输等等,这些业务的程序可能是自行开发的,调用入口也并不在大数据开发平台上,所以开发平台也就很难对其进行用户身份认证。

而Hadoop的客户端,除了Kerberos方案,剩下的Simple认证方案,实际上并不真正识别用户的身份(比如你只需要通过环境变量设置宣称自己是用户A,Hadoop就允许你操作用户A的数据)。那么不上Kerberos就没法处理了么?

也不完全如此,如果用户的需求是简单的文件存储工作,那么我们可以考虑通过对象存储服务的方式来支持,用户身份的认证在对象存储服务中实现,由对象存储服务代理用户在HDFS集群上进行文件读写操作。但如果用户就是需要灵活的Posix模式的文件读写服务,那显然,就要在HDFS自身服务方面动脑筋了。是封装客户端还是改造服务端,取决于具体的安全需求程度和实现代价

基于服务端的改造通常对用户的透明性好一些,安全性也更强一些(因为别人可以不用你封装好的客户端。当然,也可以在服务端加上客户端的ID识别之类的工作来加强防范)。比如,如果我们相信业务方自己不会滥用账号,我们的目的只是防止各个业务方之间无意的互相干扰和误操作,那么在服务端进行用户身份和IP来源的绑定鉴定(即特定用户只能由特定IP的机器使用),结合Hadoop自身的Posix文件权限管理模式,基本就能达到目的。当然,服务端的管控还可以想到更多的其它方案,这就需要结合你的业务环境,运维成本和技术代价等进行判断选择了。

再比较一下底层统一权限管控平台和基于开发平台进行边界权限管控的优缺点 首先,Ranger等方案,主要依托大数据组件自身的方案,Hook进执行流程中,所以管控得比较彻底,而开发平台边界权限管控,前提是需要收拢使用入口,所以论绝对安全性,如果入口收不住,那么不如前者来得彻底。不过通常来说,为用户提供统一的服务入口,不光是安全的需要,也是开发平台提高自身服务化程度和易用性的必要条件。

其次,底层权限统一管控平台,因为依托的是大数据组件自身的方案,并不收拢用户交互入口,所以身份认证环节还是需要依托类似Kerberos这样的系统来完成。而开发平台服务方式,收拢了入口,就可以用比较简单方式自行完成身份认证,如前所述,相比涉及到三方交互的分布式身份认证机制,通常实现代价会更低一些。

再次,大数据组件自身的权限方案,权限验证环节通常发生在任务实际执行的过程中,所以流程上基本都是在没有权限的时候抛出一个异常或返回错误,因此不太可能根据业务场景做更加灵活的处理。

而开发平台服务方式,权限的验证如果可以做到在执行前阶段(比如通过语法分析获得)进行,那么流程上就可以灵活很多,可以结合业务相关信息提供更丰富的调控手段。

例如,业务开发过程中,在代码编辑或保存时就可以进行相关权限验证和提示,避免在半夜任务实际执行时才发现问题。也可以定期批量审计脚本任务,或者根据业务重要程度对缺乏权限的情况进行区别对待:提示,警告,阻断等等。简单的说,就是你想怎么做就怎么做。而Ranger等基于底层组件进行Hook的权限架构方案,一来没有相关业务信息无法做出类似决策,二来考虑通用性,很多平台环境相关业务逻辑不可能也不适合绑定进来。

当然,这两种方案并不是互斥的,如何定义你的产品,如何拆分各种需求,对你选择权限管控方案也有很大的影响。更常见的情况是,你会需要一个混合体,取长补短,弥补各自的不足之处。

小结 总体来说,在开发平台上进行边界权限管控,并不是因为这种方式更安全,而是因为它更灵活,与业务和流程的兼容适配性更好,对底层组件自身权限管控能力的依赖性也更小。甚至还可以根据业务逻辑针对性定制权限管控策略,但是因为自身通常并不深度Hook具体组件内部执行逻辑,所以部分场景可能无法有效的进行管控(比如二进制代码任务无法从外部解析其读写逻辑),就需要和底层组件权限管控方案结合起来实施。

换个角度来说,这也是在开发平台的产品化过程中,很多任务我们会希望尽可能SQL化/脚本化/配置化的推动动力之一。一方面SQL化/脚本化/配置化有助于降低用户的开发成本,可以做一些系统层面的自动优化,沉淀知识和最佳实践。另一方面,有了可供解析语义的文本,也便于根据语义进行权限管理,尽可能完善平台边界权限管控的能力和范围。

作者:Albert陈凯 著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转自
https://cwiki.apache.org/confluence/display/SENTRY/Sentry+Tutorial

上一篇下一篇

猜你喜欢

热点阅读