Elasticsearch已死,Elasticsearch的Open Distro万岁

2021-01-16 03:31:23

TLDR:对Elasticsearch的开源替代方案的需求最近变得越来越明显。将Open Distro for Elasticsearch捆绑在一起的平台能够为自由文本搜索和Elasticsearch提供面向未来的开源支持。在本文中,我们描述了Hopsworks如何利用Open Distro中对Elasticsearch的身份验证和授权支持,使自由文本搜索成为Hopsworks中基于项目的多租户服务。更具体地讲,Hopsworks现在通过在Elastic Search的开放发行版(ODES)的基础上支持动态的基于角色的访问控制(RBAC)来对Elasticsearch中的索引进行处理,而不会影响性能。

在2021年1月,Elastic从Elasticsearch和Kibana的Apache V2开源许可证切换到服务器端公共许可证(SSPL)的非开源许可证。

Hopsworks是一个开源平台,其中包括适用于Elasticsearch的Open Distro(Elasticsearch的分支)和Kibana。

在Hopsworks中,我们使用Elasticsearch为AI资产(功能,模型,实验,数据集等)提供自由文本搜索。我们还使Elasticsearch索引可供Hopsworks中运行的程序使用。在我们解释时,后一种功能意味着我们违反了SSPL的许可条款:

“如果您将本程序的功能或修改的版本作为服务提供给第三方...(适用许可条件)”

幸运的是,我们最近已从Elasticsearch切换到适用于AWS(已获得Apache v2许可)的Elasticsearch的Open Distro。

Open Distro for Elasticsearch支持Active Directory和LDAP进行身份验证和授权。使用安全性插件,您可以使用RBAC来控制用户可以执行的操作。角色定义用户可以执行的集群操作和索引操作,包括对索引的访问,甚至是细粒度的字段和文档级访问。 RBAC允许管理员定义一个安全策略并将其应用于部门的所有成员。但是个人可能是多个部门的成员,因此可以为用户分配多个角色。使用基于角色的动态访问控制,您可以更改用户在给定时间可以拥有的角色集。

例如,如果用户是两个部门的成员-使用动态RBAC,一个部门用于访问银行数据,另一个部门用于访问交易数据,则可以限制该用户在给定时间仅担任这些角色之一。例如,决定用户担任哪个角色的策略可能取决于用户登录到哪个VPN(虚拟专用网络)或用户所在的建筑物。实际上,动态角色将允许用户仅持有一次扮演一个角色,并在银行或交易领域内将她沙箱化。这样可以防止她在不同的贸易和银行领域之间交叉链接或复制数据。

Hopsworks通过其基于项目的多租户安全模型实现了基于角色的动态访问控制模型。每个项目都有一个拥有完全读写特权的所有者和零个或多个成员。项目所有者可以以数据科学家(只读特权和运行作业特权)或数据所有者(完全特权)的身份邀请其他用户加入他/她的项目。用户可以是(或拥有)多个项目的成员,但是在每个项目中,每个成员(用户)都有一个唯一的身份-我们称之为项目用户身份。例如,项目A中的用户Alice与项目B中的用户Alice不同-(实际上,系统范围(项目-用户)标识分别是ProjectA__Alice和ProjectB__Alice)。

这样,每个项目用户身份实际上都是具有项目级特权的角色,可以访问该项目中的数据并运行该程序。如果用户是多个项目的成员,则实际上她具有多个可能的角色,但是在Hopsworks中执行操作时,一次只能激活一个角色。用户执行某项操作(例如,运行程序)时,将以项目用户身份执行该操作。也就是说,该操作将仅具有与该项目关联的特权。下图说明了爱丽丝对于她所属的两个项目(A和B)中的每个人如何具有不同的身份。每个项目都包含自己的独立私有资产。爱丽丝一次只能使用一个身份,以确保她不能同时访问两个项目中的资产。

Hopsworks使您可以使用基于项目的访问控制安全模型(基于动态角色的访问控制的实现)在共享群集中托管敏感数据。在Hopsworks中,项目是带有成员,数据,代码和服务的安全沙箱。与GitHub存储库类似,项目是自助服务:用户管理成员资格,角色,并可以与其他项目安全地共享数据资产。这种基于项目的多租户安全模型使用户可以在单个Hopsworks群集中托管敏感数据和共享数据-您无需管理和支付单独的群集。

基于项目的多租户的一个重要方面是可以在项目之间共享资产-共享并不意味着数据是重复的。可以在项目之间共享的当前资产是:HopsFS中的文件/目录,Hive数据库,功能存储和Kafka主题。例如,在下图中,有三个用户(User1,User2和User3)和两个项目(A和B)。 User1是项目A的成员,而User2和User3是项目B的成员。所有三个用户(User1,User2,User3)可以访问项目A和项目B之间共享的资产。由于共享并不意味着复制,因此访问控制更新资产的规则,以使其他项目中的用户具有对共享资产的读取或写入权限。

项目用户身份主要基于Hopsworks内部发布的X.509证书。但是,访问控制策略是由平台服务(HopsFS,Hive,Feature Store,Kafka)实现的,对于Elasticsearch Open Distro,权限是使用基于开源Hopsworks项目的授权程序插件来管理的。

以下PySpark代码片段(在您在Hopsworks上运行Spark Tour时可作为笔记本使用)显示了如何从PySpark私有的项目索引中读取。还有一个等效的Scala / Spark笔记本。

-CODE language-bash-从跃点导入elasticsearch,hdfs df = spark.read.option(" header"," true")。csv(" hdfs:/ // Projects /" + hdfs.project_name()+" /Resources/akc_breed_info.csv")#将df写入项目的私有索引,称为' newindex' df.write.format(' org.elasticsearch.spark.sql')。options(** elasticsearch.get_elasticsearch_config(" newindex"))。mode(" Overwrite&#34 ;)。save()#从项目的私有索引读取,该私有索引称为' newindex' reader = spark.read.format(" org.elasticsearch.spark.sql")。 options(** elasticsearch.get_elasticsearch_config(" newindex"))df = reader.load()。orderBy(" breed")df.show()

在Hopsworks中,我们使用带有X.509证书的公钥基础结构(PKI)对用户进行身份验证和授权。 Hopsworks集群中的每个用户和每个服务都有一个私钥和一个X.509证书。 Hopsworks项目还支持当前不受X.509证书支持的多租户服务,包括Elasticsearch。 Open Distro for Elasticsearch支持使用JSON Web令牌(JWT)进行身份验证和访问控制。与应用程序X.509证书类似,Hopsworks的资源管理器(HopsYARN)为每个提交的作业发布JWT,并将其传播到正在运行的容器中。然后,使用JWT,用户代码可以安全地调用项目所拥有的Elasticsearch索引。 JWT在到期之前自动旋转,并且在应用程序完成后由HopsYARN使其失效。

对于每个Hopsworks项目,可以在Elasticsearch中创建许多私有索引:该项目中应用程序实时日志的索引(可通过Kibana访问),该项目中ML实验的索引以及该项目的出处索引。项目的应用程序和文件操作。弹性索引是项目专用的-非项目成员的用户无法访问它们。此访问控制的实现方式如下:当使用JWT令牌在Elasticsearch上进行请求时,我们的授权程序插件会从JWT令牌中提取特定于项目的用户名,格式为:

我们的插件通过检查用户和索引的前缀(ProjectA)是否彼此匹配,来检查是否允许特定于项目的用户读取/写入索引。我们计划通过存储允许在属于一个项目的索引上分别执行读取和写入操作的项目列表来增加对项目之间共享Elasticsearch索引的支持。

在Hopsworks中,服务使用自己的证书相互通信以对所有流量进行身份验证和加密。 Hopsworks中支持TLS加密和/或身份验证的每个服务都有其自己的特定于服务的X.509证书,包括ELK堆栈中的所有服务(Elasticsearch,Kibana和Logstash)。服务证书包含安装它们的主机的完全合格域名(FQDN)和运行过程的系统用户的登录名。它们是在用户设置Hopsworks时生成的,并且它们的寿命很长。可以按可配置的时间间隔或根据管理员的要求自动轮换服务证书。

通过将Hopsworks配置为使用可用的身份验证机制之一,可以将其与Kubernetes集成:适用于AWS的EKS托管产品的API令牌,凭证,证书和IAM角色。 Hopsworks可以在Kubernetes上运行用户的作业,这些作业具有特定于项目的安全性材料,X.509证书和JWT,它们已实现到启动的Pod中,因此用户代码可以安全地访问Hopsworks中的服务,例如Open Distro for Elasticsearch。也就是说,仅允许从Hopsworks中的项目内启动的Kubernetes作业访问属于该项目的那些Elasticsearch索引。

在本文中,我们概述了基于Hopsworks项目的多租户安全模型,以及如何使用Hopsworks项目和JWT令牌使Open Distro for Elasticsearch成为多租户服务。