在2017年,当Kudu作为CDH的一部分首次引入时,它不支持任何形式的授权,因此仅满足空白且不需要安全的用例。在CDH 5.11(Kudu 1.3.0)中添加了粗粒度的授权和身份验证,这使得可以仅对可以应用Apache Sentry策略的Apache Impala进行访问限制,从而启用了更多的用例。接着,Sentry直接集成在CDH 6.3中,使客户可以使用任何查询方法以相同的特权访问Kudu。最后,在CDP Private Cloud Base 7.1.5和7.2.6中,Kudu与Ranger完全集成。在本文中,我们将介绍其工作原理以及设置方法。
怎么运行的
Ranger由具有Web UI和REST API的管理服务器组成,管理员可以使用REST API创建策略。这些策略存储在数据库中,并由运行在Kudu Masters上的Ranger插件定期提取和缓存。
Ranger插件负责根据缓存的策略授权请求。Ranger插件仅在Java中可用,因为大多数Hadoop生态系统项目(包括Ranger)都是用Java编写的。与我们在C 中重新实现的Sentry瘦客户端不同,Ranger插件本身在本地处理策略的评估(比Sentry策略更加丰富和复杂),因此我们决定不在C 中重新实现。每个Kudu Master都产生一个JVM子进程,该子进程实际上是Ranger插件的包装,并通过命名管道与其进行通信。
使用Ranger设置Kudu
在Cloudera Manager中为Kudu设置Ranger授权非常简单。如果Ranger和Kudu都安装在CDP中,则需要在Kudu的配置中选择Ranger服务。
Cloudera Manager将自动为Kudu配置Ranger,反之亦然。其余的Ranger特定选项无需更改。在后台,为Kudu创建了几个可自定义的配置文件(ranger-kudu-security.xml,ranger-kudu-policymgr-ssl.xml和ranger-kudu-audit.xml)。
建立策略
设置完集成后,就该创建一些策略了,因为现在仅允许受信任的用户执行任何操作。其他所有人都被锁定。可以在Ranger中为Kudu设置基于资源的访问控制(RBAC)策略,但是Kudu当前不支持基于标签的策略、行级过滤或列掩码。
要创建您的第一个策略,请登录到Ranger Admin(可通过从Cloudera Manager导航到Ranger服务,然后在该服务的标签导航面板中单击“ Ranger Admin Web UI”来访问它),然后单击“ cm_kudu”服务,然后点击右上角的“添加新策略”按钮。您需要命名策略并设置将应用到的资源。Kudu不支持数据库,但是启用了Ranger集成后,它将把表名中第一个句点之前的部分作为数据库名,如果表名不包含句点,则默认为“默认”(这是可以使用“ gflagfile的主高级配置代码段(安全阀)”中的-ranger_default_database标志进行配置)。
资源中没有隐式层次结构,这意味着授予db = foo的特权并不意味着授予foo.bar的特权。要创建适用于foo数据库中所有表和所有列的策略,您需要为db = foo-> tbl = *-> col = *创建策略。要创建以foo开头的表,只需在db = foo上授予“ create”特权,并且不需要表级特权。仍应在db = foo-> tbl = *上授予元数据,因为需要检查新创建的表是否存在,这是表创建的最后一步。
有关执行操作所需特权的列表,请参阅我们的文档。
一旦在Ranger中设置了策略,Kudu将在使用任何客户端授权操作时应用这些策略。但是,Impala的工作原理有所不同。
在Impala中访问Kudu表
Impala不仅是Kudu客户端,它还是一个支持多个存储系统的分析数据库,包括但不限于Kudu。它还会在执行之前使用Ranger授权所有动作。因此,不需要第二个特定于Kudu的授权步骤,并且“ Impala”用户在Kudu中被列入白名单,从而在Impala尝试执行操作时绕过Kudu授权。
重要的是要注意,Kudu在内部存储其所有元数据,而Impala依赖于Hive Metastore。因此,Impala会针对Hadoop SQL存储库中的策略授权请求,包括对Kudu支持的表的请求。
让我们以一个常见用例为例:几个Apache Spark ETL作业在Kudu中存储数据。然后,其他Spark作业以及数据分析人员也会通过临时Impala查询访问此数据。在这种情况下,可以设置Kudu策略,以允许ETL用户读写所有表中的数据,并且为不同的人群定义了单独的Hadoop SQL策略,以通过Impala读取特定的数据库或表。
表的所有权
Ranger支持通过特殊的{OWNER}用户向表所有者授予特权。例如,您可以授予db = *-> table = *-> column = *上的{OWNER}的ALL特权并委派admin(更改表的所有者是必需的)。这样,您的用户将能够在他们创建的表上执行任何操作,而不必显式地为每个表分配特权。当然,他们将需要被授予db = *或特定数据库上的CREATE特权,才能真正创建自己的表。表是创建表的用户自动拥有的,尽管可以将其所有者更改为alter table操作的一部分。
结论
安全性是数据平台中非常重要的部分,我们在Cloudera,我们了解这些。我们一直在努力使CDP更加安全,并且在保持安全性的同时更易于管理。在Kudu中使用Ranger进行细粒度的授权是这项工作的最新步骤,并且在不久的将来还会有更多事情要做,因此请留意未来的帖子,我们将在其中分享有关下一步工作的更多信息。
原文作者:Attila Bukor
原文链接:https://blog.cloudera.com/fine-grained-authorization-with-apache-kudu-and-apache-ranger/