IBM Cloud Docs
管理对资源的访问权

管理对资源的访问权

要使用 IAM 策略来管理用户或服务标识的访问权,您必须是帐户所有者或分配了正确的访问权。 要分配用户对资源的访问权,您必须是帐户中所有服务的管理员,或者是特定服务或服务实例的已分配管理员。 要分配对服务标识的访问权,您必须是身份服务或特定服务标识的管理员。

分配对资源的访问权

可以使用以下两种类型的策略来分配对资源的访问权:

  • 对帐户中资源(包括仅一种类型或所有类型的选项)的访问权
  • 访问资源组内的资源,包括仅访问一种资源或全部资源

如果您删除或编辑当前正在使用的服务ID的现有策略,可能会导致服务中断。

如果要启用用户完全管理员访问权以完成 帐户管理任务,例如邀请和除去用户,查看计费和使用情况,管理服务标识,管理访问组,管理用户访问权以及对所有启用 IAM 的资源的访问权,那么必须为用户分配以下访问权:

  • 一项政策身份和访问支持服务具有管理员和经理角色。
  • 具有管理员角色的策略所有帐户管理服务

您还可以设置访问权管理标记以管理访问权。 有关更多信息,请参阅 使用标记控制对资源的访问

具有帐户管理服务管理员角色的用户可以更改其他用户的访问权限并从资源中删除用户,包括具有管理员角色的其他用户。

在控制台中分配对资源的访问权

要分配对帐户中单个资源的访问权或对帐户中所有资源的访问权,请完成以下步骤:

  1. 在里面IBM Cloud控制台,点击管理>访问 (IAM),然后选择用户或者管理>访问 (IAM),然后选择服务 ID,具体取决于您想要分配访问权限的身份。
  2. 单击要分配访问权的用户或服务标识的 操作 图标 "操作列表" 图标 > 分配访问权
  3. 选择一组服务或单个服务。 然后,单击下一步
  4. 限制对帐户中所有资源的访问权,或者根据属性选择特定资源。
  5. 单击下一步
  6. 选择要分配的任意角色组合,然后单击 复审
  7. 单击 添加 以将策略配置添加到策略摘要。
  8. (可选) 将用户或服务标识添加到 访问组
    1. 选择您希望用户或服务标识所属的访问组。
    2. 单击添加
  9. 单击分配

如果用户在包含资源的资源组中没有角色,则可以查看资源,但不能通过访问帐户中的资源列表页面来访问资源,从而开始使用它们。 在资源组上分配查看者角色或更高权限,以确保用户可以访问资源。

部分账户的服务 ID 可享受更高的保单限额。 要利用增加的策略限制,请分配对 Event Streams 或 IBM Cloud Object Storage 服务的访问。 您还必须将访问策略的范围限定为特定的服务实例、资源类型和资源 ID。

在控制台中分配资源组内的访问权

要分配对资源组中所有资源的访问权,或分配仅对资源组中一项服务的访问权,请完成以下步骤:

  1. 在 IBM Cloud 控制台中,单击 管理 > 访问权 (IAM),然后根据要分配访问权的身份选择 用户服务标识
  2. 单击要分配访问权限的用户或服务 ID,然后单击使用权>分配访问权限
  3. 选择一组服务或单个服务。 然后,单击下一步
  4. 确定访问权限具体资源。 选择资源组属性类型并输入资源组。
  5. 单击下一步
  6. 选择用于管理资源组的访问角色。 然后,单击下一步
  7. 选择要分配的任意角色组合,然后单击 复审
  8. 单击 添加 以将策略配置添加到策略摘要。
  9. 单击分配

分配资源组的管理权限

您可以在不分配服务访问权的情况下分配查看或管理资源组的访问权。

作为管理员,您可能希望在所有资源组上创建具有“查看者”角色的访问组。 这样,当您分配对服务资源的访问权时,就不必创建其他策略来查看资源组。 用户需要对资源组具有“查看者”角色才能在该资源组中创建服务实例。

要在不分配服务访问权的情况下分配对资源组的访问权,请完成以下步骤:

  1. 在 IBM Cloud 控制台中,单击 管理 > 访问权 (IAM),然后根据要分配访问权的身份选择 用户服务标识
  2. 单击要分配访问权限的用户或服务 ID,然后单击使用权>分配访问权限
  3. 选择仅资源组
  4. 选择添加条件
  5. 选择 资源组 属性类型并输入资源组。
  6. 单击下一步
  7. 选择用于查看或管理资源组的访问角色。 然后,单击 复审
  8. 单击 添加 以将策略配置添加到策略摘要。
  9. 单击分配

您可以根据需要对帐户中的每个可用资源组重复此类型的策略,以分配访问权来管理帐户中的所有资源组。

使用CLI分配资源访问权限

  1. 登录 IBM Cloud® CLI。 如果您有多个帐户,系统会提示您选择要使用的帐户。 如果未使用 -r 标志指定区域,那么还必须选择区域。

    ibmcloud login
    

    如果凭证被拒绝,说明您可能使用的是联合标识。 要使用联合标识登录,请使用 --sso 标志。 有关更多详细信息,请参阅使用联合标识进行登录

    如果是首次使用 IBM Cloud CLI,请查看 入门教程

  2. 使用命令 ibmcloud iam user-policy-create 创建访问策略并将其分配给用户或服务标识。

    • 此示例向帐户中具有 sample-service 服务的所有实例的 Administrator 角色的单个资源分配访问权:
    ibmcloud iam user-policy-create name@example.com --roles Administrator --service-name sample-service
    
    • 此示例向具有 Administrator 角色的 所有帐户管理服务 分配访问权:
    ibmcloud iam service-policy-create name@example.com --roles Administrator --account-management
    
    • 此示例使用 Administrator 角色分配对 所有启用身份和访问权的服务 的访问权:
    ibmcloud iam service-policy-create name@example.com --roles Administrator --attributes serviceType=service
    
    • 此示例使用 Administrator 角色分配对 所有 IAM 帐户管理服务 的访问权:
    ibmcloud iam service-policy-create name@example.com --roles Administrator --attributes service_group_id=IAM
    

    部分账户的服务 ID 可享受更高的保单限额。 要利用增加的策略限制,请分配对 Event Streams 或 IBM Cloud Object Storage 服务的访问。 您还必须将访问策略的范围限定为特定的服务实例、资源类型和资源 ID。

    • 此示例以 Manager 角色为 Object Storage 分配访问权限。 它将访问范围限定为特定的服务实例、资源类型和资源 ID:
    ibmcloud iam service-policy-create SERVICE_ID service-name cloud-object-storage --service-instance SERVICE_INSTANCE_GUID --resource-type RESOURCE_TYPE --resource RESOURCE --roles Manager
    

使用 CLI 在资源组中分配访问权

输入 ibmcloud user-policy-create 命令以分配对资源组中所有资源或仅对资源组中一个服务的访问权。 此示例为资源组 dda27e49d2a1efca58083a01dfde18f6 分配了角色 name@example.com Operator

ibmcloud iam user-policy-create name@example.com --roles Operator --resource-type resource-group --resource dda27e49d2a1efca58083a01dfde18f6

输入 ibmcloud iam service-policy-create 命令以分配对资源组中所有资源或仅对资源组中一个服务的访问权。 此示例为名为 sample-resource-group 的资源组提供服务 test Administrator 角色:

ibmcloud iam service-policy-create test --roles Administrator --resource-group-name sample-resource-group

使用 CLI 分配用于管理资源组的访问权

您可以在不分配服务访问权的情况下分配查看或管理资源组的访问权。

作为管理员,您可能希望在所有资源组上创建具有“查看者”角色的访问组。 这样,当您分配对服务资源的访问权时,就不必创建其他策略来查看资源组。 用户需要对资源组具有“查看者”角色才能在该资源组中创建服务实例。

以下示例为特定资源组的查看者创建策略:

iam user-policy-create name@example.com --roles Viewer --resource-type resource-group --resource fec6c95e6a0a44c5bcca138bfe5a1f9e

以下示例为帐户中所有资源组的查看者创建策略。

iam user-policy-create name@example.com --roles Viewer --resource-type resource-group

以下示例为资源组中所有资源的查看者创建策略

iam user-policy-create name@example.com --roles Viewer --resource-group-name satellite-test

使用API分配资源访问权限

您可以通过调用 IBM Cloud® Identity and Access Management(IAM)策略管理 API 来分配对帐户中单个资源的访问权或对帐户中资源列表的访问权,如以下样本请求中所示。 样本请求授予 Administrator 角色对服务实例的访问权:

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Administrator role for SERVICE_NAME's RESOURCE_NAME",
  "subjects": [
    {
      "attributes": [
        {
          "name": "iam_id",
          "value": "IBMid-123453user"
        }
      ]
    }'
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:iam::::role:Administrator"
    }
  ],
  "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:Administrator")
      .build();

ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
      .name("accountId")
      .value(exampleAccountId)
      .operator("stringEquals")
      .build();

ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceName")
      .value("service")
      .operator("stringEquals")
      .build();

PolicyResource policyResources = new PolicyResource.Builder()
      .addAttributes(accountIdResourceAttribute)
      .addAttributes(serviceNameResourceAttribute)
      .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:Administrator',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: exampleAccountId,
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceName',
  value: 'service',
  operator: 'stringEquals',
};
const policyResources = [
  {
    attributes: [accountIdResourceAttribute, serviceNameResourceAttribute]
  },
];
const params = {
  type: 'access',
  subjects: policySubjects,
  roles: policyRoles,
  resources: policyResources,
};

iamPolicyManagementService.createPolicy(params)
  .then(res => {
    examplePolicyId = res.result.id;
    console.log(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:Administrator')
account_id_resource_attribute = ResourceAttribute(
  name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
  name='serviceName', value='service')
policy_resources = PolicyResource(
  attributes=[account_id_resource_attribute,
        service_name_resource_attribute])

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: core.StringPtr("exampleUserID"),
}
policySubjects := &iampolicymanagementv1.PolicySubject{
  Attributes: []iampolicymanagementv1.SubjectAttribute{*subjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
  RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::role:Administrator"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("accountId"),
  Value:    core.StringPtr(exampleAccountID),
  Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("serviceName"),
  Value:    core.StringPtr("service"),
  Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
  Attributes: []iampolicymanagementv1.ResourceAttribute{
    *accountIDResourceAttribute, *serviceNameResourceAttribute}
}

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))

您可以分配对一组服务的访问权。 要分配对 所有启用身份和访问权的服务的访问权,请为 name 属性指定 serviceType,然后使用 value service。 要分配对 所有帐户管理服务的访问权,请为 name 属性指定 serviceType,并使用 value platform_service。 要分配对帐户管理服务子集 所有 IAM 帐户管理服务的访问权,请为 name 属性指定 service_group_id,并使用 value IAM

部分账户的服务 ID 可享受更高的保单限额。 要利用增加的策略限制,请分配对 Event Streams 或 IBM Cloud Object Storage 服务的访问。 您还必须将访问策略的范围限定为特定的服务实例、资源类型和资源 ID。

以下示例请求允许服务 ID Reader 角色访问 Object Storage 的实例。 它将访问范围限定为特定的服务实例、资源类型和资源 ID:

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Reader role for SERVICE_NAME's RESOURCE_NAME",
  "subjects": [
    {
      "attributes": [
        {
          "name": "iam_id",
          "value": "$SERVICE_ID"
        }
      ]
    }'
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Reader"
    }
  ],
  "resources":[
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "$ACCOUNT_ID"
        },
        {
          "name": "serviceName",
          "value": "cloud-object-storage"
        },,
        {
          "name": "serviceInstance",
          "value": "$INSTANCE_ID",
          "operator": "stringEquals"
        }
        {
          "name": "resourceType",
          "value": "$RESOURCE_TYPE",
          "operator": "stringEquals"
        },
        {
          "name": "resource",
          "value": "$RESOURCE_NAME",
          "operator": "stringEquals"
        }
      ]
    }
  ]
}'

使用 API 在资源组中分配访问权

此操作只能通过 UI 或 CLI 完成。 要查看步骤,请切换到 UI 或 CLI 指示信息。

准备工作

在使用 Terraform 分配对资源的访问权之前,请确保已完成以下操作:

  • 安装 Terraform CLI 并为 Terraform 配置 IBM Cloud 提供程序插件。 有关更多信息,请参阅 Terraform on IBM Cloud®入门 教程。 该插件对用于完成此任务的 IBM Cloud API 进行抽象。
  • 创建一个名为 main.tf 的Terraform配置文件。 在此文件中,您使用 HashiCorp 配置语言来定义资源。 有关更多信息,请参阅 Terraform 文档

使用 Terraform 分配对资源的访问权

要使用 Terraform 分配对资源的访问权,请执行以下步骤:

  1. 使用 main.tf 文件中的 ibm_iam_user_policy 资源参数来分配对资源的访问权。

    以下示例通过使用 ibm_iam_user_policykms 服务的所有实例提供 test@in.ibm.com Viewer 角色。

    resource "ibm_iam_user_policy" "policy" {
     ibm_id = "test@in.ibm.com"
     roles  = ["Viewer"]
    
    resources {
     service = "kms"
    }
    }
    

    部分账户的服务 ID 可享受更高的保单限额。 要利用增加的策略限制,请分配对 Event Streams 或 IBM Cloud Object Storage 服务的访问。 您还必须将访问策略的范围限定为特定的服务实例、资源类型和资源 ID。

    下面的示例通过 ibm_iam_user_policy 使 Reader 角色的服务 ID 可以访问 Object Storage 的实例。 它将访问范围限定为特定的服务实例、资源类型和资源 ID:

    resource "ibm_iam_service_policy" "policy" {
     iam_service_id = "$SERVICE_ID"
     roles          = ["Reader"]
    
    resources {
     service              = "cloud_object_storage"
     resource_instance_id = "$SERVICE_INSTANCE_ID"
     resource_type = "$RESOURCE_TYPE"
     resource      = "$RESOURCE"
    }
    }
    

    您可以在 service 选项上指定要为其分配访问权的服务的名称。 有关更多信息,请参阅 Terraform Identity and Access Management(IAM) 页面上的参数参考详细信息。

  2. 完成构建配置文件后,初始化 Terraform CLI。 有关更多信息,请参阅 初始化工作目录

    terraform init
    
  3. main.tf 文件供应资源。 有关更多信息,请参阅 使用 Terraform 供应基础架构

    1. 运行 terraform plan 以生成 Terraform 执行计划来预览建议的操作。

      terraform plan
      
    2. 运行 terraform apply 以创建计划中定义的资源。

      terraform apply
      

使用 Terraform 在资源组中分配访问权

要使用 Terraform 在资源组中分配访问权,请执行以下步骤。

  1. 使用 main.tf 文件中的 ibm_iam_user_policy 资源在资源组内分配访问权。

    以下示例通过使用 ibm_iam_user_policy 为标识为 data.ibm_resource_group.group.id 的资源组提供 test@in.ibm.com Viewer 角色。

    data "ibm_resource_group" "group" {
     name = "default"
    }
    
    resource "ibm_iam_user_policy" "policy" {
     ibm_id = "test@in.ibm.com"
     roles  = ["Viewer"]
    
    resources {
     service           = "containers-kubernetes"
     resource_group_id = data.ibm_resource_group.group.id
    }
    }
    

    您可以在 resource_group_id 选项上指定要为其分配访问权的资源组的标识。 有关更多信息,请参阅 Terraform Identity and Access Management(IAM) 页面上的参数参考详细信息。

  2. 完成构建配置文件后,初始化 Terraform CLI。 有关更多信息,请参阅 初始化工作目录

    terraform init
    
  3. main.tf 文件供应资源。 有关更多信息,请参阅 使用 Terraform 供应基础架构

    1. 运行 terraform plan 以生成 Terraform 执行计划来预览建议的操作。

      terraform plan
      
    2. 运行 terraform apply 以创建计划中定义的资源。

      terraform apply
      

在控制台中删除访问权限

除去用户或服务标识的访问权可能需要最多 10 分钟才能生效。

  1. 在 IBM Cloud 控制台中,单击 管理 > 访问权 (IAM),然后根据要管理的身份选择 用户服务标识
  2. 选择要除去其访问权的用户的名称或服务标识。
  3. 来自使用权选项卡,点击操作图标操作图标>消除在要删除的策略所在行上单击删除。
  4. 查看您要删除的政策详情,然后点击 “删除” 进行确认。

您还可以从访问组中除去用户和服务标识,方法是选中要除去的用户或服务标识的复选框,然后单击 除去。 然后,再次单击 除去 以核准该过程。

使用CLI取消访问

要使用 CLI 除去用户策略,可以使用 ibmcloud iam user-policy-delete 命令。

ibmcloud iam user-policy-delete USER_ID POLICY_ID [-f, --force]

要使用CLI删除服务ID策略,可以使用 ibmcloud iam service-policy-delete 命令。

ibmcloud iam service-policy-delete SERVICE_ID POLICY_ID [-f, --force]

使用API取消访问

通过提供策略标识并调用 IBM Cloud® Identity and Access Management(IAM)策略管理 API 来删除策略,如以下样本请求中所示:

curl -X DELETE 'https://iam.cloud.ibm.com/v1/policies/$POLICY_ID' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json'
DeletePolicyOptions options = new DeletePolicyOptions.Builder()
      .policyId(examplePolicyId)
      .build();

service.deletePolicy(options).execute();
const params = {
  policyId: examplePolicyId,
};

iamPolicyManagementService.deletePolicy(params)
.then(res => {
  console.log(JSON.stringify(res, null, 2));
})
.catch(err => {
  console.warn(err)
});
response = iam_policy_management_service.delete_policy(
  policy_id=example_policy_id
).get_result()

print(json.dumps(response, indent=2))
options := iamPolicyManagementService.NewDeletePolicyOptions(
  examplePolicyID,
)

response, err := iamPolicyManagementService.DeletePolicy(options)
if err != nil {
  panic(err)
}

如果主题标识包含锁定的服务标识,那么无法删除策略。

在控制台中复审已分配的访问权

如果需要查看您所在帐户中分配给您的访问权,请完成以下步骤:

  1. 在 IBM Cloud 控制台中,单击 管理 > 访问权 (IAM),然后根据要复审的身份选择 用户服务标识
  2. 选择您的名称或服务标识。
  3. 访问权 选项卡中查看分配的访问权。

如果需要更多访问权,您必须联系帐户所有者来更新访问权,或者联系服务或服务实例的管理员来更新访问策略。

使用 CLI 复审分配的访问权

如果需要查看已添加到的帐户中分配的访问权,那么可以使用 ibmcloud iam user-policies 命令。 此示例列出了用户 name@example.com 的策略:

ibmcloud iam user-policies name@example.com

使用 API 复审分配的访问权

通过使用 API,您只能检索帐户中的所有策略并按属性值进行过滤。 您可以通过转至 IBM Cloud 控制台中的 管理 > 用户 > your_name > 访问 来检查帐户中分配的访问权。 要检索策略,请调用 IBM Cloud® Identity and Access Management(IAM)策略管理 API,如以下样本请求中所示:

curl -X GET 'https://iam.cloud.ibm.com/v1/policies?account_id=$ACCOUNT_ID' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json'
ListPoliciesOptions options = new ListPoliciesOptions.Builder()
    .accountId(exampleAccountId)
    .iamId(EXAMPLE_USER_ID)
    .build();

Response<PolicyList> response = service.listPolicies(options).execute();
PolicyList policyList = response.getResult();

System.out.println(policyList);
const params = {
  accountId: exampleAccountId,
  iamId: exampleUserId
};

iamPolicyManagementService.listPolicies(params)
 .then(res => {
   console.log(JSON.stringify(res.result, null, 2));
 })
 .catch(err => {
   console.warn(err)
 });
policy_list = iam_policy_management_service.list_policies(
 account_id=example_account_id, iam_id=example_user_id
).get_result()

print(json.dumps(policy_list, indent=2))
options := iamPolicyManagementService.NewListPoliciesOptions(
 exampleAccountID,
)
options.SetIamID(exampleUserID)

policyList, response, err := iamPolicyManagementService.ListPolicies(options)
if err != nil {
 panic(err)
}
b, _ := json.MarshalIndent(policyList, "", "  ")
fmt.Println(string(b))