cover_image

Kerberos和Apache Sentry干货实践(下)

张博雅 马大芳 HaoDF技术团队
2020年08月19日 03:56

上文:Kerberos和Apache Sentry干货实践(上)》,主要介绍了Kerberos原理及搭建过程,本文继续讲解Apache Sentry以及其如何和Kerberos配合进行访问权限控制的。


一、Apache Sentry是什么?




Apache Sentry提供了大数据组件访问的权限控制。与Kerberos不同的是,当A组件去访问B组件时,Kerberos承载的身份认证完成,确保A组和B组的身份不被假冒后,Sentry来管理A有哪些权限,能够访问B组件上的哪些内容。


Apache Sentry是Cloudera公司发布的一个Hadoop开源组件,2016年3月成为Apache顶级项目。Sentry是一个基于角色的粒度授权模块,提供了对Hadoop集群上经过身份验证的用户提供了控制和强制访问数据或数据特权的能力。它可以与Hive、Impala、Solr、HDFS和HBase集成。Sentry旨在成为可插拔授权引擎的Hadoop组件。允许定义授权规则以验证用户或应用程序对Hadoop资源的访问请求。


二、特性




a) 用户和组映射


Sentry依靠底层身份验证系统(如Kerberos或LDAP)来识别用户。它还使用Hadoop中配置的组映射机制来确保Sentry看到与Hadoop生态系统的其他组件相同的组映射。


举个例子,假设用户A和用户B属于名为finance的组(Group),我们需要为这两个用户赋权查询Sales表,操作如下,在Sentry中,我们可以创建一个名为Analyst的角色(Role),并将Sales表SELECT权限授予Analyst角色,再将Analyst角色授予finance组。


b) 基于角色的访问控制


基于角色的访问控制(RBAC)是一种强大的机制,用于管理企业中大量用户和数据对象的授权。RBAC使得对添加或删除数据对象,用户加入或离开组织的管理更加容易。


继续上面的例子,如果新员工C加入财务部门,我们需要做的就是将他添加到finance组。这就可以实现员工C访问Sales表中的数据。

 

c) 统一授权


Sentry的另一个重要方面是统一授权。访问控制规则一旦定义,就可以跨多个数据访问工具工作。


三、Sentry架构




图片

 

a) 组件

  • Sentry Server:Sentry RPC服务器,管理授权元数据,支持安全检索和操作元数据的接口;

  • Policy metadata:存储权限策略数据,我们将权限元数据存放在Sentry Server机器上MySQL数据库的Sentry库中;

  • Data Engine:数据处理应用组件,如Hive或Impala,需要授权访问数据或元数据资源。数据引擎加载Sentry插件,拦截所有访问资源的客户端请求并将其路由到Sentry插件进行验证;

  • Sentry Plugin:Sentry插件在对应的组件(如Hive)中运行。它提供了操作存储在Sentry服务器中的授权元数据的接口,包括授权策略引擎,该引擎使用从Sentry Server拉取授权元数据来评估访问请求。

 

b) 关键概念

  • Privilege:允许访问对象的指令或规则;

  • Role:一组Privilege的集合抽象成Role,用于组合多个访问规则的模板;

  • User:由认证系统(Kerberos)识别的用户;

  • Group:由身份验证系统(Kerberos)维护的一组用户;

  • Authorization models:定义要受授权规则约束的对象以及允许的操作粒度。例如,在SQL中,对象可以是服务,数据库,表或者列,操作是SELECT,INSERT和CREATE 等。

 

c) 参与授权的角色

  • Resource:资源是您要管理访问权限的对象;

  • Privilege:默认情况下,Sentry不允许访问任何资源,除非明确授予。权限本质上是授予对资源的访问权限的规则;

  • Role:角色是一组Privilege;

  • Group:组是用户的集合。Sentry组映射是可扩展的。默认情况下,Sentry利用Hadoop的组映射(可以是OS组或LDAP组)。Sentry允许将角色与组关联,可以将多个用户组合到一个组中。


注意:Sentry仅支持基于角色的访问控制,无法直接向用户或组授予权限,需要在角色下组合权限。只能将角色授予组,而不能直接授予用户。

 

d) 具体实现思想

Sentry将自己的Hook函数插入到各SQL引擎的编译、执行的不同阶段。这些Hook函数起两大作用:一是起过滤器的作用,只放行具有相应数据对象访问权限的SQL查询;二是起授权接管的作用,使用了Sentry之后,grant/revoke管理的权限完全被Sentry接管,grant/revoke的执行也完全在Sentry中实现;对于所有引擎的授权信息也存储在由Sentry设定的统一的数据库中,这样所有引擎的权限就实现了集中管理。


四、Sentry与Hadoop生态系统的集成




Apache Sentry可以与多个Hadoop组件一起工作。从本质上讲,Sentry Server存储着授权元数据,并提供API工具以安全地检索和修改此元数据。


图片


a) Hive和Sentry

  • 查询授权:Sentry Policy Engine 通过 Hook 函数插入Hive,HiveServer2在查询成功编译后执行 Hook 函数。Hook 函数获取查询以读写模式访问的对象列表。Sentry Hive Binding 将此转换为基于SQL权限模型的授权请求。

  • 策略操作:在查询编译期间,Hive调用Sentry的授权任务工厂,该工厂生成在查询处理期间执行的Sentry特定任务。调用Sentry存储客户端,向 Sentry 服务发送 RPC 请求,以进行授权策略更改。

 

b) Impala和Sentry

Impala中的授权处理与Hive中的授权处理类似。主要区别在于权限的缓存。Impala的Catalog服务管理缓存schema元数据并将其传播到所有Impala Daemon节点。此Catalog服务也缓存Sentry元数据。因此,Impala的授权在本地就可以实现,速度更快。


图片


c) Sentry-HDFS

Sentry-HDFS授权主要针对Hive仓库数据 - 也即Hive或Impala中表的数据。Sentry与HDFS的集成的真正目标是将相同的授权检查扩展到从任何其他组件(如Pig,MapReduce或Spark)访问Hive仓库数据。基于这一点可以利用HDFS已有的ACL功能,但与Sentry无关的表将保留其旧ACL。


图片



Sentry权限与HDFS ACL的映射关系如下:

  • SELECT -> 文件的Read权限;

  • INSERT -> 文件的Write权限;

  • ALL -> 文件的Read和Write权限

NameNode会加载一个Sentry插件,用于缓存Sentry权限以及Hive元数据。这有助于HDFS保持文件权限和Hive表权限同步。Sentry插件定期轮询Sentry以保持元数据更改同步。


五、Kerberos启用下的Sentry使用实践




a) 集成背景

hive,hdfs,hbase 分别是HIVE,HDFS,HBASE组件默认的超级管理员用户,同时os也存在其hive,hdfs,hbase用户和用户组,同时Kerberos在安装时会自动创建admin/admin的kerberos超级用户,和名为【组件/_HOST】的组件用户(例如hive/cdh1,hbase/cdh2)。


Sentry实际上是沿用的Hadoop的用户和组,而Hadoop沿用了Linux的用户和组,当我们需要在Sentry中使用某个用户时候,需要确认该用户在Linux是否存在,以及Kerberos中是否有该用户的principle。

 

b) Sentry与Hive

进入hive当前HIVESERVER2进程的执行文件夹,该文件夹下会存在一个叫做hive.keytab的文件,通过该文件能以hive(hive组件的超级用户)登录Kerberos KDC拿到 TGT。在Kerberos认证成功后,通过beeline登录hive,创建不同的role并赋予不同的权限。


cd /var/run/cloudera-scm-agent/process/ && cd `ls -t1 | grep -e "-HIVESERVER2"`kinit -kt hive.keytab hive/cdh# 例如创建只读账号userread,我们需要在Linux用户中添加用户,并在Kerberos中将该用户添加为一个principle:useradd userreadkadmin.local > addprinc userread (password: userread)
# 生成keytab(默认在/etc下面)kadmin.local > xst -k dev.keytab -norandkey userread@CDH.COM
# 登录hivebeeline > !connect jdbc:hive2://localhost:10000/;principal=hive/cdh1beeline > create role readrole;beeline > grant select on server server1 to role readrole;beeline > grant role readrole to group userread;
# 如果想规定 只读/只写/创建/所有权限 某个 集群/库/表:grant select/insert/create on server/database/table servername/databasename/tablename to role somerole;



由于impala属于hive组的成员,所以在hive中对userread用户赋权,userread用户同时拥有hive和impala的权限。

 

c) Sentry与HDFS

HUE登陆admin用户(admin用户是HUE的超级管理员,但不是HIVE,HBASE,HDFS等的超级管理员)


图片



创建用户hive(HIVE的超级管理员),用户hdfs(HDFS的超级管理员),用户hbase(HBASE的超级管理员),impala(IMPALA的超级管理员),dev(日常开发维护用户)


图片



密码是自定义的,只用于登陆HUE:


图片



这个地方的superuser指的是HUE的superuser,代表着是否有权限管理HUE里面的用户:


图片



HDFS文件URL授权(以下给dev用户授权/Data目录的读写权限为例):

首先要以hdfs身份登陆HUE,这是HDFS默认的超级管理员(虽然在HUE里面只是HUE的一个普通用户)。


点击安全性,进入授权界面:


图片



HDFS文件授权,点中需要更改权限的目录,右边会显示当前更改权限的目录和加号➕:


图片



添加好权限之后,点击保存:


图片



成功添加权限后,目录这一行会有一个小盾牌:


图片


此时dev对/Data目录已经有读写执行的权限了,具体验证就在此省略。


六、总结




到此,Kerberos和Apache Sentry的原理、搭建和使用就已经介绍完了,目前好大夫在线的大数据集群已经集成Kerberos和Apache Sentry并稳定运行了一段时间。通过本次对集群的安全升级,使得公司的数据资产更加的安全可靠。


【作者简介】

  • 张博雅:好大夫在线大数据开发工程师,涉猎技术包括分布式实时离线计算,数据仓库建设,数据安全等,喜欢研究解决大数据组件相关问题。


  • 马大芳:好大夫在线大数据开发工程师,专注大数据领域,主要关注Kafka/Spark/HBase等开源组件,热爱技术和探索。


更多好大夫技术人一手干货文章,请关注“HaoDF技术团队”微信公众号,让我们一起用“科技创造优质医疗”!

好大夫在线创立于2006年,是中国领先的互联网医疗平台之一。已收录国内10496家正规医院的69.2万名医生信息。其中,23万名医生在平台上实名注册,直接向患者提供线上医疗服务。“让行医简单,看病不难” ,始终追求“成为值得信赖的医疗平台”。

安全 · 目录
上一篇Kerberos和Apache Sentry干货实践(上)下一篇解构开源IAST 打造好大夫安全灰盒利器
继续滑动看下一个
HaoDF技术团队
向上滑动看下一个