为企业管理分配访问权限

要授予用户管理 IBM Cloud® 企业的权限,您必须将其邀请加入企业账户,并为其分配企业账户管理服务的访问权限。

用于管理企业的访问权需要企业帐户中的访问策略。 在企业的子帐户中,为用户分配企业帐户管理服务策略时,用户无法管理该帐户所属的企业。 根据企业账户中“企业账户管理服务”所分配的角色,用户可以执行特定的操作:

  • 在企业中创建新帐户
  • 创建和命名帐户组
  • 在帐户组之间移动帐户
  • 删除所有相关资源后取消账户
  • 将现有帐户导入到企业
  • 更新企业名称或域
  • 查看用于计算账单的企业、特定账户组、账户组内账户或特定账户的使用情况报告,并提供计划级别的详细信息
  • 创建企业管理的IAM模板
  • 将企业管理的IAM模板分配给子账户
  • 为子账户分配 IAM 模板
  • 在子账户上设置支出通知,通知企业成员
  • 监控安全与合规性 IBM Cloud Security and Compliance Center Workload Protection
  • 共享私人目录

允许用户访问企业服务的策略,既可以分配给整个企业,也可以仅分配给特定的账户组或单个账户。

通常,企业帐户本身并不包含许多资源。 相反,资源是在企业的子帐户中创建的。 对于其中的每个帐户,可以邀请用户加入,并向其授予管理和使用资源的访问权。 用户在企业帐户中具有的访问权和成员资格不会应用于企业层次结构中的帐户组和子帐户。 如以下图表所示,用户管理和访问管理仍仅限于各自的账户范围内。

第一个图表展示了如何为企业账户中的用户分配策略,以管理整个企业。 第二个图表显示的是针对一个账户组的策略,该账户组仅允许管理该账户组及其子账户。

企业访问权限
企业访问权限图表

策略的目标和角色对于确定访问权的作用域十分重要。 企业中的用户、服务ID或访问组可以完成企业管理任务:

  • 整个企业。
  • 在一个可能包含其他账户组和账户的账户组中。
  • 仅限于一个账户。

例如,如果用户在企业账户管理服务中获得了访问权限,且访问权限的目标范围是某个特定的账户组,则该用户可以在该账户组内完成任务。 当目标设定为特定帐户组或帐户时,用户无法完成影响整个企业的操作,例如更新企业名称或域。

可以为企业的子帐户中的用户分配访问策略,使其只能管理该帐户或其中包含的资源。 例如,如果您在企业账户管理服务中为子账户中的某位用户分配了一个角色,该用户将无法在企业账户级别执行任何操作。 您必须将该用户添加到企业帐户,并在该上下文中为其分配相应策略。

账户访问
账户访问示意图

特定作业的必需策略

根据需要完成的作业,可能需要为非企业所有者的用户提供访问策略组合。 以下示例提供了一组访问策略,企业中的用户必须分配有这些策略,才能完成特定任务。

如果您是不属于企业的帐户的所有者,但您希望帐户中的其他用户能够将帐户转换为企业,那么可以为该用户分配对缴费帐户管理服务的管理员角色。

在企业中查看使用情况和管理计费

要使用户能够针对企业中的所有帐户查看使用情况报告、付款和查看发票,必须为其分配以下所有访问策略:

  • 在企业帐户中对企业帐户管理服务的使用情况报告查看者角色
  • 在企业帐户中对缴费帐户管理服务的管理员角色

将现有帐户导入到企业

若要让用户 将现有的 IBM Cloud 账户导入企业,您必须分配以下所有访问策略:

  • 在要导入的帐户中对缴费帐户管理服务的管理员角色
  • 企业账户管理服务中账户组或企业账户的管理员或编辑角色
  • 在企业帐户中对缴费帐户管理服务的管理员角色

移动帐户

要使用户能够在企业中移动帐户,必须为其分配以下访问策略:

  • 在企业帐户中对缴费帐户管理服务的管理员角色

然后,选择以下两个选项中的一个选项:

  • 对整个企业的企业帐户管理服务的管理员或编辑者角色
  • 当前和目标账户组的管理员或编辑角色

有关用户在每个角色下可执行的操作的详细信息,请参阅 《账户管理服务的操作和角色》。

管理安全与合规

要让用户通过管理 IBM Cloud Security and Compliance Center Workload Protection 安全和合规性,必须分配以下访问策略:

  • 管理员或编辑角色 IBM Cloud Security and Compliance Center Workload Protection
  • 企业自定义角色

要创建具有相应权限的自定义角色,请参阅 通过 IAM 控制访问。

创建并分配企业管理的IAM模板

要创建企业管理的 IAM 模板,您必须为 “所有 IAM 账户管理服务” 分配“模板管理员”角色。

要将企业管理的 IAM 模板分配给子账户,您必须在企业服务上为 “所有 IAM 账户管理”服务和策略分配“模板分配管理员”角色,且该角色至少应具备“查看者”角色权限。

默认情况下,没有用户拥有这些权限,包括账户所有者。

有关用户在每个角色下可执行的操作的详细信息,请参阅 《账户管理服务的操作和角色》。

在控制台中分配访问权

要将访问策略分配给企业帐户中的现有用户,请完成以下步骤:

您可以将策略的目标设置为整个企业、特定帐户组(可以包含对其中所有帐户的访问权),或者甚至是帐户组中的特定帐户。

  1. 在 IBM Cloud 控制台中,点击 “管理” >“访问(IAM)”,然后选择 “用户”。
  2. 在您要授予访问权限的用户的行中,单击“操作”图标 “操作”图标,然后单击“分配访问权限”。
  3. 从服务中,选择企业。
  4. 单击下一步。
  5. 使用特定子账户或企业内所有账户访问资源组。 然后,单击下一步。
  6. 选择任意角色或权限组合,然后点击“审核”。
  7. 点击 “添加” 将您的保单配置添加到保单摘要中。
  8. (可选)重复上述步骤,添加其他访问权限。
  9. 单击分配。

有关在企业账户中分配访问权限的角色和操作的更多信息,请参阅 分配账户管理服务的访问权限。

使用 CLI 分配访问权

要为用户创建新的访问策略,请运行 ibmcloud iam user-policy-create 命令。 在命令示例中,将使用 JSON 文件来指定策略详细信息。 有关要在 JSON 文件中包含的内容的示例,请查看使用 API 分配访问权部分中的示例。

创建用户策略:

ibmcloud iam user-policy-create name@example.com -f policy.json

有关更多信息,请参阅 ibmcloud iam user-policy-create。

使用 API 分配访问权

以下请求示例为某个企业账户中具有“编辑”角色的用户分配了一项策略,该企业账户的范围限定在某个账户组内。 此类型的策略是分层的,并且会应用于层次结构中的所有后代对象,即指定目标帐户组中的所有帐户组或帐户。

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Editor role for SERVICE_NAME's RESOURCE_NAME",
  "subjects": [
    {
      "attributes": [
        {
          "name": "iam_id",
          "value": "IBMid-123453user"
        }
      ]
    }'
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:iam::::role:Editor"
    }
  ],
  "resources":[
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "$ACCOUNT_ID"
        },
        {
          "name": "serviceName",
          "value": "$SERVICE_NAME"
        },
        {
          "name": "resource",
          "value": "$RESOURCE_NAME",
          "operator": "stringEquals"
        }
      ]
    }
  ]
}'
SubjectAttribute subjectAttribute = new SubjectAttribute.Builder()
        .name("iam_id")
        .value(EXAMPLE_USER_ID)
        .build();
PolicySubject policySubjects = new PolicySubject.Builder()
        .addAttributes(subjectAttribute)
        .build();
PolicyRole policyRoles = new PolicyRole.Builder()
        .roleId("crn:v1:bluemix:public:iam::::role:Viewer")
        .build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
        .name("accountId")
        .value(exampleAccountId)
        .operator("stringEquals")
        .build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
        .name("serviceType")
        .value("service")
        .operator("stringEquals")
        .build();
ResourceTag policyResourceTag = new ResourceTag.Builder()
        .name("project")
        .value("prototype")
        .operator("stringEquals")
        .build();
PolicyResource policyResources = new PolicyResource.Builder()
        .addAttributes(accountIdResourceAttribute)
        .addAttributes(serviceNameResourceAttribute)
        .addTags(policyResourceTag)
        .build();
CreatePolicyOptions options = new CreatePolicyOptions.Builder()
        .type("access")
        .subjects(Arrays.asList(policySubjects))
        .roles(Arrays.asList(policyRoles))
        .resources(Arrays.asList(policyResources))
        .build();
Response<Policy> response = service.createPolicy(options).execute();
Policy policy = response.getResult();
System.out.println(policy);
const policySubjects = [
  {
    attributes: [
      {
        name: 'iam_id',
        value: exampleUserId,
      },
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:iam::::role:Viewer',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: exampleAccountId,
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceType',
  value: 'service',
  operator: 'stringEquals',
};
const policyResourceTag = {
  name: 'project',
  operator: 'stringEquals',
  value: 'prototype',
};
const policyResources = [
  {
    attributes: [accountIdResourceAttribute, serviceNameResourceAttribute],
    tags: [policyResourceTag],
  },
];
const params = {
  type: 'access',
  subjects: policySubjects,
  roles: policyRoles,
  resources: policyResources,
};
iamPolicyManagementService.createPolicy(params)
  .then(res => {
    examplePolicyId = res.result.id;
    console.log('createPolicy() result:\n' + JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
policy_subjects = PolicySubject(
  attributes=[SubjectAttribute(name='iam_id', value=example_user_id)])
policy_roles = PolicyRole(
  role_id='crn:v1:bluemix:public:iam::::role:Viewer')
account_id_resource_attribute = ResourceAttribute(
  name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
  name='serviceType', value='service')
policy_resource_tag = ResourceTag(
  name='project', value='prototype')
policy_resources = PolicyResource(
  attributes=[account_id_resource_attribute,
        service_name_resource_attribute],
  tags=[policy_resource_tag])
policy = iam_policy_management_service.create_policy(
  type='access',
  subjects=[policy_subjects],
  roles=[policy_roles],
  resources=[policy_resources]
).get_result()
print(json.dumps(policy, indent=2))
subjectAttribute := &iampolicymanagementv1.SubjectAttribute{
  Name:  core.StringPtr("iam_id"),
  Value: &exampleUserID,
}
policySubjects := &iampolicymanagementv1.PolicySubject{
  Attributes: []iampolicymanagementv1.SubjectAttribute{*subjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
  RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::role:Viewer"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("accountId"),
  Value:    core.StringPtr(exampleAccountID),
  Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("serviceType"),
  Value:    core.StringPtr("service"),
  Operator: core.StringPtr("stringEquals"),
}
policyResourceTag := &iampolicymanagementv1.ResourceTag{
  Name:     core.StringPtr("project"),
  Value:    core.StringPtr("prototype"),
  Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
  Attributes: []iampolicymanagementv1.ResourceAttribute{
    *accountIDResourceAttribute, *serviceNameResourceAttribute},
  Tags: []iampolicymanagementv1.ResourceTag{*policyResourceTag},
}
options := iamPolicyManagementService.NewCreatePolicyOptions(
  "access",
  []iampolicymanagementv1.PolicySubject{*policySubjects},
  []iampolicymanagementv1.PolicyRole{*policyRoles},
  []iampolicymanagementv1.PolicyResource{*policyResources},
)
policy, response, err := iamPolicyManagementService.CreatePolicy(options)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(policy, "", "  ")
fmt.Println(string(b))

如需了解更多信息,请参阅 “创建策略”。