管理 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 访问策略支持在不同级别授予访问权。 以下是包含的一些选项:
- 对帐户中所有服务实例的访问权
- 对帐户中单个服务实例的访问权
- 对实例中特定资源 (例如
vpcId或instanceId) 的访问权。
下表列出了 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。
| 平台角色 | 操作描述 |
|---|---|
| 查看者 | 您可以查看服务实例,但无法对其进行修改。 |
| 运算符 | 您可以执行配置和运行服务实例所需的平台操作,例如查看服务仪表板。 |
| 编辑者 | 您可以执行除管理账户和分配访问策略以外的所有平台操作。 |
| 管理员 | 您可以基于此角色所分配的资源执行所有平台操作,包括向其他用户分配访问策略。 |
| 服务角色 | 操作描述 |
|---|---|
| 读取者 | 您可以在服务内执行只读操作,例如查看该服务特有的资源。 |
| 写入者 | 您拥有的权限超出了“读者”角色的范围,包括创建和编辑特定服务的资源。 |
| 管理者 | 您拥有超出“写入者”角色的权限,这使您能够执行该服务所定义的特权操作。 此外,您还可以创建和编辑服务特定资源。 |
| VPNClient | 如果需要分配对配置了用户标识和验证码认证的 VPN 客户端的访问权,那么仅需要选择此角色。 如果需要配置用户标识和验证码认证,请参阅 配置用户标识和验证码。 |
| 裸机高级网络操作员 | 您有权修改裸机接口上的 IP 电子欺骗和基础架构 NAT。 |
| 裸机控制台管理员 | 您可以访问裸机服务器控制台。 |
| IP 电子欺骗操作员 | 您可以在虚拟服务器实例上启用或禁用 IP 电子欺骗检查。 仅在必要时授予此角色。 |
| 控制台管理员 | 您可以访问虚拟服务器实例控制台。 此角色仅提供控制台访问权,并且必须与对虚拟服务器具有操作员访问权的其他角色 (例如,操作员,编辑者或管理员) 组合。 |
有关映射到每个角色的确切操作的更多信息,请参阅 IAM 角色和操作页面上的 Infrastructure Services。
以下链接可将您直接转至 IAM 角色和操作页面上的特定基础架构服务。
网络 IAM 角色和操作
计算 IAM 角色和操作
存储 IAM 角色和操作
- Block Storage for VPC
- Block Storage Snapshots for VPC
- Block Storage VPC 的多卷快照
- 备份即服务(Backup as a Service for VPC)
- File Storage for VPC
某些 VPC 任务需要多个 IAM 操作的授权。 例如,创建虚拟服务器实例不仅需要 is.instance.instance.create,还需要 is.vpc.vpc.operate,is.subnet.subnet.operate,is.security-group.security-group.operate 和 is.volume.volume.create。
可能需要其他条件操作。 例如,如果在专用主机上供应实例,那么需要 is.dedicated-host.dedicated-host-group.operate 和 is.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 的访问权。
| 角色名称 | 角色 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 中的“项目”。
仅当创建资源时,才能将该资源分配给资源组。 创建资源后,即不能更改资源所属的资源组。
如果您想使用多个资源组,最好提前规划好如何将组织中的资源和用户分配到各个资源组中。
有关资源组的更多信息,请参阅 资源组。