最小化权限授权实践
实践场景及目标
某数据运营工程师专职负责数据质量监控相关工作,仅需要服务数据质量组件的操作权限。
服务的权限体系如图1所示。如果项目管理员直接赋予该数据运营工程师IAM账号“DAYU User系统角色+工作空间开发者角色”权限,则会出现如下非必需权限过大的风险:
- 依赖服务权限过大:服务作为平台型服务,DAYU User系统角色预置了依赖服务(如MRS、DWS等相关服务)的管理员权限。当为数据运营工程师IAM账号授予DAYU User系统角色后,会导致其拥有依赖服务的管理员权限。
- 服务其他组件操作权限不受控制:工作空间开发者角色默认具备该工作空间内所有组件的操作权限。当为数据运营工程师IAM账号授权工作空间开发者角色后,会导致其拥有数据质量组件之外的其他组件操作权限。
为了解决此问题,项目管理员可以按照如下解决方案进行权限最小化配置,这样既能满足实际业务使用,也避免了权限过大的风险。
- 为数据运营工程师IAM账号授予DAYU User系统角色权限,然后删除IAM账号中的依赖服务权限,再赋予依赖服务的最小权限合集。
- 在服务内,创建一个仅保留数据质量组件操作权限的自定义角色“Developer_DQC”,然后将数据运营工程师IAM账号添加为工作空间成员并赋予此角色。
操作流程
- 创建用户组并授予系统角色 User:创建数据运营工程师IAM账号所在的用户组,并授予 User权限。
- 去除用户组依赖服务权限并配置最小权限合集:为用户组去除默认的依赖服务管理员权限,然后配置最小权限。
- 创建IAM用户并加入用户组:为数据运营工程师创建IAM账号,并加入到用户组中。
- 自定义工作空间角色:在角色管理页面,新建自定义角色,仅授权某一组件权限,本案例中以数据质量为例。
- 添加工作空间成员并配置角色:将新创建的IAM用户加入到工作空间并配置为新建的自定义角色。
- 用户登录并验证权限:使用新创建的用户登录控制台,验证权限配置是否符合预期。
图2 最小化授权操作流程
创建用户组并授予系统角色 User
- 使用华为账号登录统一身份认证服务IAM控制台。
- 在IAM服务控制台中,单击“用户组”,在用户组页面单击右上方的“创建用户组”。
图3 创建用户组
- 在“创建用户组”界面,输入“用户组名称”DQC。
图4 用户组名称
- 单击“确定”,用户组创建完成,用户组列表中显示新创建的用户组。
您最多可以创建20个用户组,如果当前资源配额无法满足业务需要,您可以申请扩大配额,具体方法请参见:如何申请扩大配额?
- 在用户组列表中,单击新建用户组右侧的“授权”。
图5 进入用户组权限设置页面
- 在搜索框中输入DAYU User,勾选该系统角色,单击“下一步”。
图6 角色授权
请勿勾选“DAYU Administrator”权限,“DAYU Administrator”权限具有DataArts Studio服务的所有执行权限,不受工作空间权限管控。
- 授权范围方案选择需要授予的区域项目,单击“确定”,完成授权。
DataArts Studio部署时通过物理区域划分,为项目级服务。授权时,“授权范围方案”如果选择“所有资源”,则该权限在所有区域项目中都生效;如果选择“指定区域项目资源”,则该权限仅对此项目生效。IAM用户授权完成后,访问DataArts Studio时,需要先切换至授权区域。
图7 设置最小授权范围
去除用户组依赖服务权限并配置最小权限合集
- 在IAM服务控制台中,单击“用户组”,在用户组页面单击创建的DQC用户组名,进入用户组详情页面。
图8 进入用户组详情
- 在用户组详情页面下方的授权记录区域,条数切换到20条,展开所有14条授权记录。勾选除DAYU User外的所有依赖服务权限,并单击列表上方的删除。
图9 删除依赖服务权限
- 依赖服务权限删除成功后,返回IAM服务控制台首页,单击“权限管理 > 权限”,在权限页面单击右上方的“创建自定义策略”。
图10 创建自定义策略
- 在自定义策略配置页面,策略配置方式切换至JSON视图,然后按照如下策略内容,分别创建DataArtsStudio_PermissionsOfDependentServices_global和DataArtsStudio_PermissionsOfDependentServices_region自定义策略。
- 创建自定义策略时,暂不支持同时选全局级云服务和项目级云服务,因此需要将依赖服务自定义策略拆分为两条分别创建。
- 策略内容来自于DataArts Studio服务各组件功能所需依赖服务的最小权限,详情请参见权限管理。
图11 创建自定义策略示例
-
依赖的全局级(global级)云服务的自定义策略DataArtsStudio_PermissionsOfDependentServices_global:
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:object:GetObject", "obs:object:PutObject", "obs:object:DeleteObject", "obs:bucket:GetBucketStorage", "obs:bucket:GetBucketLocation", "obs:bucket:ListAllMyBuckets", "obs:bucket:ListBucket", "obs:bucket:ListBucketVersions", "obs:bucket:CreateBucket", "obs:bucket:DeleteBucket", "rms:resources:list", "iam:agencies:listAgencies" ] } ] }
-
依赖的项目级(region级)云服务的自定义策略DataArtsStudio_PermissionsOfDependentServices_region:
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "cdm:cluster:get", "cdm:cluster:list", "cdm:cluster:create", "cdm:link:operate", "cdm:job:operate", "ces:*:get", "ces:*:list", "cloudtable:*:get", "cloudtable:*:list", "css:*:get", "css:*:list", "dis:streams:list", "dis:transferTasks:list", "dli:queue:submitJob", "dli:queue:cancelJob", "dli:table:insertOverwriteTable", "dli:table:insertIntoTable", "dli:table:alterView", "dli:table:alterTableRename", "dli:table:compaction", "dli:table:truncateTable", "dli:table:alterTableDropColumns", "dli:table:alterTableSetProperties", "dli:table:alterTableChangeColumn", "dli:table:showSegments", "dli:table:alterTableRecoverPartition", "dli:table:dropTable", "dli:table:update", "dli:table:alterTableDropPartition", "dli:table:alterTableAddPartition", "dli:table:alterTableAddColumns", "dli:table:alterTableRenamePartition", "dli:table:delete", "dli:table:alterTableSetLocation", "dli:table:describeTable", "dli:table:showPartitions", "dli:table:showCreateTable", "dli:table:showTableProperties", "dli:table:select", "dli:resource:updateResource", "dli:resource:useResource", "dli:resource:getResource", "dli:resource:listAllResource", "dli:resource:deleteResource", "dli:database:explain", "dli:database:createDatabase", "dli:database:dropFunction", "dli:database:createFunction", "dli:database:displayAllDatabases", "dli:database:displayAllTables", "dli:database:displayDatabase", "dli:database:describeFunction", "dli:database:createView", "dli:database:createTable", "dli:database:showFunctions", "dli:database:dropDatabase", "dli:group:useGroup", "dli:group:updateGroup", "dli:group:listAllGroup", "dli:group:getGroup", "dli:group:deleteGroup", "dli:column:select", "dli:jobs:start", "dli:jobs:export", "dli:jobs:update", "dli:jobs:list", "dli:jobs:listAll", "dli:jobs:get", "dli:jobs:delete", "dli:jobs:create", "dli:jobs:stop", "dli:variable:update", "dli:variable:delete", "dws:cluster:list", "dws:cluster:getDetail", "dws:openAPICluster:getDetail", "ecs:servers:get", "ecs:servers:list", "ecs:servers:stop", "ecs:servers:start", "ecs:flavors:get", "ecs:cloudServerFlavors:get", "ecs:cloudServers:list", "ecs:availabilityZones:list", "ges:graph:access", "ges:metadata:create", "ges:jobs:list", "ges:graph:operate", "ges:jobs:getDetail", "ges:graph:getDetail", "ges:graph:list", "ges:metadata:list", "ges:metadata:getDetail", "ges:metadata:delete", "ges:metadata:operate", "kms:cmk:get", "kms:cmk:list", "kms:cmk:create", "kms:cmk:decrypt", "kms:cmk:encrypt", "kms:dek:create", "kms:dek:encrypt", "kms:dek:decrypt", "mrs:cluster:get", "mrs:cluster:list", "mrs:job:get", "mrs:job:list", "mrs:job:submit", "mrs:job:stop", "mrs:job:delete", "mrs:sql:execute", "mrs:sql:cancel", "rds:*:get", "rds:*:list", "smn:topic:publish", "smn:topic:list", "vpc:publicIps:list", "vpc:publicIps:get", "vpc:vpcs:get", "vpc:vpcs:list", "vpc:subnets:get", "vpc:securityGroups:get", "vpc:firewalls:list", "vpc:routeTables:list", "vpc:subNetworkInterfaces:list" ] } ] }
- 自定义策略创建完成后,再次进入“用户组”,单击DQC用户组后的“授权”,进入授权操作。首先选择“角色与策略授权”,勾选如下系统角色和自定义策略为对象授权。
- 系统角色DIS Operator和DIS User
- 自定义策略DataArtsStudio_PermissionsOfDependentServices_global
- 自定义策略DataArtsStudio_PermissionsOfDependentServices_region
仅当在数据开发组件作业中通过DLI Spark节点选择自定义镜像时,需要容器镜像服务中的镜像读取权限,推荐账号管理员通过镜像授权的方式为用户授予权限(SWR管理员权限账号登录容器镜像服务SWR控制台,在左侧导航栏选择“我的镜像”,进入所需自定义镜像的镜像详情页面,为用户授予该镜像的读取权限)。否则,则需要为用户授予SWR Administrator权限。
图12 为用户组配置依赖服务最小权限合集
- 授权成功后,依赖服务最小权限配置完成。
创建IAM用户并加入用户组
- 在IAM服务控制台中,左侧导航窗格中,选择“用户”,单击右上方的“创建用户”。
图13 创建用户
- 在“创建用户”页面按照下图配置“用户信息”,完成配置后单击页面右下角的“下一步”。
- 用户信息:用户名填写为DataArts Studio-DQC。
- 访问方式:选择“管理控制台访问”和“编程访问”。
仅当创建IAM用户时的访问方式勾选“编程访问”后,此IAM用户才能通过认证鉴权,从而使用API、SDK等方式访问DataArts Studio。
- 凭证类型:勾选访问密钥和密码,推荐为用户自定义初始密码。
- 登录保护:根据需求选择,一般无需开启。
图14 配置用户信息
- 选择将用户加入到DQC用户组,单击页面右下角的创建用户。
图15 创建用户按钮
- 创建完成可返回用户列表查看。
图16 创建成功
自定义工作空间角色
- 使用华为账号登录DataArts Studio管理控制台的首页,单击“角色管理”。
企业模式是否预置部署者角色以及创建自定义角色时的参数,与企业模式是否开启有关。本文以未开启企业模式为例进行说明。
图17 新建自定义角色
- 在角色管理页面,单击“新建”,弹出“创建自定义角色”对话框。
- 角色名称:标识自定义角色的唯一标识,此处填写为“Developer_DQC”。
- 角色描述:补充对该角色的相关说明,此处填写为“基于开发者角色,仅保留数据质量权限”。
- 角色类型:未开启企业模式,选择任一自定义角色即可。
- 复用预置角色:选择“开发者”,然后去勾选其他组件的新增、删除、操作、编辑权限,仅为该角色保留数据质量组件的权限和其他组件的查看权限。
图18 创建自定义角色
- 配置完成后,单击“确定”即可新增自定义角色。
添加工作空间成员并配置角色
- 使用华为账号登录DataArts Studio管理控制台的首页,单击“空间管理”。
图19 空间管理
- 选择需要加入的工作空间,单击“编辑”。
图20 编辑工作空间
- 在空间信息界面,单击“添加”。
图21 添加成员
- 将新建的IAM用户加入工作空间,单击“确定”。
- 用户类型:选择“按用户添加”。
- 成员账号:选择创建IAM用户并加入用户组章节中新建的IAM用户。
- 设置角色:选择自定义工作空间角色章节中新建的自定义角色。
图22 添加成员
- 加入到工作空间后,该用户即可拥有DataArts Studio数据质量组件的操作权限,其余组件仅有查看权限但无法编辑。
用户登录并验证权限
- 以创建IAM用户并加入用户组章节中新建的IAM账号登录华为云控制台,切换至授权区域。
- 在“服务列表”中选择数据治理中心,进入DataArts Studio实例卡片。从实例卡片进入控制台首页后,确认能否正常查看工作空间列表情况。
- 进入已添加当前用户的工作空间,进入各功能组件(例如管理中心和数据质量),查看能否正常进行数据质量业务操作,并验证当前用户是否具备其他组件的操作权限。