OpenStack网络指南(24)基于角色的访问控制 (RBAC)

基于角色的访问控制(RBAC)策略框架允许运营商和用户授予对特定项目的资源的访问权。

支持的对象与特定项目共享

目前,可以使用此功能授予的访问权限受以下支持:
网络上的常规端口创建权限(自Liberty)。
绑定QoS策略权限到网络或端口(自Mitaka)。
将路由器网关连接到网络(自Mitaka)。

与特定项目共享对象

通过创建允许目标项目对该对象的access_as_shared操作的策略条目来实现与特定项目共享对象。

与特定项目共享网络

创建要共享的网络:

$ neutron net-create secret_network

Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 6532a265-43fb-4c8c-8edb-e26b39f2277c |
| mtu                       | 1450                                 |
| name                      | secret_network                       |
| port_security_enabled     | True                                 |
| provider:network_type     | vxlan                                |
| provider:physical_network |                                      |
| provider:segmentation_id  | 1031                                 |
| router:external           | False                                |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tenant_id                 | de56db175c1d48b0bbe72f09a24a3b66     |
+---------------------------+--------------------------------------+

使用neutron rbac-create命令创建策略条目(在此示例中,我们要共享的项目的ID为e28769db97d9449da658bc6931fcb683):

$ neutron rbac-create --target-tenant e28769db97d9449da658bc6931fcb683 \
  --action access_as_shared --type network 6532a265-43fb-4c8c-8edb-e26b39f2277c

Created a new rbac_policy:
+---------------+--------------------------------------+
| Field         | Value                                |
+---------------+--------------------------------------+
| action        | access_as_shared                     |
| id            | 1edebaf8-3fa5-47b9-b3dd-ccce2bd44411 |
| object_id     | 6532a265-43fb-4c8c-8edb-e26b39f2277c |
| object_type   | network                              |
| target_tenant | e28769db97d9449da658bc6931fcb683     |
| tenant_id     | de56db175c1d48b0bbe72f09a24a3b66     |
+---------------+--------------------------------------+

target-tenant参数指定需要访问网络的项目。 action参数指定项目允许执行的操作。 type参数表示目标对象是网络。 最后一个参数是我们授予访问权限的网络的ID。
项目e28769db97d9449da658bc6931fcb683现在将能够看到网络运行neutron net-list和neutron net-show时,也将能够在该网络上创建端口。 其他用户(管理员和所有者除外)将无法查看网络。
要删除该项目的访问,请删除允许使用neutron rbac-delete命令的策略:

$ neutron rbac-delete 1edebaf8-3fa5-47b9-b3dd-ccce2bd44411
Deleted rbac_policy: 1edebaf8-3fa5-47b9-b3dd-ccce2bd44411

如果该项目在网络上有端口,则服务器将阻止在端口被删除之前删除策略:

$ neutron rbac-delete 1edebaf8-3fa5-47b9-b3dd-ccce2bd44411
RBAC policy on object 6532a265-43fb-4c8c-8edb-e26b39f2277c
cannot be removed because other objects depend on it.

该过程可以重复任何次数以共享具有任意数量的项目的网络。

与特定项目共享QoS策略

创建用于共享的QoS策略:

$ neutron qos-policy-create secret_policy

Created a new policy:
+-------------+--------------------------------------+
| Field       | Value                                |
+-------------+--------------------------------------+
| description |                                      |
| id          | e45e6917-3f3f-4835-ad54-d12c9151541d |
| name        | secret_policy                        |
| rules       |                                      |
| shared      | False                                |
| tenant_id   | 5b32b072f8354942ab13b6decb1294b3     |
+-------------+--------------------------------------+

使用neutron rbac-create命令创建RBAC策略条目(在此示例中,我们要共享的项目的ID为a6bf6cfbcd1f4e32a57d2138b6bd41d1):

$ neutron rbac-create --target-tenant a6bf6cfbcd1f4e32a57d2138b6bd41d1 \
  --action access_as_shared --type qos-policy e45e6917-3f3f-4835-ad54-d12c9151541d

Created a new rbac_policy:
+---------------+--------------------------------------+
| Field         | Value                                |
+---------------+--------------------------------------+
| action        | access_as_shared                     |
| id            | ec2e3db1-de5b-4043-9d95-156f582653d0 |
| object_id     | e45e6917-3f3f-4835-ad54-d12c9151541d |
| object_type   | qos_policy                           |
| target_tenant | a6bf6cfbcd1f4e32a57d2138b6bd41d1     |
| tenant_id     | 5b32b072f8354942ab13b6decb1294b3     |
+---------------+--------------------------------------+

target-tenant参数指定需要访问QoS策略的项目。 action参数指定项目允许执行的操作。 type参数表示目标对象是QoS策略。 最后一个参数是我们授予访问权限的QoS策略的ID。
项目a6bf6cfbcd1f4e32a57d2138b6bd41d1现在将能够看到运行neutron qos-policy-list和neutron qos-policy-show的QoS策略,并且也能够将其绑定到其端口或网络。 没有其他用户(管理员和所有者除外)将能够看到QoS策略。
要删除该项目的访问,请删除允许使用neutron rbac-delete命令的RBAC策略:

$ neutron rbac-delete e45e6917-3f3f-4835-ad54-d12c9151541d
Deleted rbac_policy: e45e6917-3f3f-4835-ad54-d12c9151541d

如果该项目具有应用QoS策略的端口或网络,则服务器将不会删除RBAC策略,直到QoS策略不再使用:

$ neutron rbac-delete e45e6917-3f3f-4835-ad54-d12c9151541d
RBAC policy on object e45e6917-3f3f-4835-ad54-d12c9151541d
cannot be removed because other objects depend on it.

此过程可以重复任意次数,以与任意数量的项目共享qos策略。

“共享”标志如何与这些条目相关

如其他指南条目中所介绍的,neutron提供了一种使对象(网络,qos策略)可用于每个项目的手段。 这是使用支持的对象上的共享标志完成的:

$ neutron net-create global_network --shared

Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 9a4af544-7158-456d-b180-95f2e11eaa8c |
| mtu                       | 1450                                 |
| name                      | global_network                       |
| port_security_enabled     | True                                 |
| provider:network_type     | vxlan                                |
| provider:physical_network |                                      |
| provider:segmentation_id  | 1010                                 |
| router:external           | False                                |
| shared                    | True                                 |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tenant_id                 | de56db175c1d48b0bbe72f09a24a3b66     |
+---------------------------+--------------------------------------+

这相当于在网络上创建一个允许每个项目在该网络上执行操作access_as_shared的策略。 Neutron将它们视为同一个东西,因此该网络的策略条目应该使用neutron rbac-list命令可见:

$ neutron rbac-list

+--------------------------------------+-------------+--------------------------------------+
| id                                   | object_type | object_id                            |
+--------------------------------------+-------------+--------------------------------------+
| ec2e3db1-de5b-4043-9d95-156f582653d0 | qos_policy  | e45e6917-3f3f-4835-ad54-d12c9151541d |
| e7b7a4a7-8c3e-4003-9e15-5a9464c1ecea | network     | fcc63ae1-c56e-449d-8fb0-4f49f3cc8b55 |
+--------------------------------------+-------------+--------------------------------------+

使用neutron rbac-show命令查看详细信息:

$ neutron rbac-show fcc63ae1-c56e-449d-8fb0-4f49f3cc8b55

+---------------+--------------------------------------+
| Field         | Value                                |
+---------------+--------------------------------------+
| action        | access_as_shared                     |
| id            | fcc63ae1-c56e-449d-8fb0-4f49f3cc8b55 |
| object_id     | 9a4af544-7158-456d-b180-95f2e11eaa8c |
| object_type   | network                              |
| target_tenant | *                                    |
| tenant_id     | de56db175c1d48b0bbe72f09a24a3b66     |
+---------------+--------------------------------------+

输出显示该条目允许网络类型的对象9a4af544-7158-456d-b180-95f2e11eaa8c上的操作access_as_shared target_tenant *,这是表示所有项目的通配符。
当前,共享标志仅仅是到网络的底层RBAC策略的映射。 在网络上将标志设置为True会创建一个通配符RBAC条目。 将其设置为False将删除通配符条目。
当运行neutron net-list或neutron net-show时,共享标志由服务器根据每个网络的调用项目和RBAC条目计算。 对于QoS对象,分别使用neutron qos-policy-list或neutron qos-policy-show。 如果有通配符条目,共享标志总是设置为True。 如果只有与特定项目共享的条目,则只有该对象共享的项目才会看到该标志为True,其余将看到该标志为False。

允许将网络用作外部网络

要使网络可用作特定项目(而不是所有项目)的外部网络,请使用access_as_external操作。
1.创建要作为外部网络使用的网络:

$ neutron net-create secret_external_network

Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2016-04-30T06:51:46                  |
| description               |                                      |
| id                        | f9e39715-f7da-4bca-a74d-fc3675321661 |
| ipv4_address_scope        |                                      |
| ipv6_address_scope        |                                      |
| mtu                       | 1450                                 |
| name                      | secret_external_network              |
| port_security_enabled     | True                                 |
| provider:network_type     | vxlan                                |
| provider:physical_network |                                      |
| provider:segmentation_id  | 1073                                 |
| router:external           | False                                |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| tenant_id                 | dfe49b63660e494fbdbf6ad2ca2a810f     |
| updated_at                | 2016-04-30T06:51:46                  |
+---------------------------+--------------------------------------+

2.使用neutron rbac-create命令创建策略条目(在此示例中,我们要共享的项目的ID为e28769db97d9449da658bc6931fcb683):
target-tenant参数指定需要访问网络的项目。 action参数指定项目允许执行的操作。 type参数指示目标对象是网络。 最后一个参数是我们授予外部访问权限的网络的ID。
现在项目e28769db97d9449da658bc6931fcb683能够看到网络当运行neutron net-list和neutron net-show并且可以连接路由器网关端口到那个网络。 没有其他用户(管理员和所有者除外)能够查看网络。
要删除该项目的访问,请删除允许使用neutron rbac-delete命令的策略:

$ neutron rbac-delete c26b3b05-5781-48a1-a36a-fb63072b5e56
Deleted rbac_policy: c26b3b05-5781-48a1-a36a-fb63072b5e56

如果该项目具有连接到该网络的路由器网关端口,则服务器防止在端口被删除之前删除该策略:

$ neutron rbac-delete c26b3b05-5781-48a1-a36a-fb63072b5e56
RBAC policy on object f9e39715-f7da-4bca-a74d-fc3675321661
cannot be removed because other objects depend on it.

该过程可以重复任何次数,以使网络可用作任意数量的项目的外部。
如果网络在创建期间标记为外部,它现在隐式地创建通配符RBAC策略,授予每个人访问以保留之前的行为,然后添加此功能。

$ neutron net-create global_external_network --router:external

Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2016-04-30T07:00:57                  |
| description               |                                      |
| id                        | cb78991c-cdde-445b-a8ca-d819b9266756 |
| ipv4_address_scope        |                                      |
| ipv6_address_scope        |                                      |
| is_default                | False                                |
| mtu                       | 1450                                 |
| name                      | global_external_network              |
| port_security_enabled     | True                                 |
| provider:network_type     | vxlan                                |
| provider:physical_network |                                      |
| provider:segmentation_id  | 1007                                 |
| router:external           | True                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      |                                      |
| tenant_id                 | dfe49b63660e494fbdbf6ad2ca2a810f     |
| updated_at                | 2016-04-30T07:00:57                  |
+---------------------------+--------------------------------------+

在标准路由器上方的输出中:external属性为True,如预期。 现在,通配符策略在RBAC策略列表中可见:

$ neutron rbac-list --object_id=cb78991c-cdde-445b-a8ca-d819b9266756 \
  -c id -c target_tenant

+--------------------------------------+---------------+
| id                                   | target_tenant |
+--------------------------------------+---------------+
| 2b72fe2e-20cf-4856-af12-3ac0733604d8 | *             |
+--------------------------------------+---------------+

您可以使用与任何其他RBAC access_as_external策略相同的约束来修改或删除此策略。

防止常规用户彼此共享对象

默认的policy.json文件不允许普通用户使用通配符与每个其他项目共享对象; 但是,它将允许他们与特定项目ID共享对象。
如果操作员希望阻止正常用户执行此操作,则policy.json中的“create_rbac_policy”:条目可以从“”调整为“rule:admin_only”。

展开阅读全文

没有更多推荐了,返回首页