文档首页> 数据治理中心 DataArts Studio> 最佳实践> 如何最小化授权用户使用DataArts Studio
更新时间:2024-01-08 GMT+08:00

如何最小化授权用户使用DataArts Studio

实践场景及目标

某数据运营工程师专职负责数据质量监控相关工作,仅需要服务数据质量组件的操作权限。

图1 权限体系

服务的权限体系如图1所示。如果项目管理员直接赋予该数据运营工程师IAM账号“DAYU User系统角色+工作空间开发者角色”权限,则会出现如下非必需权限过大的风险:

  1. 依赖服务权限过大:服务作为平台型服务,DAYU User系统角色预置了依赖服务(如MRS、DWS等相关服务)的管理员权限。当为数据运营工程师IAM账号授予DAYU User系统角色后,会导致其拥有依赖服务的管理员权限。

为了解决此问题,项目管理员可以按照如下解决方案进行权限最小化配置,这样既能满足实际业务使用,也避免了权限过大的风险。

  1. 为数据运营工程师IAM账号授予DAYU User系统角色权限,然后删除IAM账号中的依赖服务权限,再赋予依赖服务的最小权限合集。

操作流程

  1. 创建用户组并授予系统角色DAYU User:创建数据运营工程师IAM账号所在的用户组,并授予DAYU User权限。
  2. 去除用户组依赖服务权限并配置最小权限合集:为用户组去除默认的依赖服务管理员权限,然后配置最小权限。
  3. 创建IAM用户并加入用户组:为数据运营工程师创建IAM账号,并加入到用户组中。
  4. 添加工作空间成员并配置角色:将新创建的IAM用户加入到工作空间并配置角色。
  5. 用户登录并验证权限:使用新创建的用户登录控制台,验证权限配置是否符合预期。

创建用户组并授予系统角色DAYU User

  1. 使用华为账号登录统一身份认证服务IAM控制台。
  2. 在IAM服务控制台中,单击“用户组”,在用户组页面单击右上方的“创建用户组”。

    图2 创建用户组

  3. 在“创建用户组”界面,输入“用户组名称”DQC。

    图3 用户组名称

  4. 单击“确定”,用户组创建完成,用户组列表中显示新创建的用户组。

    您最多可以创建20个用户组,如果当前资源配额无法满足业务需要,您可以申请扩大配额,具体方法请参见:如何申请扩大配额?

  5. 在用户组列表中,单击新建用户组右侧的“授权”。

    图4 进入用户组权限设置页面

  6. 在搜索框中输入DAYU User,勾选该系统角色,单击“下一步”

    图5 角色授权

    请勿勾选“DAYU Administrator”权限,“DAYU Administrator”权限具有DataArts Studio服务的所有执行权限,不受工作空间权限管控。

  7. 授权范围方案选择需要授予的区域项目,单击“确定”,完成授权。

    DataArts Studio部署时通过物理区域划分,为项目级服务。授权时,“授权范围方案”如果选择“所有资源”,则该权限在所有区域项目中都生效;如果选择“指定区域项目资源”,则该权限仅对此项目生效。IAM用户授权完成后,访问DataArts Studio时,需要先切换至授权区域。

    图6 设置最小授权范围

去除用户组依赖服务权限并配置最小权限合集

  1. 在IAM服务控制台中,单击“用户组”,在用户组页面单击创建的DQC用户组名,进入用户组详情页面。

    图7 进入用户组详情

  2. 在用户组详情页面下方的授权记录区域,条数切换到20条,展开所有14条授权记录。勾选除DAYU User外的所有依赖服务权限,并点击列表上方的删除。

    图8 删除依赖服务权限

  3. 依赖服务权限删除成功后,返回IAM服务控制台首页,单击“权限管理 > 权限”,在权限页面单击右上方的“创建自定义策略”。

    图9 创建自定义策略

  4. 在自定义策略配置页面,策略配置方式切换至JSON视图,然后按照如下策略内容,分别创建DataArtsStudio_PermissionsOfDependentServices_globalDataArtsStudio_PermissionsOfDependentServices_region自定义策略。

    • 创建自定义策略时,暂不支持同时选全局级云服务和项目级云服务,因此需要将依赖服务自定义策略拆分为两条分别创建。
    • 策略内容来自于DataArts Studio服务各组件功能所需依赖服务的最小权限,详情请参见权限管理
    图10 创建自定义策略示例

    • 依赖的全局级(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: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"
                  ]
              }
          ]
      }

  5. 自定义策略创建完成后,再次进入“用户组”,点击DQC用户组后的“授权”,进入授权操作。首先选择“角色与策略授权”,勾选如下系统角色和自定义策略为对象授权。

    • 系统角色DIS Operator和DIS User
    • 自定义策略DataArtsStudio_PermissionsOfDependentServices_global
    • 自定义策略DataArtsStudio_PermissionsOfDependentServices_region

    仅当在数据开发组件作业中通过DLI Spark节点选择自定义镜像时,需要容器镜像服务中的镜像读取权限,推荐账号管理员通过镜像授权的方式为用户授予权限(SWR管理员权限账号登录容器镜像服务SWR控制台,在左侧导航栏选择“我的镜像”,进入所需自定义镜像的镜像详情页面,为用户授予该镜像的读取权限)。否则,则需要为用户授予SWR Administrator权限。

    图11 为用户组配置依赖服务最小权限合集

  6. 授权成功后,依赖服务最小权限配置完成。

创建IAM用户并加入用户组

  1. 在IAM服务控制台中,左侧导航窗格中,选择“用户”,单击右上方的“创建用户”。

    图12 创建用户

  2. 在“创建用户”页面按照下图配置“用户信息”,完成配置后单击页面右下角的“下一步”

    • 用户信息:用户名填写为DataArts Studio-DQC。
    • 访问方式:选择“管理控制台访问”和“编程访问”。

      仅当创建IAM用户时的访问方式勾选“编程访问”后,此IAM用户才能通过认证鉴权,从而使用API、SDK等方式访问DataArts Studio

    • 凭证类型:勾选访问密钥和密码,推荐为用户自定义初始密码。
    • 登录保护:根据需求选择,一般无需开启。
      图13 配置用户信息

  3. 选择将用户加入到DQC用户组,单击页面右下角的创建用户。

    图14 创建用户按钮

  4. 创建完成可返回用户列表查看。

    图15 创建成功

添加工作空间成员并配置角色

  1. 使用华为账号登录DataArts Studio管理控制台的首页,单击“空间管理”。

    图16 空间管理

  2. 选择需要加入的工作空间,单击“编辑”

    图17 编辑工作空间

  3. 在空间信息界面,单击“添加”

    图18 添加成员

  4. 将新建的IAM用户加入工作空间,单击“确定”

    • 用户类型:选择“按用户添加”
    • 成员账号:选择创建IAM用户并加入用户组章节中新建的IAM用户。
    • 设置角色:选择角色。

      图19 添加成员

  5. 加入到工作空间后,该用户即可拥有DataArts Studio数据质量组件的操作权限,其余组件仅有查看权限但无法编辑。

用户登录并验证权限

  1. 创建IAM用户并加入用户组章节中新建的IAM账号登录华为云控制台,切换至授权区域。
  2. 在“服务列表”中选择数据治理中心,进入DataArts Studio实例卡片。从实例卡片进入控制台首页后,确认能否正常查看工作空间列表情况。
  3. 进入已添加当前用户的工作空间,进入各功能组件(例如管理中心和数据质量),查看能否正常进行数据质量业务操作。