IBM Cloud Docs
管理 VPC 基础架构服务的 IAM 访问权

管理 VPC 基础架构服务的 IAM 访问权

您账户中用户对 IBM Cloud® Virtual Private Cloud 服务实例的访问由 Cloud Identity and Access Management (IAM) 控制。 访问 VPC Infrastructure Services 服务的每个用户都必须分配一个具有 IAM 角色的访问策略。 查看以下角色,操作和更多信息,以帮助确定分配对 VPC Infrastructure Services 的访问权的最佳方法。

您在帐户中为用户分配的访问策略确定用户可以在所选服务或特定实例的上下文中执行哪些操作。 允许的操作由 VPC Infrastructure Services 定制并定义为允许您对服务执行的操作。 每个操作都映射到您可以分配给用户的 IAM 平台或服务角色。

如果特定角色及其操作不符合您要处理的用例,那么可以 创建定制角色 并选取要包含的操作。

IAM 访问策略支持在不同级别授予访问权。 以下是包含的一些选项:

  • 对帐户中所有服务实例的访问权
  • 对帐户中单个服务实例的访问权
  • 对实例中特定资源 (例如 vpcIdinstanceId) 的访问权。

下表列出了 VPC 资源属性。 有关更多信息,请参阅 VPC 资源属性

VPC 资源属性
资源 资源属性
针对 VPC 的自动缩放 instanceGroupId:<instance-group-id>
备份服务 backupPolicyId: <backup-policy-id>
Block Storage for VPC volumeId: <volume-id>
Bare metal server bareMetalServerId: <bare-metal-server-id>
VPC 群集网络 clusterNetworkId: <cluster-network-id>
Dedicated Host for VPC dedicatedHostId:<dedicated-host-id>
File Storage shareId: <share-id>
Floating IP for VPC floatingIpId: <fip-id>
Flow Logs for VPC flowLogCollectorId: <flc-id>
VPC 的映像服务 imageId:<image-id>
VPC 的负载均衡器 loadBalancerId: <load-balancer-id>
Network ACL networkAclId: <nacl-id>
VPC 的放置组 placementGroupId: <placement-group-id>
VPC 专用路径服务 privatePathServiceGatewayId: <private-path-service-gateway-id>
VPC 的公共地址范围 publicAddressRangeId: <public-address-range-id>
Public Gateway for VPC publicGatewayId: <pgw-id>
VPC 的预留 reservationId: <reservation-id>
Security Group for VPC securityGroupId: <default-sec-grp-id>
快照 snapshotId: <snapshot-id>
SSH Key for VPC keyId:<key-id>
Subnet subnetId: <subnet-id>
虚拟网络接口 virtualNetworkInterfaceId:<virtual-network-interface-id>
Virtual Private Endpoint for VPC endpointGatewayId:<endpoint-gateway-id>
虚拟私有云 vpcId: <vpc-id>
Virtual Server for VPC instanceId: <instance-id>
VPN for VPC vpnGatewayID: <vpn-gateway-id>

查看以下各表,其中概述了在使用 VPC Infrastructure Services 服务时每个角色所允许的任务类型。 平台管理角色支持用户对平台级别的服务资源执行任务。 例如,为服务分配用户访问权限、创建或删除实例,以及将实例绑定到应用程序。 服务访问角色使用户能够访问 VPC Infrastructure Services 并能够调用 VPC Infrastructure Services API。

IAM VPC 基础设施服务平台角色
平台角色 操作描述
查看者 您可以查看服务实例,但不能修改它们。
运算符 您可以执行配置和操作服务实例所需的平台操作,例如查看服务仪表板。
编辑者 除管理账户和分配访问策略外,您可以执行所有平台操作。
管理员 您可以根据为该角色分配的资源执行所有平台操作,包括为其他用户分配访问策略。
IAM VPC 基础设施服务访问角色
服务角色 操作描述
读者 您可以在服务中执行只读操作,例如查看特定于服务的资源。
写入者 您拥有读者角色以外的权限,包括创建和编辑特定服务资源。
管理者 您拥有超出写入者角色的权限,允许您完成服务定义的特权操作。 此外,您还可以创建和编辑服务特定资源。
VPNClient 如果需要分配对配置了用户标识和验证码认证的 VPN 客户端的访问权,那么仅需要选择此角色。 如果需要配置用户标识和验证码认证,请参阅 配置用户标识和验证码
裸机高级网络操作员 您有权修改裸机接口上的 IP 电子欺骗和基础架构 NAT。
裸机控制台管理员 您可以访问裸机服务器控制台。
IP 电子欺骗操作员 您可以在虚拟服务器实例上启用或禁用 IP 电子欺骗检查。 仅在必要时授予此角色。
控制台管理员 您可以访问虚拟服务器实例控制台。 此角色仅提供控制台访问权,并且必须与对虚拟服务器具有操作员访问权的其他角色 (例如,操作员,编辑者或管理员) 组合。

有关映射到每个角色的确切操作的更多信息,请参阅 IAM 角色和操作页面上的 Infrastructure Services

以下链接可将您直接转至 IAM 角色和操作页面上的特定基础架构服务。

网络 IAM 作用和行动

计算 IAM 角色和操作

存储 IAM 角色和操作

某些 VPC 任务需要多个 IAM 操作的授权。 例如,创建虚拟服务器实例不仅需要 is.instance.instance.create,还需要 is.vpc.vpc.operateis.subnet.subnet.operateis.security-group.security-group.operateis.volume.volume.create。 可能需要其他条件操作。 例如,如果在专用主机上供应实例,那么需要 is.dedicated-host.dedicated-host-group.operateis.dedicated-host.dedicated-host.operate。 Virtual Private Cloud API 参考包含每个 API 调用的“授权”部分,例如 创建实例

在控制台中分配对 VPC 基础架构服务的访问权

您可以通过两种常见方法在控制台中分配访问权:

  • 每个用户的访问策略。 您可以从控制台中的“管理 > 访问权 (IAM) > 用户”页面管理每个用户的访问策略。 有关分配 IAM 访问权的步骤的更多信息,请参阅 管理对资源的访问权
  • 访问组。 访问组用于简化访问管理,方法是一次性分配对组的访问权,然后您可以根据需要在组中添加或除去用户以控制其访问权。 您可以从控制台中的“管理 > 访问权 (IAM) > 访问组”页面管理访问组及其访问权。 有关更多信息,请参阅 在控制台中分配对组的访问权

在 CLI 中分配对 VPC 基础架构服务的访问权

有关分配,除去和复审访问权的逐步指示信息,请参阅 使用 CLI 分配访问 ro 资源

以下示例显示了用于为 VPC Infrastructure Services 分配 Viewer 角色的命令:

使用 is 作为服务名称。 此外,请使用引号将角色名称括起,这些名称是多个单词,如此处的示例中所示。

ibmcloud iam user-policy-create USER@EXAMPLE.COM --service-name is --roles "Viewer"

使用 API 分配对 VPC 基础架构服务的访问权

有关分配,除去和复审访问权的逐步指示信息,请参阅 使用 API 分配对资源的访问权创建策略 API。 下表中的角色云资源名称 (CRN) 用于分配对 API 的访问权。

用于 API 的 VPC 基础设施服务角色 ID 值
角色名称 角色 CRN
查看者 crn:v1:bluemix:public:iam::::role:Viewer
运算符 crn:v1:bluemix:public:iam::::role:Operator
编辑者 crn:v1:bluemix:public:iam::::role:Editor
管理员 crn:v1:bluemix:public:iam::::role:Administrator
读者 crn:v1:bluemix:public:iam::::serviceRole:Reader
写入者 crn:v1:bluemix:public:iam::::serviceRole:Writer
管理者 crn:v1:bluemix:public:iam::::serviceRole:Manager
VPNClient crn:v1:bluemix:public:iam::::serviceRole:VPNClient
裸机高级网络操作员 crn:v1:bluemix:public:iam::::serviceRole:BareMetalAdvancedNetworkOperator
裸机控制台管理员 crn:v1:bluemix:public:iam::::serviceRole:BareMetalConsoleAdmin
IP 电子欺骗操作员 crn:v1:bluemix:public:iam::::serviceRole:IPSpoofingOperator
控制台管理员 crn:v1:bluemix:public:iam::::serviceRole:VirtualServerConsoleAdmin

以下示例用于为 VPC Infrastructure Services 分配 Viewer 角色:

使用 is 作为服务名称,并参阅“角色标识值”表以确保您使用的是正确的 CRN 值。

curl -X POST 'https://iam.cloud.ibm.com/v1/policies' -H 'Authorization: Bearer $TOKEN' -H 'Content-Type: application/json' -d '{
  "type": "access",
  "description": "Object Writer role for Cloud Object Storage",
  "subjects": [
    {
      "attributes": [
        {
          "name": "iam_id",
          "value": "IBMid-123453user"
        }
      ]
    }'
  ],
  "roles":[
    {
      "role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
    }
  ],
  "resources":[
    {
      "attributes": [
        {
          "name": "accountId",
          "value": "$ACCOUNT_ID"
        },
        {
          "name": "serviceName",
          "value": "is"
        }
      ]
    }
  ]
}
SubjectAttribute subjectAttribute = new SubjectAttribute.Builder()
      .name("iam_id")
      .value("IBMid-123453user")
      .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("ACCOUNT_ID")
      .operator("stringEquals")
      .build();

ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceName")
      .value("is")
      .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: 'IBMid-123453user',
      },
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:iam::::role:Viewer',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: 'ACCOUNT_ID',
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceName',
  value: 'is',
  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='IBMid-123453user')])
policy_roles = PolicyRole(
  role_id='crn:v1:bluemix:public:iam::::role:Viewer')
account_id_resource_attribute = ResourceAttribute(
  name='accountId', value='ACCOUNT_ID')
service_name_resource_attribute = ResourceAttribute(
  name='serviceName', value='is')
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("IBMid-123453user"),
}
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("ACCOUNT_ID"),
  Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
  Name:     core.StringPtr("serviceName"),
  Value:    core.StringPtr("is"),
  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))

使用 Terraform 分配对 VPC 基础架构服务的访问权

以下示例用于为 VPC Infrastructure Services 分配 Viewer 角色:

使用 is 作为服务名称。

resource "ibm_iam_user_policy" "policy" {
  ibm_id = "test@example.com"
  roles  = ["Viewer"]

  resources {
    service = "is"
  }
}

有关更多信息,请参阅 ibm_iam_user_policy

提示

  • 对容器资源的访问权不会自动授予对其子资源的访问权。 例如,授予对 VPC 的访问权并不会授予对该 VPC 中子网的访问权。
  • 与此类似,对子资源的访问权不会授予对其容器资源的访问权。 例如,授予对子网的访问权并不会授予对该子网的 VPC 的访问权。
  • 通常,要更改多个资源之间的关系,用户必须有权访问每个资源。 例如,要将网络接口连接到安全组,用户必须有权访问网络接口和安全组。

有关在控制台中分配用户角色的更多信息,请参阅 管理 VPC 资源的用户权限

您还可以使用 IBM Cloud® 命令行界面 (CLI) 来分配用户角色。 您可以使用资源属性来选择资源。 有关更多信息,请参阅 VPC 资源属性

资源组

_资源组是_资源的集合,如整个 VPC 或单个子网,这些资源被关联起来以建立授权和使用。 你可以把资源组看作一个项目、一个部门或一个团队可能使用的基础架构资源的集合。

大型企业可能会将 VPC 划分为各种资源组,而较小的公司可能只需要一个资源组,因为所有团队成员都有权访问整个 VPC。 如果您熟悉 OpenStack,资源组的概念类似于_项目_。OpenStack Keystone.

仅当创建资源时,才能将该资源分配给资源组。 创建资源后,即不能更改资源所属的资源组。

如果要使用多个资源组,最好计划好如何将资源和组织中的用户分配到每个资源组。

有关资源组的更多信息,请参阅 资源组

访问权管理标记

访问权管理标记 是添加到资源以帮助组织访问控制关系的元数据。 标记可创建灵活的资源分组以供您管理。

当您使用标记来控制对资源的访问时,团队的项目可以增长,而无需更新 IAM 策略。 您可以将访问管理标记附加到 VPC 基础架构资源,并且可以根据标记定义对这些资源的访问级别。

VPC 基础架构资源具有复杂的授权模型,在此模型中,单个 API 调用可能会检查对多个资源的授权。 对于此类 API,必须将标记附加到 API 需要访问的所有资源。 有关所需 API 授权的更多信息,请参阅 VPC API 参考

如果 API 调用针对资源组名称返回 UNKNOWN,请在创建访问管理标记策略时向资源组添加“查看者”访问权。

有关使用访问管理标记的更多信息,请参阅以下资源:

限制

  1. 当前实现与 API 规范之间存在一些差距,此处 记录了这些差距。

  2. 实例模板和专用主机组不支持访问管理标记。 因此,您无法使用这些标记来完全管理 自动缩放专用主机 访问权。

  3. 站点间 VPN 中使用的因特网密钥交换 (IKE) 和 IPsec 策略资源不支持访问管理标记。

“分配服务定义的角色”的 UI 限制

不支持使用 UI 向具有访问权管理标记的访问策略分配服务定义的角色。 仅通过 API 和 CLI 支持此功能。

使用 API 分配服务定义的角色

不支持使用 UI 向具有访问权管理标记的访问策略分配服务定义的角色。 仅通过 API 和 CLI 支持此功能。 对 API 使用以下示例。

curl --location --request POST 'https://iam.cloud.ibm.com/v1/policies' \
--header 'Content-Type: application/json' \
--header 'Authorization: <your token>' \
--data-raw '{
    "description": "useful description here",
    "type": "access",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "iam_id",
                    "value": "<user iam-id>"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:is::::serviceRole:VPNClient"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                            "name": "serviceName",
                            "value": "is",
                            "operator": "stringEquals"
                        },
                        {
                            "name": "accountId",
                            "value": "<your account id>"
                        }
            ],
            "tags":[
                {
                    "name": "abc",
                    "value": "test"
                }
            ]
        }
    ]
}'

使用 CLI 分配服务定义的角色

不支持使用 UI 向具有访问权管理标记的访问策略分配服务定义的角色。 仅通过 API 和 CLI 支持此功能。 将以下示例用于 CLI。

ic iam access-group-policy-create Developers_MyApp --roles Viewer --service-name kms --tags abc:test