
# 用户授权最小化权限实践
#### 实践场景及目标
假设某数据运营工程师专职负责数据质量监控相关工作，且仅需要服务数据质量组件的操作权限。则在为该用户授权时，如果项目管理员直接赋予该数据运营工程师IAM账号"DAYU User系统角色+工作空间开发者角色"权限，则会出现如下非必需权限过大的风险：
1. 依赖服务权限过大：服务作为平台型服务，DAYU User系统角色预置了依赖服务（如MRS、DWS等相关服务）的管理员权限。当为数据运营工程师IAM账号授予DAYU User系统角色后，会导致其拥有依赖服务的管理员权限。
2. 服务其他组件操作权限不受控制：工作空间开发者角色默认具备该工作空间内所有组件的操作权限。当为数据运营工程师IAM账号授权工作空间开发者角色后，会导致其拥有数据质量组件之外的其他组件操作权限。
 
服务的权限体系如[图1]所示。为解决此问题，项目管理员可以按照如下解决方案进行权限最小化配置，这样既能满足实际业务使用，也避免了权限过大的风险。
图1权限体系   
![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000002457951938.png "点击放大")
1. 为数据运营工程师IAM账号授予DAYU User系统角色权限，然后赋予依赖服务的最小权限合集，再删除IAM账号中的预置依赖服务权限。
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   为IAM用户授予普通用户最小化IAM权限时，有如下几种方案：
   A. 为用户授予DAYU User，然后赋予依赖服务的最小权限合集，再删除IAM账号中的预置依赖服务权限。
   B. 为用户授予DataArts Studio User，然后赋予依赖服务的最小权限合集。
   C. 为用户授予DataArtsStudioOperatorPolicy，然后赋予依赖服务的最小权限合集。
   本案例以最为复杂的方案A为例进行介绍。在实际配置中，您任意选择这几种方案之一即可。
   
2. 在服务内，创建一个仅保留数据质量组件操作权限的自定义角色"Developer_DQC"，然后将数据运营工程师IAM账号添加为工作空间成员并赋予此角色。
 
#### 操作流程
1. [创建用户组并授予系统角色DAYU User]：创建数据运营工程师IAM账号所在的用户组，并授予**DAYU** **User**权限。
2. [配置最小权限合集并去除预置依赖服务权限]：为用户组去除默认的依赖服务管理员权限，然后配置最小权限。
3. [创建IAM用户并加入用户组]：为数据运营工程师创建IAM账号，并加入到用户组中。
4. [自定义工作空间角色]：在角色管理页面，新建自定义角色，仅授权某一组件权限，本案例中以数据质量为例。
5. [添加工作空间成员并配置角色]：将新创建的IAM用户加入到工作空间并配置为新建的自定义角色。
6. [用户登录并验证权限]：使用新创建的用户登录控制台，验证权限配置是否符合预期。
   图2最小化授权操作流程   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808417833.png "点击放大") 
 
 #### 创建用户组并授予系统角色DAYU User
1. 使用华为账号登录统一身份认证服务IAM控制台。
2. 在IAM服务控制台中，单击"用户组"，在用户组页面单击右上方的"创建用户组"。 
   图3创建用户组   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001573951521.png "点击放大")
   
   
   
3. 在"创建用户组"界面，输入"用户组名称"DQC。 
   图4用户组名称   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001573956657.png "点击放大")
   
   
   
4. 单击"确定"，用户组创建完成，用户组列表中显示新创建的用户组。 
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   您最多可以创建20个用户组，如果当前资源配额无法满足业务需要，您可以申请扩大配额，具体方法请参见：[如何申请扩大配额？](https://support.huaweicloud.com/usermanual-iam/iam_01_0111.html#section2)
   
   
5. 在用户组列表中，单击新建用户组右侧的"授权"。 
   图5进入用户组权限设置页面   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001523836904.png "点击放大")
   
   
   
6. 在搜索框中输入DAYU User，勾选该系统角色，单击"下一步"。 
   图6角色授权   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001574398821.png "点击放大")
   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   请勿勾选"**DAYU** **Administrator** "权限，"**DAYU** **Administrator**"权限具有DataArts Studio服务的所有执行权限，不受工作空间权限管控。
   
   
7. 授权范围方案选择需要授予的区域项目，单击"确定"，完成授权。 
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   DataArts Studio部署时通过物理区域划分，为项目级服务。授权时，"授权范围方案"如果选择"所有资源"，则该权限在所有区域项目中都生效；如果选择"指定区域项目资源"，则该权限仅对此项目生效。IAM用户授权完成后，访问DataArts Studio时，需要先切换至授权区域。
   图7设置最小授权范围   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808416669.png "点击放大")
   
   
   
 
 #### 配置最小权限合集并去除预置依赖服务权限
1. 在IAM服务控制台首页，单击"权限管理 \> 权限"，在权限页面单击右上方的"创建自定义策略"。 
   图8创建自定义策略   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001761312902.png "点击放大")
   
   
   
2. 在自定义策略配置页面，策略配置方式切换至JSON视图，然后按照如下策略内容，分别创建**DataArtsStudio_PermissionsOfDependentServices_global** 和**DataArtsStudio_PermissionsOfDependentServices_region** 自定义策略。
   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   - 创建自定义策略时，暂不支持同时选全局级云服务和项目级云服务，因此需要将依赖服务自定义策略拆分为两条分别创建。
   
   - 策略内容来自于DataArts Studio服务各组件功能所需依赖服务的最小权限，详情请参见[权限管理](https://support.huaweicloud.com/productdesc-dataartsstudio/dataartsstudio_07_012.html#section1)。
    
   图9创建自定义策略示例   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001761489550.png "点击放大")
   
   - 依赖的全局级（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",
                     "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: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"
                 ]
             }
         ]
     }
     ```
     
   
   
   
   
3. 自定义策略创建完成后，再次进入"用户组"，单击DQC用户组后的"授权"，进入授权操作。首先选择"角色与策略授权"，勾选如下系统角色和自定义策略为对象授权。 
   - 系统角色DIS Operator和DIS User
   
   - 自定义策略DataArtsStudio_PermissionsOfDependentServices_global
   
   - 自定义策略DataArtsStudio_PermissionsOfDependentServices_region
   
   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   仅当在数据开发组件作业中通过**DLI Spark**节点选择自定义镜像时，需要容器镜像服务中的镜像读取权限，推荐账号管理员通过镜像授权的方式为用户授予权限（SWR管理员权限账号登录容器镜像服务SWR控制台，在左侧导航栏选择"我的镜像"，进入所需自定义镜像的镜像详情页面，为用户授予该镜像的读取权限）。否则，则需要为用户授予SWR Administrator权限。
   图10为用户组配置依赖服务最小权限合集   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001761318150.png "点击放大")
   
   
   
4. 授权成功后，在IAM服务控制台中的用户组页面，单击创建的DQC用户组名，进入用户组详情页面。 
   图11进入用户组详情   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000002297384945.png "点击放大")
   
   
   
5. 在用户组详情页面下方的授权记录区域，展开所有授权记录，勾选除DAYU User、以及最小依赖服务权限外的所有预置依赖服务权限，并单击列表上方的删除。 
   图12删除依赖服务权限   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000002262727964.png "点击放大")
   
   
6. 依赖服务权限删除成功后，依赖服务最小权限配置完成。
 
 #### 创建IAM用户并加入用户组
1. 在IAM服务控制台中，左侧导航窗格中，选择"用户"，单击右上方的"创建用户"。 
   图13创建用户   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001524177390.png "点击放大")
   
   
   
2. 在"创建用户"页面按照下图配置"用户信息"，完成配置后单击页面右下角的"下一步"。 
   - 用户信息：用户名填写为DataArts Studio-DQC。
   
   - 访问方式：选择"管理控制台访问"和"编程访问"。
     ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
     仅当创建IAM用户时的访问方式勾选"编程访问"后，此IAM用户才能通过认证鉴权，从而使用API、SDK等方式访问DataArts Studio。
     
   
   - 凭证类型：勾选访问密钥和密码，推荐为用户自定义初始密码。
   
   - 登录保护：根据需求选择，一般无需开启。
     图14配置用户信息   
     ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808283941.png "点击放大") 
   
   
   
   
   
3. 选择将用户加入到DQC用户组，单击页面右下角的创建用户。 
   图15创建用户按钮   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001574851389.png "点击放大")
   
   
   
4. 创建完成可返回用户列表查看。 
   图16创建成功   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001524497242.png "点击放大")
   
   
   
 
 #### 自定义工作空间角色
1. 使用华为账号登录DataArts Studio管理控制台的首页，单击"角色管理"。 
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   企业模式是否预置部署者角色以及创建自定义角色时的参数，与企业模式是否开启有关。本文以未开启企业模式为例进行说明。
   图17新建自定义角色   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808443445.png "点击放大")
   
   
   
2. 在角色管理页面，单击"新建"，弹出"创建自定义角色"对话框。 
   - 角色名称：标识自定义角色的唯一标识，此处填写为"Developer_DQC"。
   
   - 角色描述：补充对该角色的相关说明，此处填写为"基于开发者角色，仅保留数据质量权限"。
   
   - 角色类型：未开启企业模式，选择任一自定义角色即可。
   
   - 复用预置角色：选择"开发者"，然后去勾选其他组件的新增、删除、操作、编辑权限，仅为该角色保留数据质量组件的权限和其他组件的查看权限。
     图18创建自定义角色   
     ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001761326774.png "点击放大")
     
     
   
   
   
   
3. 配置完成后，单击"确定"即可新增自定义角色。
 
 #### 添加工作空间成员并配置角色
1. 使用华为账号登录DataArts Studio管理控制台的首页，单击"空间管理"。 
   图19空间管理   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808288141.png "点击放大")
   
   
   
2. 选择需要加入的工作空间，单击"编辑"。 
   图20编辑工作空间   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808447177.png "点击放大")
   
   
   
3. 在空间信息界面，单击"添加"。 
   图21添加成员   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808447209.png "点击放大")
   
   
   
4. 将新建的IAM用户加入工作空间，单击"确定"。 
   - 用户类型：选择"按用户添加"。
   
   - 成员账号：选择[创建IAM用户并加入用户组]章节中新建的IAM用户。
   
   - 设置角色：选择[自定义工作空间角色]章节中新建的自定义角色。
     图22添加成员   
     ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001808288197.png "点击放大")
     
     
     
   
   
   
   
5. 加入到工作空间后，该用户即可拥有DataArts Studio数据质量组件的操作权限，其余组件仅有查看权限但无法编辑。
 
 #### 用户登录并验证权限
1. 以[创建IAM用户并加入用户组]章节中新建的IAM账号登录华为云控制台，切换至授权区域。
2. 在"服务列表"中选择数据治理中心，进入DataArts Studio实例卡片。从实例卡片进入控制台首页后，确认能否正常查看工作空间列表情况。
3. 进入已添加当前用户的工作空间，进入各功能组件（例如管理中心和数据质量），查看能否正常进行数据质量业务操作，并验证当前用户是否具备其他组件的操作权限。
 
