MRS通过委托访问DLCatalog进行细粒度管控

举报
yami_1990 发表于 2020/11/30 11:23:13 2020/11/30
【摘要】 华为云的 数据湖Catalog(DLCatalog)是基于华为云的 统一身份认证(IAM)进行的用户管理和认证,那么对于非华为云IAM体系的外部用户(例如 Hadoop Kerberos 用户),如何来访问DLCatalog服务并实现DLCatalog服务的访问控制呢?对DLCatalog而言,在内部使用IAM的DLCatalog策略实现DLCatalog资源的细粒度访问控制;那么从外部来看...


华为云的 数据湖Catalog(DLCatalog)是基于华为云的 统一身份认证(IAM)进行的用户管理和认证,那么对于非华为云IAM体系的外部用户(例如 Hadoop Kerberos 用户),如何来访问DLCatalog服务并实现DLCatalog服务的访问控制呢?

对DLCatalog而言,在内部使用IAM的DLCatalog策略实现DLCatalog资源的细粒度访问控制;那么从外部来看,如何将外部用户与IAM上的DLCatalog策略进行关系映射

理论分析

       IAM策略是用于控制IAM用户对华为云资源访问权限的基础单元,能够被IAM策略授权的对象有且仅有两类:“IAM用户组”和“IAM委托”。因此外部用户系统要与IAM的DLCatalog策略实现关系映射,本质上就是实现“外部用户和IAM委托的映射”。

       IAM委托最简单易懂的理解描述如下:华为云账户A的IAM管理员”委托“华为云账户B”或“华为云服务S”,代表账户A,对云账户A所拥有的指定的华为云服务资源进行使用。这里有几点先澄清一下:

  1. 委托方是企业账户A下具有IAM管理员权限的人,可以是企业老板自己(账户A)、董事会(admin用户组)成员,也可以是专职的IAM管理员——IAM管理员本身可能只是一个普通的IAM用户,并不具备目标云服务资源的使用权,但是他作为IAM管理员,拥有对所有云服务资源进行授权的权力。

  2. 这里的被委托方可以是云账户,也可以是云服务,它们在委托关系中的地位是完全等同的,为了便于理解,我们以下统称为“被委托方”。

  3. 能够被委托的云服务资源,包括企业账户A手下的所有资源,自然也包含DLCatalog服务资源

外部用户的程序调用,只能使用委托用户token来访问DLCatalog

       根据IAM官方文档对于 API认证鉴权方式 和 获取临时AK/SK/SecurityToken 的描述,获取临时AK/SK/SecurityToken 这个请求本身可以使用“用户认证鉴权(用户Token或用户ak_sk签名认证)”和“委托认证鉴权(委托Token或委托ak_sk签名认证)”两种方式。同样如前所述的信息安全考虑

        (1)、不能使用IAM用户的永久AK、SK,即不能使用用户ak_sk签名来获取临时认证

        (2)、不能使用用户名/登录密码,即不能通过登陆用户用户token方式来获取临时认证;

        (3)、同样由于委托Token的获取依然需要被委托用户的密码,也不满足信息安全要求,

所以,最后那就是通过委托ak_sk签名认证,置换获取访问DLCatalog的Token

由被授权的ECS来提供委托AK/SK认证信息

       接下来的问题就是:委托的ak/sk认证信息如何得来,这个委托是如何创建的呢?

       因为不能泄露任何账户/IAM用户的永久AK/SK和登录密码,所以这个被委托方只能是某个华为云服务了。那么使用哪个云服务呢?最方便和直接的答案就是ECS服务

       在华为云ECS服务的官方文档中,给出了最简单的获取委托的临时AK/SK信息的方法,即对目标ECS设定一个委托,如下图示例的 agency_to_ecs

然后登录该ECS的shell,并执行 curl http://169.254.169.254/openstack/latest/securitykey   命令,即可获得这个作为被委托方ECS的临时AK/Sk/SecurityToken,即委托的AK/SK认证信息。接下来的问题就是,这个IAM委托的细节如何设定呢?

被委托的ECS将被企业账户分配委托权限,采用二次委托的方式来方便地在多个DLCatalog策略之间快速切换

       在之前创建的 agency_to_ecs 委托中,最简单的想法可能是,直接把某个外部用户所需要的DLCatalog权限策略授权给agency_to_ecs 委托,然后被委托的ECS不就可以基于自己的委托认证信息,使用“agency_to_ecs”这个委托名,获取访问DLCatalog资源的临时认证信息了吗

       这样做理论上当然是可以的,仍然是每一个委托对应于一个DLCatalog细粒度访问策略,但是这样将会导致下面两个问题:

  1. 这台被委托的ECS,获得的授权只有自于agency_to_ecs 委托中的单个DLCatalog访问策略。但是对于每个不同的外部用户,所需要的DLCatalog访问权限是各不相同的。

  2. 所以不同的外部用户,调用客户端程序时,都需要调用IAM API接口,将这台被委托的目标ECS进行委托设定的变更(即变为agency_2

    、agency_3等),或者ECS的委托名agency_to_ecs保持不变,但是需要修改agency_to_ecs委托对应的IAM DLCatalog策略——对于有多个不同权限外部用户的场景,这样的委托工作效率是很低下的

  3. 并且,这样的一个ECS是无法同时响应“多个外部用户获取不同DLCatalog访问权限临时认证信息”的请求

于是,我们通过将多个原始的IAM委托关系包装到一个二次委托中,就可以解决这个问题。具体的方案如下:

  1. IAM管理员针对N个外部用户的DLCatalog权限需求,创建N个IAM DLCatalog访问策略

  2. IAM管理员创建N个IAM委托,委托类型为“账户委托”,委托目标为企业账户A自己,每个委托分别授予步骤一创建的不同的IAM DLCatalog策略

  3. 按照IAM官网的分配委托权限,IAM管理员创建一个专用的IAM策略,其中的 Resource --> url JSON数组中包含步骤二创建的所有委托ID

  4. IAM管理员创建委托类型为“云服务”的委托,将步骤三创建的策略授权给“全局服务”--> “全局”项目

  5. IAM管理员设定目标ECS的委托为步骤4创建的IAM委托

  6. 每个外部用户要获取不同的DLCatalog访问权限对应的认证信息时,只需要在调用DLCatalog时,通过APIG向IAM发送获取临时Token请求时,Request Body中的 agency_name 字段设置为步骤2创建的目标委托ID即可。因为IAM能够支持多并发访问,多个外部用户自然也能够并发获取不同DLCatalog权限对应的Token

DLCatalog整流程中类似OBS的置换过程,只是最后访问本服务时所使用的是委托用户的ak/sk还是token有区别,可见:OBS服务细粒度访问控制的两种实现方法的对比给出的细粒度控制方案

注意事项

IAM默认每个企业账户能够创建的IAM委托数为50,如果客户的不同权限外部用户数很多,那就需要提前向华为云申请,对该企业账户下的委托数上线进行扩容。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。