外部用户如何通过IAM委托实现对OBS服务的细粒度访问控制

举报
晓望峰 发表于 2019/11/26 17:58:26 2019/11/26
【摘要】 华为云的 对象存储服务(OBS)是基于华为云的 统一身份认证(IAM)进行的用户管理和认证,那么对于非华为云IAM体系的外部用户(例如 Hadoop Kerberos 用户),如何来访问OBS服务并实现OBS服务的细粒度访问控制呢,本文将对此话题进行理论分析和实践展示

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


回答这个问题,本质需要从内、外两个方面进行考虑:

  1. 内部而言,OBS的细粒度访问控制通过什么方式来实现?

  2. 外部而言,外部用户系统如何与问题一答案的细粒度访问机制实现关系映射?


       对于问题一,拙作博文“OBS服务细粒度访问控制的两种实现方法的对比”已经进行了详细的分析,得出的结论是:使用IAM的OBS策略实现OBS资源的细粒度访问控制

       那么问题二,外部用户系统如何与IAM的OBS策略实现关系映射呢?本文将对此进行详细的分析。


理论分析

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

       

“外部用户和IAM用户组映射”方案的可行性分析

       因为IAM体系中能够被IAM策略授权的是IAM用户组,而非单个IAM用户,所以一个外部用户(例如一个Hadoop Kerberos用户)需要和一个IAM用户组进行匹配,并且该用户组中只需要有一个IAM用户就可以了;而一个IAM用户要使用OBS服务资源,可以通过该用户的永久AK/SK,也可以通过该用户的用户名/密码获取临时的AK/SK/SecurityToken。所以,对于每一个外部用户需要赋予特定的OBS资源权限的客户需求,最简单的方式为:

  1. 根据外部客户的OBS资源权限需求总数N,创建个IAM用户组,每个用户组中包含一个IAM用户

  2. 根据外部客户的权限需求,为个IAM用户组授权个不同的IAM OBS细粒度访问策略

  3. 使用外部客户信息的客户端程序,通过配置文件或者在程序中定制的方式,记录下每一个IAM用户组下的每个IAM用户的认证信息(永久AK/SK、或者用户名/密码)

  4. 基于步骤3得到的IAM用户认证信息,客户端程序使用OBS的SDK,即可实现对OBS资源的预期细粒度访问

  5. 这里需要注意的是:每个华为云企业账户,默认能够创建的“最大IAM用户组数“ 和 “最大IAM用户数”都为50,如果不同权限的外部用户数大于50,则需要客户提前向华为云提出IAM用户组和IAM用户数上限的扩容申请。


      这个方案虽然简单,但是在实际项目的OBS解决方案确定过程中,存在以下的问题让客户不能接受:

  1. 在一些华为云的客户中,“用户组/用户的管控者”与“具体业务(例如OBS)的使用者”并非一个团队,前者不同意为后者创建多个专用的IAM用户组/IAM用户。
           例如华为云的客户公司A,在华为云上对应的企业账号为TenantA,该公司有多个基于华为云的业务开发团队。其中北京的团队s专门负责TenantA下的权限认证管理,充当IAM Administrator的角色,负责为公司A的其他各个业务开发团队,创建和管理各自对应的一个或有限几个IAM用户组/IAM用户。
           公司A的大数据团队t位于上海,要使用华为云OBS来开发大数据业务,就有上百个 Hadoop Kerberos用户 --> 不同的IAM的OBS策略 的映射关系需求,但是团队s不同意单独为团队t创建上百个IAM用户组/IAM用户

  2. 每一个创建的IAM用户,其认证信息(无论是永久AK/SK,还是IAM用户名/密码)属于敏感的关键信息,无论是保存在客户端程序中,还是保存在配置文件中,都存在安全风险让客户无法接受

       所以,如果存在我们优先需要寻找另外能够解决上述问题的可行方案


“外部用户和IAM委托映射”方案的可行性分析

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

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

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

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


外部用户的客户端程序,只能使用委托ak/sk签名认证,获取临时AK/SK/SecurityToken来访问OBS

       如前所述,外部用户将会使用一个客户端程序,使用OBS SDK或Rest API接口与华为云的OBS服务交互,出于信息安全考虑,客户端程序只能使用临时AK/SK/SecurityToken 来访问OBS(以下简称“获取临时认证”)。

       根据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签名认证,获取访问OBS的临时AK/SK/SecurityToken


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

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

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

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


1574756834985053.png


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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


具体实践操作

步骤一: 企业账户A下的IAM管理员,创建控制目标OBS桶(obs-multiple-zone)内的 obs-a/ 和 obs-b/ 目录的策略
1574760828871661.png


1574760922725402.png


步骤二: 企业账户A下的IAM管理员,创建委托 obs_role_a 和 obs_role_b,分别在对象存储服务中授权为之前创建的策略a和b。

这里特别注意的是,'委托的目标账号是企业账户A自己,这样做的目的是为了让后面的ECS,能够基于一个二次委托能够进行不同的角色切换,从而得到不同角色的OBS访问权限对应的ak/sk/SecurityToken

1574761045142951.png

1574761073394132.png


步骤三:企业账户A下的IAM管理员,创建分配委托权限(即二次委托)的策略,该策略的 Resource->uri 数组中包含了两个原始委托的id

1574761158119916.png


步骤四:然后基于此策略创建针对“ECS云服务”的二次委托 default_role

1574761261198938.png

1574761261777865.png


步骤五:选择一台目标ECS虚拟机,并为该节点配置 default_role 委托

这个动作完成之后,也就完成了所谓的 “在IAM上对op_svc_ecs帐户授权,并对相应的云服务器资源进行授权委托管理”这个获取ECS的/securitykey元数据操作的预置条件

1574761422218316.png


步骤六:登录目标ECS虚拟机后,在其上执行 curl http://169.254.169.254/openstack/latest/securitykey 命令后,就可以得到ECS自身的委托认证ak/sk/securityToken信息

1574761536880558.png


步骤七:编写使用IAM API的客户端代码,基于步骤六得到的ECS的委托认证信息,向IAM发送获取临时AK/SK和securitytoken的API请求

在这个请求的 Http Request Body中指定了ECS将要切换的目标委托角色(委托名 obs_role_a)

1574761750162532.png


步骤八:在目标ECS虚拟机上,执行步骤七的客户端代码,就能通过ECS的委托认证鉴权信息,获取访问OBS资源的临时ak、sk和securityToken了

得到的这套认证信息所具有的OBS资源访问权限,和委托 obs_role_a 的OBS访问权限完全对应,即步骤一中创建的policy-obs-a策略——只能对obs-multiple-zone这个桶内 obs-a/ 目录下的所有文件执行指定的对象操作

1574761897402624.png



注意事项

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


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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