外部用户如何通过IAM委托实现对OBS服务的细粒度访问控制
华为云的 对象存储服务(OBS)是基于华为云的 统一身份认证(IAM)进行的用户管理和认证,那么对于非华为云IAM体系的外部用户(例如 Hadoop Kerberos 用户),如何来访问OBS服务并实现OBS服务的细粒度访问控制呢?
回答这个问题,本质需要从内、外两个方面进行考虑:
内部而言,OBS的细粒度访问控制通过什么方式来实现?
外部而言,外部用户系统如何与问题一答案的细粒度访问机制实现关系映射?
对于问题一,拙作博文“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资源权限的客户需求,最简单的方式为:
根据外部客户的OBS资源权限需求总数N,创建N 个IAM用户组,每个用户组中包含一个IAM用户
根据外部客户的权限需求,为N 个IAM用户组授权N 个不同的IAM OBS细粒度访问策略
使用外部客户信息的客户端程序,通过配置文件或者在程序中定制的方式,记录下每一个IAM用户组下的每个IAM用户的认证信息(永久AK/SK、或者用户名/密码)
基于步骤3得到的IAM用户认证信息,客户端程序使用OBS的SDK,即可实现对OBS资源的预期细粒度访问
这里需要注意的是:每个华为云企业账户,默认能够创建的“最大IAM用户组数“ 和 “最大IAM用户数”都为50,如果不同权限的外部用户数大于50,则需要客户提前向华为云提出IAM用户组和IAM用户数上限的扩容申请。
这个方案虽然简单,但是在实际项目的OBS解决方案确定过程中,存在以下的问题让客户不能接受:
在一些华为云的客户中,“用户组/用户的管控者”与“具体业务(例如OBS)的使用者”并非一个团队,前者不同意为后者创建多个专用的IAM用户组/IAM用户。
例如华为云的客户公司A,在华为云上对应的企业账号为TenantA,该公司有多个基于华为云的业务开发团队。其中北京的团队s专门负责TenantA下的权限认证管理,充当IAM Administrator的角色,负责为公司A的其他各个业务开发团队,创建和管理各自对应的一个或有限几个IAM用户组/IAM用户。
公司A的大数据团队t位于上海,要使用华为云OBS来开发大数据业务,就有上百个 Hadoop Kerberos用户 --> 不同的IAM的OBS策略 的映射关系需求,但是团队s不同意单独为团队t创建上百个IAM用户组/IAM用户每一个创建的IAM用户,其认证信息(无论是永久AK/SK,还是IAM用户名/密码)属于敏感的关键信息,无论是保存在客户端程序中,还是保存在配置文件中,都存在安全风险让客户无法接受
所以,如果存在我们优先需要寻找另外能够解决上述问题的可行方案
“外部用户和IAM委托映射”方案的可行性分析
IAM委托最简单易懂的理解描述如下:“华为云账户A的IAM管理员”委托“华为云账户B”或“华为云服务S”,代表账户A,对云账户A所拥有的指定的华为云服务资源进行使用。这里有几点先澄清一下:
委托方是企业账户A下具有IAM管理员权限的人,可以是企业老板自己(账户A)、董事会(admin用户组)成员,也可以是专职的IAM管理员——IAM管理员本身可能只是一个普通的IAM用户,并不具备目标云服务资源的使用权,但是他作为IAM管理员,拥有对所有云服务资源进行授权的权力。
这里的被委托方可以是云账户,也可以是云服务,它们在委托关系中的地位是完全等同的,为了便于理解,我们以下统称为“被委托方”。
能够被委托的云服务资源,包括企业账户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:
然后登录该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细粒度访问策略,但是这样将会导致下面两个问题:
这台被委托的ECS,获得的授权只有自于agency_to_ecs 委托中的单个OBS访问策略。但是对于每个不同的外部用户,所需要的OBS访问权限是各不相同的。
所以不同的外部用户,调用客户端程序时,都需要调用IAM API接口,将这台被委托的目标ECS进行委托设定的变更(即变为agency_2
、agency_3等),或者ECS的委托名agency_to_ecs保持不变,但是需要修改agency_to_ecs委托对应的IAM OBS策略——对于有多个不同权限外部用户的场景,这样的委托工作效率是很低下的。
并且,这样的一个ECS是无法同时响应“多个外部用户获取不同OBS访问权限临时认证信息”的请求
于是,我们通过将多个原始的IAM委托关系包装到一个二次委托中,就可以解决这个问题。具体的方案如下:
IAM管理员针对N个外部用户的OBS权限需求,创建N个IAM OBS访问策略
IAM管理员创建N个IAM委托,委托类型为“账户委托”,委托目标为企业账户A自己,每个委托分别授予步骤一创建的不同的IAM OBS策略
按照IAM官网的分配委托权限,IAM管理员创建一个专用的IAM策略,其中的 Resource --> url JSON数组中包含步骤二创建的所有委托ID
IAM管理员创建委托类型为“云服务”的委托,将步骤三创建的策略授权给“全局服务”--> “全局”项目
IAM管理员设定目标ECS的委托为步骤4创建的IAM委托
每个外部用户要获取不同的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/ 目录的策略
步骤二: 企业账户A下的IAM管理员,创建委托 obs_role_a 和 obs_role_b,分别在对象存储服务中授权为之前创建的策略a和b。
这里特别注意的是,'委托的目标账号是企业账户A自己,这样做的目的是为了让后面的ECS,能够基于一个二次委托能够进行不同的角色切换,从而得到不同角色的OBS访问权限对应的ak/sk/SecurityToken
步骤三:企业账户A下的IAM管理员,创建分配委托权限(即二次委托)的策略,该策略的 Resource->uri 数组中包含了两个原始委托的id
步骤四:然后基于此策略创建针对“ECS云服务”的二次委托 default_role
步骤五:选择一台目标ECS虚拟机,并为该节点配置 default_role 委托
这个动作完成之后,也就完成了所谓的 “在IAM上对op_svc_ecs帐户授权,并对相应的云服务器资源进行授权委托管理”这个获取ECS的/securitykey元数据操作的预置条件
步骤六:登录目标ECS虚拟机后,在其上执行 curl http://169.254.169.254/openstack/latest/securitykey 命令后,就可以得到ECS自身的委托认证ak/sk/securityToken信息
步骤七:编写使用IAM API的客户端代码,基于步骤六得到的ECS的委托认证信息,向IAM发送获取临时AK/SK和securitytoken的API请求。
在这个请求的 Http Request Body中指定了ECS将要切换的目标委托角色(委托名 obs_role_a)
步骤八:在目标ECS虚拟机上,执行步骤七的客户端代码,就能通过ECS的委托认证鉴权信息,获取访问OBS资源的临时ak、sk和securityToken了
得到的这套认证信息所具有的OBS资源访问权限,和委托 obs_role_a 的OBS访问权限完全对应,即步骤一中创建的policy-obs-a策略——只能对obs-multiple-zone这个桶内 obs-a/ 目录下的所有文件执行指定的对象操作
注意事项
IAM默认每个企业账户能够创建的IAM委托数为50,如果客户的不同权限外部用户数很多,那就需要提前向华为云申请,对该企业账户下的委托数上线进行扩容。
- 点赞
- 收藏
- 关注作者
评论(0)