IBM Cloud Docs
管理授权以授予服务之间的访问权限

管理授权以授予服务之间的访问权限

使用IBM Cloud® Identity and Access Management(IAM) 创建或删除授予IBM Cloud Metrics Routing访问IBM Cloud Monitoring服务的授权。

IAM 的许多功能都侧重于管理和执行用户和应用程序对IBM Cloud资源的访问。 但是,您可能会遇到其他情况,需要让一个服务访问另一个服务中的用户资源。 此类型访问权称为授权。

在授权中,源服务是被授予对目标服务的访问权的服务。 您选择的角色定义了源服务的访问级别。 目标服务是您根据分配的角色授予源服务访问许可权的服务。 源服务可以在创建授权的同一帐户中,也可以在另一个帐户中。 目标服务始终位于创建授权的帐户中。 您可以通过在 IBM Cloud 控制台的“授权”页面上查看特定授权的“源帐户”列,来查看源服务是位于当前帐户中还是位于其他帐户中。

管理权限的许可权

您必须有访问目标服务的权限,才能管理服务间的授权。

您为 IBM Cloud Metrics Routing 服务定义的自动化要求您具有 IBM Cloud Monitoring 服务的 Administrator 角色。

下表概述了目标服务上需要的许可权才能定义授权:

管理授权所需的目标服务上的操作
操作 管理员 运算符 编辑者 查看者
查看帐户中配置的所有授权 复选标记图标
创建授权 复选标记图标
删除权限 复选标记图标

用户只能看到他们在帐户中配置的权限。

在控制台中创建授权

完成以下步骤:

  1. 在 IBM Cloud 控制台中,单击 管理 > 访问权 (IAM),然后选择 授权

  2. 单击创建

  3. 选择源帐户。

    如果需要访问目标服务的源服务位于此帐户中,请选择 此帐户

    如果需要访问目标服务的源服务位于其他帐户中,请选择 其他帐户。 然后,输入源帐户的帐户标识。

  4. 选择 IBM Cloud Metrics Routing 作为源服务。 然后,设置对 所有资源的访问权的作用域。

  5. 选择 IBM Cloud Monitoring 作为目标服务。 然后,通过配置 基于所选属性的资源 > 服务实例来设置对 所有资源 或单个实例的访问范围。

    此类型的授权不支持其他属性。

  6. 服务访问权 部分中,选择 Supertenant 度量发布程序 以分配对访问目标服务的源服务的访问权。

  7. 单击授权

如果在另一个帐户中的服务与当前帐户中的目标服务之间创建授权,那么您只需要具有对目标资源的访问权。 对于源帐户,您只需要帐号。 

使用 CLI 创建授权

您必须有权访问目标服务,才能在服务之间创建授权。 为 IBM Cloud Metrics Routing 服务定义的授权要求您对 IBM Cloud Monitoring 服务拥有 Administrator 角色。

如果拥有创建策略和授权的 IAM 权限,则只能授予作为目标服务用户所拥有的访问权限级别。 例如,如果您拥有目标服务的查看器访问权限,则只能为授权分配查看器角色。 如果尝试分配更高级别的权限(如管理员),可能会出现权限已授予的情况,但只会分配目标服务的最高级别权限(即查看器)。

运行以下命令以创建 IBM Cloud Metrics Routing 服务的授权。

ibmcloud iam authorization-policy-create metrics-router sysdig-monitor "Supertenant Metrics Publisher"
  1. 您可以使用 [--target-service-instance-name TARGET_SERVICE_INSTANCE_NAME | --target-service-instance-id TARGET_SERVICE_INSTANCE_ID] 对特定 IBM Cloud Monitoring实例进行范围设置。
  2. 请勿提供任何其他作用域选项。

有关可用于此命令的所有参数的更多信息,请参阅 ibmcloud iam authorization-policy-create

使用 Terraform 创建授权

在使用 Terraform 创建授权之前,请确保已完成以下操作:

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

使用以下步骤通过 Terraform 创建授权:

  1. 使用 main.tf 文件中的 ibm_iam_authorization_policy 资源参数在服务之间创建授权策略。

    以下示例在服务之间创建授权:

    resource "ibm_iam_authorization_policy" "policy" {
      source_service_name = "metrics-router"
      target_service_name = "sysdig-monitor"
      roles               = ["Supertenant Metrics Publisher"]
      description         = "Authorization Policy"
      transaction_id     = "terraformAuthorizationPolicy"
    }
    

    ibm_iam_authorization_policy 资源需要源服务,目标服务和角色。 源服务被授予对目标服务的访问权,而角色是该访问权所允许的许可权级别。 (可选) 您可以添加授权描述和事务标识。

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

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

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

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

      terraform apply
      

使用应用程序接口创建授权

您必须有权访问目标服务,才能在服务之间创建授权。 作为目标服务的用户,您只能授予自己拥有的访问级别。 您为 IBM Cloud Metrics Routing 服务定义的自动化要求您具有 IBM Cloud Monitoring 服务的 Administrator 角色。

要授权源服务访问目标服务,请使用 IAM 策略管理 API。 请参阅以下 API 示例,以了解在指定了 type=authorization 的情况下创建策略方法。

用于创建授权策略的受支持属性取决于每个服务支持的内容。 有关每个服务的受支持属性的更多信息,请参阅您正在使用的服务的文档。

curl --request POST \
  --url https://iam.cloud.ibm.com/v1/policies \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "type": "authorization",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<account-id>"
                },
                {
                    "name": "serviceName",
                    "value": "metrics-router"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<account-id>"
                },
                {
                    "name": "serviceName",
                    "value": "sysdig-monitor"
                }
            ]
        }
    ]
}'
SubjectAttribute accountSubjectAttribute = new SubjectAttribute.Builder()
      .name("accountId")
      .value(exampleAccountId)
      .build();

SubjectAttribute serviceNameSubjectAttribute = new SubjectAttribute.Builder()
      .name("serviceName")
      .value("metrics-router")
      .build();

PolicySubject policySubjects = new PolicySubject.Builder()
      .addAttributes(accountSubjectAttribute)
      .addAttributes(serviceNameSubjectAttribute)
      .build();

PolicyRole policyRoles = new PolicyRole.Builder()
      .roleId("crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher")
      .build();

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

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

ResourceAttribute serviceInstanceResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceInstance")
      .value(exampleTargetInstanceId)
      .operator("stringEquals")
      .build();

ResourceAttribute resourceTypeResourceAttribute = new ResourceAttribute.Builder()
      .name("resourceType")
      .value(exampleResourceType)
      .operator("stringEquals")
      .build();

ResourceAttribute resourceResourceAttribute = new ResourceAttribute.Builder()
      .name("resource")
      .value(exampleResourceId)
      .operator("stringEquals")
      .build();

PolicyResource policyResources = new PolicyResource.Builder()
      .addAttributes(accountIdResourceAttribute)
      .addAttributes(serviceNameResourceAttribute)
      .build();

CreatePolicyOptions options = new CreatePolicyOptions.Builder()
      .type("authorization")
      .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: 'accountId',
        value: exampleAccounId,
      },
      {
        name: 'serviceName',
        value: "metrics-router",
      }
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: exampleAccountId,
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceName',
  value: "sysdig-monitor"",
  operator: 'stringEquals'
};

const policyResources = [
  {
    attributes: [
      accountIdResourceAttribute,
      serviceNameResourceAttribute
    ],
  },
];
const params = {
  type: 'authorization',
  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='accountId', value=example_account_id),
                SubjectAttribute(name='serviceName', value="metrics-router")
                ])
policy_roles = PolicyRole(
    role_id='crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher')
account_id_resource_attribute = ResourceAttribute(
    name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
    name='serviceName', value="sysdig-monitor")
policy_resources = PolicyResource(
    attributes=[account_id_resource_attribute,
                service_name_resource_attribute])

policy = iam_policy_management_service.create_policy(
    type='authorization',
    subjects=[policy_subjects],
    roles=[policy_roles],
    resources=[policy_resources]
).get_result()

print(json.dumps(policy, indent=2))
accountSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
    Name:  core.StringPtr("accountId"),
    Value: &exampleAccountID,
    Operator: core.StringPtr("stringEquals"),
}
serviceNameSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
    Name:  core.StringPtr("serviceName"),
    Value: "metrics-router",
    Operator: core.StringPtr("stringEquals"),
}
policySubjects := &iampolicymanagementv1.PolicySubject{
    Attributes: []iampolicymanagementv1.SubjectAttribute{*accountSubjectAttribute,
        *serviceNameSubjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
    RoleID: core.StringPtr("crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher"),
}
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("sysdig-monitor"),
    Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
    Attributes: []iampolicymanagementv1.ResourceAttribute{
        *accountIDResourceAttribute, *serviceNameResourceAttribute},
}

options := iamPolicyManagementService.NewCreatePolicyOptions(
    "authorization",
    []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))

在控制台中除去授权

如果在目标服务上分配了 "Administrator 角色,则可以删除账户中服务之间的任何授权。 如果除去了源服务为其相依服务创建的任何访问策略,那么源服务将无法完成工作流程或访问目标服务。

  1. 在 IBM Cloud 控制台中,单击 管理 > 访问权 (IAM),然后选择 授权
  2. 确定要从帐户中除去的授权所在的行。
  3. 单击 操作 图标 "操作" 图标 > 除去
  4. 选择除去

如果从帐户中除去了源服务,那么该服务为其相依服务创建的任何策略都会被自动删除。 同样,如果从帐户中删除了相依服务,那么委派给该服务的所有访问策略也将被删除。

使用 CLI 除去授权

如果在目标服务上分配了 "Administrator 角色,则可以删除账户中服务之间的任何授权。 如果除去了源服务为其相依服务创建的任何访问策略,那么源服务将无法完成工作流程或访问目标服务。

以下样本将删除授权策略:

ibmcloud iam authorization-policy-delete 12345678-abcd-1a2b-a1b2-1234567890ab

有关可用于此命令的所有参数的更多信息,请参阅 ibmcloud iam authorization-policy-delete

如果从帐户中除去了源服务,那么该服务为其相依服务创建的任何策略都会被自动删除。 同样,如果从帐户中删除了相依服务,那么委派给该服务的所有访问策略也将被删除。

使用 API 除去授权

如果在目标服务上分配了 "Administrator 角色,则可以删除账户中服务之间的任何授权。 如果除去了源服务为其相依服务创建的任何访问策略,那么源服务将无法完成工作流程或访问目标服务。

要删除授权策略,请使用 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)
}

如果从帐户中除去了源服务,那么该服务为其相依服务创建的任何策略都会被自动删除。 同样,如果从帐户中删除了相依服务,那么委派给该服务的所有访问策略也将被删除。

使用 Terraform 除去授权

如果要使用 Terraform 除去授权,那么需要从 main.tf 文件中删除该参数。 删除参数后,使用以下步骤来供应文件:

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

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

    terraform apply