基于角色的访问控制 (RBAC)

基于角色的访问控制 (RBAC) 策略框架使操作员和用户能够为特定项目授予对资源的访问权限。

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

当前,可以使用此功能授予的访问权限受以下对象支持:

  • 在网络上创建常规端口的权限(自 Liberty 版本起)。

  • 将 QoS 策略权限绑定到网络或端口(自 Mitaka 版本起)。

  • 将路由器网关附加到网络(自 Mitaka 版本起)。

  • 将安全组绑定到端口(自 Stein 版本起)。

  • 将地址范围分配给子网池(自 Ussuri 版本起)。

  • 将子网池分配给子网(自 Ussuri 版本起)。

  • 将地址组分配给安全组规则(自 Wallaby 版本起)。

与特定项目共享对象

通过创建允许目标项目对该对象执行 access_as_shared 操作的策略条目,可以与特定项目共享对象。

与特定项目共享网络

创建要共享的网络

$ openstack network create secret_network
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2017-01-25T20:16:40Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | f55961b9-3eb8-42eb-ac96-b97038b568de |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | None                                 |
| mtu                       | 1450                                 |
| name                      | secret_network                       |
| port_security_enabled     | True                                 |
| project_id                | 61b7eba037fd41f29cfba757c010faff     |
| provider:network_type     | vxlan                                |
| provider:physical_network | None                                 |
| provider:segmentation_id  | 9                                    |
| qos_policy_id             | None                                 |
| revision_number           | 3                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      | []                                   |
| updated_at                | 2017-01-25T20:16:40Z                 |
+---------------------------+--------------------------------------+

使用 openstack network rbac create 命令创建策略条目(在此示例中,我们要共享的项目的 ID 是 b87b2fc13e0248a4a031d38e06dc191d

$ openstack network rbac create --target-project \
b87b2fc13e0248a4a031d38e06dc191d --action access_as_shared \
--type network f55961b9-3eb8-42eb-ac96-b97038b568de
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | f93efdbf-f1e0-41d2-b093-8328959d469e |
| name              | None                                 |
| object_id         | f55961b9-3eb8-42eb-ac96-b97038b568de |
| object_type       | network                              |
| project_id        | 61b7eba037fd41f29cfba757c010faff     |
| target_project_id | b87b2fc13e0248a4a031d38e06dc191d     |
+-------------------+--------------------------------------+

target-project 参数指定需要访问网络的项目。 action 参数指定项目允许执行的操作。 type 参数表示目标对象是网络。 最后一个参数是要授予访问权限的网络 ID。

项目 b87b2fc13e0248a4a031d38e06dc191d 现在可以在运行 openstack network listopenstack network show 时看到该网络,并且还可以在该网络上创建端口。 除了管理员和所有者之外,任何其他用户都无法看到该网络。

注意

子网继承其网络的 RBAC 策略条目。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除允许它的策略

$ openstack network rbac delete f93efdbf-f1e0-41d2-b093-8328959d469e

如果该项目在网络上有端口,服务器将阻止删除策略,直到删除端口为止

$ openstack network rbac delete f93efdbf-f1e0-41d2-b093-8328959d469e
RBAC policy on object f93efdbf-f1e0-41d2-b093-8328959d469e
cannot be removed because other objects depend on it.

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

与特定项目共享 QoS 策略

创建要共享的 QoS 策略

$ openstack network qos policy create secret_policy
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| description       |                                      |
| id                | 1f730d69-1c45-4ade-a8f2-89070ac4f046 |
| name              | secret_policy                        |
| project_id        | 61b7eba037fd41f29cfba757c010faff     |
| revision_number   | 1                                    |
| rules             | []                                   |
| shared            | False                                |
| tags              | []                                   |
+-------------------+--------------------------------------+

使用 openstack network rbac create 命令创建 RBAC 策略条目(在此示例中,我们要共享的项目的 ID 是 be98b82f8fdf46b696e9e01cebc33fd9

$ openstack network rbac create --target-project \
be98b82f8fdf46b696e9e01cebc33fd9 --action access_as_shared \
--type qos_policy 1f730d69-1c45-4ade-a8f2-89070ac4f046
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | 8828e38d-a0df-4c78-963b-e5f215d3d550 |
| name              | None                                 |
| object_id         | 1f730d69-1c45-4ade-a8f2-89070ac4f046 |
| object_type       | qos_policy                           |
| project_id        | 61b7eba037fd41f29cfba757c010faff     |
| target_project_id | be98b82f8fdf46b696e9e01cebc33fd9     |
+-------------------+--------------------------------------+

target-project 参数指定需要访问 QoS 策略的项目。 action 参数指定项目允许执行的操作。 type 参数表示目标对象是 QoS 策略。 最后一个参数是要授予访问权限的 QoS 策略 ID。

项目 be98b82f8fdf46b696e9e01cebc33fd9 现在可以在运行 openstack network qos policy listopenstack network qos policy show 时看到 QoS 策略,并且还可以将其绑定到其端口或网络。 除了管理员和所有者之外,任何其他用户都无法看到 QoS 策略。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除 RBAC 策略

$ openstack network rbac delete 8828e38d-a0df-4c78-963b-e5f215d3d550

如果该项目在其端口或网络上应用了 QoS 策略,服务器将不会删除 RBAC 策略,直到不再使用 QoS 策略为止

$ openstack network rbac delete 8828e38d-a0df-4c78-963b-e5f215d3d550
RBAC policy on object 8828e38d-a0df-4c78-963b-e5f215d3d550
cannot be removed because other objects depend on it.

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

与特定项目共享安全组

创建要共享的安全组

$ openstack security group create my_security_group
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2019-02-07T06:09:59Z                 |
| description       | my_security_group                    |
| id                | 5ba835b7-22b0-4be6-bdbe-e0722d1b5f24 |
| location          | None                                 |
| name              | my_security_group                    |
| project_id        | 077e8f39d3db4c9e998d842b0503283a     |
| revision_number   | 1                                    |
| rules             | ...                                  |
| tags              | []                                   |
| updated_at        | 2019-02-07T06:09:59Z                 |
+-------------------+--------------------------------------+

使用 openstack network rbac create 命令创建 RBAC 策略条目(在此示例中,我们要共享的项目的 ID 是 32016615de5d43bb88de99e7f2e26a1e

$ openstack network rbac create --target-project \
32016615de5d43bb88de99e7f2e26a1e --action access_as_shared \
--type security_group 5ba835b7-22b0-4be6-bdbe-e0722d1b5f24
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | 8828e38d-a0df-4c78-963b-e5f215d3d550 |
| name              | None                                 |
| object_id         | 5ba835b7-22b0-4be6-bdbe-e0722d1b5f24 |
| object_type       | security_group                       |
| project_id        | 077e8f39d3db4c9e998d842b0503283a     |
| target_project_id | 32016615de5d43bb88de99e7f2e26a1e     |
+-------------------+--------------------------------------+

target-project 参数指定需要访问安全组的项目。 action 参数指定项目允许执行的操作。 type 参数表示目标对象是安全组。 最后一个参数是要授予访问权限的安全组 ID。

项目 32016615de5d43bb88de99e7f2e26a1e 现在可以在运行 openstack security group listopenstack security group show 时看到安全组,并且还可以将其绑定到其端口。 除了管理员和所有者之外,任何其他用户都无法看到安全组。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除 RBAC 策略

$ openstack network rbac delete 8828e38d-a0df-4c78-963b-e5f215d3d550

如果该项目在其端口上应用了安全组,服务器将不会删除 RBAC 策略,直到不再使用安全组为止

$ openstack network rbac delete 8828e38d-a0df-4c78-963b-e5f215d3d550
RBAC policy on object 8828e38d-a0df-4c78-963b-e5f215d3d550
cannot be removed because other objects depend on it.

可以重复此过程任意次数,以与任意数量的项目共享 security-group。

创建使用通过 RBAC 共享的安全组的实例,但仅在调用 Nova 时指定网络 ID 目前不起作用。 在这种情况下,Nova 将检查给定的安全组是否存在于 Neutron 中,然后它会在给定的网络中创建端口。 出现问题的原因是 Nova 仅请求按 project_id 过滤的安全组,因此它无法从 Neutron API 获取共享的安全组。 有关详细信息,请参阅 bug 1942615。 为了解决此问题,用户需要在 Neutron 中先创建端口,然后将该端口传递给 Nova

$ openstack port create --network net1 --security-group
5ba835b7-22b0-4be6-bdbe-e0722d1b5f24 shared-sg-port

$ openstack server create --image cirros-0.5.1-x86_64-disk --flavor m1.tiny
--port shared-sg-port vm-with-shared-sg

与特定项目共享地址范围

创建要共享的地址范围

$ openstack address scope create my_address_scope
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| id                | c19cb654-3489-4160-9c82-8a3015483643 |
| ip_version        | 4                                    |
| location          | ...                                  |
| name              | my_address_scope                     |
| project_id        | 34304bc4f233470fa4a2448d153b6324     |
| shared            | False                                |
+-------------------+--------------------------------------+

使用 openstack network rbac create 命令创建 RBAC 策略条目(在此示例中,我们要共享的项目的 ID 是 32016615de5d43bb88de99e7f2e26a1e

$ openstack network rbac create --target-project \
32016615de5d43bb88de99e7f2e26a1e --action access_as_shared \
--type address_scope c19cb654-3489-4160-9c82-8a3015483643
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | d54b1482-98c4-44aa-9115-ede80387ffe0 |
| location          | ...                                  |
| name              | None                                 |
| object_id         | c19cb654-3489-4160-9c82-8a3015483643 |
| object_type       | address_scope                        |
| project_id        | 34304bc4f233470fa4a2448d153b6324     |
| target_project_id | 32016615de5d43bb88de99e7f2e26a1e     |
+-------------------+--------------------------------------+

target-project 参数指定需要访问地址范围的项目。 action 参数指定项目允许执行的操作。 type 参数表示目标对象是地址范围。 最后一个参数是要授予访问权限的地址范围 ID。

项目 32016615de5d43bb88de99e7f2e26a1e 现在可以在运行 openstack address scope listopenstack address scope show 时看到地址范围,并且还可以将其分配给其子网池。 除了管理员和所有者之外,任何其他用户都无法看到地址范围。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除 RBAC 策略

$ openstack network rbac delete d54b1482-98c4-44aa-9115-ede80387ffe0

如果该项目在其子网池上应用了地址范围,服务器将不会删除 RBAC 策略,直到不再使用地址范围为止

$ openstack network rbac delete d54b1482-98c4-44aa-9115-ede80387ffe0
RBAC policy on object c19cb654-3489-4160-9c82-8a3015483643
cannot be removed because other objects depend on it.

可以重复此过程任意次数,以与任意数量的项目共享地址范围。

与特定项目共享子网池

创建要共享的子网池

$ openstack subnet pool create my_subnetpool --pool-prefix 203.0.113.0/24
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| address_scope_id  | None                                 |
| created_at        | 2020-03-16T14:23:01Z                 |
| default_prefixlen | 8                                    |
| default_quota     | None                                 |
| description       |                                      |
| id                | 11f79287-bc17-46b2-bfd0-2562471eb631 |
| ip_version        | 4                                    |
| is_default        | False                                |
| location          | ...                                  |
| max_prefixlen     | 32                                   |
| min_prefixlen     | 8                                    |
| name              | my_subnetpool                        |
| project_id        | 290ccedbcf594ecc8e76eff06f964f7e     |
| revision_number   | 0                                    |
| shared            | False                                |
| tags              |                                      |
| updated_at        | 2020-03-16T14:23:01Z                 |
+-------------------+--------------------------------------+

使用 openstack network rbac create 命令创建 RBAC 策略条目(在此示例中,我们要共享的项目的 ID 是 32016615de5d43bb88de99e7f2e26a1e

$ openstack network rbac create --target-project \
32016615de5d43bb88de99e7f2e26a1e --action access_as_shared \
--type subnetpool 11f79287-bc17-46b2-bfd0-2562471eb631
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | d54b1482-98c4-44aa-9115-ede80387ffe0 |
| location          | ...                                  |
| name              | None                                 |
| object_id         | 11f79287-bc17-46b2-bfd0-2562471eb631 |
| object_type       | subnetpool                           |
| project_id        | 290ccedbcf594ecc8e76eff06f964f7e     |
| target_project_id | 32016615de5d43bb88de99e7f2e26a1e     |
+-------------------+--------------------------------------+

target-project 参数指定需要访问子网池的项目。 action 参数指定项目允许执行的操作。 type 参数表示目标对象是子网池。 最后一个参数是要授予访问权限的子网池 ID。

项目 32016615de5d43bb88de99e7f2e26a1e 现在可以在运行 openstack subnet pool listopenstack subnet pool show 时看到子网池,并且还可以将其分配给其子网。 除了管理员和所有者之外,任何其他用户都无法看到子网池。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除 RBAC 策略

$ openstack network rbac delete d54b1482-98c4-44aa-9115-ede80387ffe0

如果该项目在其子网上有子网池应用,服务器将不会删除 RBAC 策略,直到不再使用子网池为止

$ openstack network rbac delete d54b1482-98c4-44aa-9115-ede80387ffe0
RBAC policy on object 11f79287-bc17-46b2-bfd0-2562471eb631
cannot be removed because other objects depend on it.

可以重复此过程任意次数,以与任意数量的项目共享子网池。

与特定项目共享地址组

创建要共享的地址组

$ openstack address group create test-ag --address 10.1.1.1
+-------------+--------------------------------------+
| Field       | Value                                |
+-------------+--------------------------------------+
| addresses   | ['10.1.1.1/32']                      |
| description |                                      |
| id          | cdb6eb3e-f9a0-4d52-8478-358eaa2c4737 |
| name        | test-ag                              |
| project_id  | 66c77cf262454777a8f455cce48c12c0     |
+-------------+--------------------------------------+

使用 openstack network rbac create 命令创建 RBAC 策略条目(在此示例中,我们要共享的项目的 ID 是 bbd82892525d4372911390b984ed3265

$ openstack network rbac create --target-project \
bbd82892525d4372911390b984ed3265 --action access_as_shared \
--type address_group cdb6eb3e-f9a0-4d52-8478-358eaa2c4737
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | c7414ac2-9a6b-420b-84c5-4158a6cca4f9 |
| name              | None                                 |
| object_id         | cdb6eb3e-f9a0-4d52-8478-358eaa2c4737 |
| object_type       | address_group                        |
| project_id        | 66c77cf262454777a8f455cce48c12c0     |
| target_project_id | bbd82892525d4372911390b984ed3265     |
+-------------------+--------------------------------------+

target-project 参数指定需要访问地址组的项目。 action 参数指定项目允许执行的操作。 type 参数表示目标对象是地址组。 最后一个参数是要授予访问权限的地址组 ID。

项目 bbd82892525d4372911390b984ed3265 现在可以在运行 openstack address group listopenstack address group show 时看到地址组,并且还可以将其分配给其安全组规则。 除了管理员和所有者之外,任何其他用户都无法看到地址组。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除 RBAC 策略

$ openstack network rbac delete c7414ac2-9a6b-420b-84c5-4158a6cca4f9

如果该项目在其安全组规则上应用了地址组,服务器将不会删除 RBAC 策略,直到不再使用地址组为止

$ openstack network rbac delete c7414ac2-9a6b-420b-84c5-4158a6cca4f9
RBAC policy on object cdb6eb3e-f9a0-4d52-8478-358eaa2c4737
cannot be removed because other objects depend on it

可以重复此过程任意次数,以与任意数量的项目共享地址组。

“shared”标志与这些条目的关系

如其他指南条目中所述,neutron 提供了一种使对象(address-scopenetworkqos-policysecurity-groupsubnetpool)对每个项目可用的一种方式。 这是使用受支持对象上的 shared 标志实现的

$ openstack network create global_network --share
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2017-01-25T20:32:06Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | 84a7e627-573b-49da-af66-c9a65244f3ce |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | None                                 |
| mtu                       | 1450                                 |
| name                      | global_network                       |
| port_security_enabled     | True                                 |
| project_id                | 61b7eba037fd41f29cfba757c010faff     |
| provider:network_type     | vxlan                                |
| provider:physical_network | None                                 |
| provider:segmentation_id  | 7                                    |
| qos_policy_id             | None                                 |
| revision_number           | 3                                    |
| router:external           | Internal                             |
| segments                  | None                                 |
| shared                    | True                                 |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      | []                                   |
| updated_at                | 2017-01-25T20:32:07Z                 |
+---------------------------+--------------------------------------+

这等效于在网络上创建允许每个项目执行操作 access_as_shared 的策略。 Neutron 将它们视为相同,因此应该可以使用 openstack network rbac list 命令看到该网络的策略条目

$ openstack network rbac list
+-------------------------------+-------------+--------------------------------+
| ID                            | Object Type | Object ID                      |
+-------------------------------+-------------+--------------------------------+
| 58a5ee31-2ad6-467d-           | qos_policy  | 1f730d69-1c45-4ade-            |
| 8bb8-8c2ae3dd1382             |             | a8f2-89070ac4f046              |
| 27efbd79-f384-4d89-9dfc-      | network     | 84a7e627-573b-49da-            |
| 6c4a606ceec6                  |             | af66-c9a65244f3ce              |
+-------------------------------+-------------+--------------------------------+

使用 openstack network rbac show 命令查看详细信息

$ openstack network rbac show 27efbd79-f384-4d89-9dfc-6c4a606ceec6
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| action            | access_as_shared                     |
| id                | 27efbd79-f384-4d89-9dfc-6c4a606ceec6 |
| name              | None                                 |
| object_id         | 84a7e627-573b-49da-af66-c9a65244f3ce |
| object_type       | network                              |
| project_id        | 61b7eba037fd41f29cfba757c010faff     |
| target_project_id | *                                    |
+-------------------+--------------------------------------+

输出显示该条目允许对类型为 network 的对象 84a7e627-573b-49da-af66-c9a65244f3ce 执行操作 access_as_shared,目标项目为 *,这是一个代表所有项目的通配符。

当前,shared 标志只是网络底层 RBAC 策略的一种映射。 将标志设置为网络的 True 会创建一个通配符 RBAC 条目。 将其设置为 False 会删除通配符条目。

当您运行 openstack network listopenstack network show 时,服务器会根据调用项目和每个网络的 RBAC 条目计算 shared 标志。 对于 QoS 对象,分别使用 openstack network qos policy listopenstack network qos policy show。 如果存在通配符条目,则 shared 标志始终设置为 True。 如果只有与特定项目共享的条目,只有共享该对象的项目会将标志视为 True,其余项目会将标志视为 False

允许将网络用作外部网络

要使网络对特定项目可用,而不是对所有项目可用,请使用 access_as_external 操作。

  1. 创建您希望可用作外部网络的网络

    $ openstack network create secret_external_network
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2017-01-25T20:36:59Z                 |
    | description               |                                      |
    | dns_domain                | None                                 |
    | id                        | 802d4e9e-4649-43e6-9ee2-8d052a880cfb |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | is_default                | None                                 |
    | mtu                       | 1450                                 |
    | name                      | secret_external_network              |
    | port_security_enabled     | True                                 |
    | project_id                | 61b7eba037fd41f29cfba757c010faff     |
    | proider:network_type      | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 21                                   |
    | qos_policy_id             | None                                 |
    | revision_number           | 3                                    |
    | router:external           | Internal                             |
    | segments                  | None                                 |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      | []                                   |
    | updated_at                | 2017-01-25T20:36:59Z                 |
    +---------------------------+--------------------------------------+
    
  2. 使用 openstack network rbac create 命令创建策略条目(在此示例中,我们要共享的项目的 ID 是 838030a7bf3c4d04b4b054c0f0b2b17c

    $ openstack network rbac create --target-project \
    838030a7bf3c4d04b4b054c0f0b2b17c --action access_as_external \
    --type network 802d4e9e-4649-43e6-9ee2-8d052a880cfb
    +-------------------+--------------------------------------+
    | Field             | Value                                |
    +-------------------+--------------------------------------+
    | action            | access_as_external                   |
    | id                | afdd5b8d-b6f5-4a15-9817-5231434057be |
    | name              | None                                 |
    | object_id         | 802d4e9e-4649-43e6-9ee2-8d052a880cfb |
    | object_type       | network                              |
    | project_id        | 61b7eba037fd41f29cfba757c010faff     |
    | target_project_id | 838030a7bf3c4d04b4b054c0f0b2b17c     |
    +-------------------+--------------------------------------+
    

“target-project”参数指定需要访问网络的项目。“action”参数指定项目允许执行的操作。“type”参数指示目标对象是一个网络。最后一个参数是我们授予外部访问权限的网络 ID。

现在,项目 838030a7bf3c4d04b4b054c0f0b2b17c 运行 openstack network listopenstack network show 时可以看到该网络,并且可以将路由器网关端口附加到该网络。除了管理员和所有者之外,任何其他用户都无法看到该网络。

要删除该项目的访问权限,请使用 openstack network rbac delete 命令删除允许它的策略

$ openstack network rbac delete afdd5b8d-b6f5-4a15-9817-5231434057be

如果该项目已将路由器网关端口附加到该网络,服务器会阻止删除策略,直到这些端口被删除为止。

$ openstack network rbac delete afdd5b8d-b6f5-4a15-9817-5231434057be
RBAC policy on object afdd5b8d-b6f5-4a15-9817-5231434057be
cannot be removed because other objects depend on it.

此过程可以重复任意次数,以使网络对任意数量的项目可用作外部网络。

如果在创建期间将网络标记为外部网络,现在它会隐式创建一个通配符 RBAC 策略,授予所有人访问权限,以保留在此功能添加之前的行为。

$ openstack network create global_external_network --external
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2017-01-25T20:41:44Z                 |
| description               |                                      |
| dns_domain                | None                                 |
| id                        | 72a257a2-a56e-4ac7-880f-94a4233abec6 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| is_default                | None                                 |
| mtu                       | 1450                                 |
| name                      | global_external_network              |
| port_security_enabled     | True                                 |
| project_id                | 61b7eba037fd41f29cfba757c010faff     |
| provider:network_type     | vxlan                                |
| provider:physical_network | None                                 |
| provider:segmentation_id  | 69                                   |
| qos_policy_id             | None                                 |
| revision_number           | 4                                    |
| router:external           | External                             |
| segments                  | None                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      | []                                   |
| updated_at                | 2017-01-25T20:41:44Z                 |
+---------------------------+--------------------------------------+

在上面的输出中,标准的 router:external 属性是 External,如预期。现在,RBAC 策略列表中可以看到一个通配符策略。

$ openstack network rbac list --long -c ID -c Action
+--------------------------------------+--------------------+
| ID                                   | Action             |
+--------------------------------------+--------------------+
| b694e541-bdca-480d-94ec-eda59ab7d71a | access_as_external |
+--------------------------------------+--------------------+

您可以像修改或删除任何其他 RBAC access_as_external 策略一样修改或删除此策略。

防止普通用户相互共享对象

默认的 policy.yaml 文件不允许普通用户使用通配符与其他项目共享对象;但是,它允许他们与特定的项目 ID 共享对象。

如果操作员希望防止普通用户执行此操作,则可以将 policy.yaml 中的 "create_rbac_policy": 条目从 "" 调整为 "rule:admin_only"

改进数据库 RBAC 查询操作

自从 [1] 出现在 Yoga 版本中以来,Neutron 在所有 RBAC 相关表中都对“target_tenant”(现在为“target_project”)和“action”列进行了索引。这改进了涉及 RBAC 表的 SQL 查询 [2]。任何早于 Yoga 的系统都不会拥有这些索引,但系统管理员可以按照以下步骤手动将它们添加到 Neutron 数据库

  • 找到 RBAC 表

$ tables=`mysql -e "use ovs_neutron; show tables;" | grep rbac`
  • 为“target_tenant”和“action”列插入索引

    $ for table in $tables do; mysql -e
    “alter table $table add key (action);

    alter table $table add key (target_tenant);”; done

为了防止系统升级期间出现错误,[3] 已实施并回溯到 Yoga。此补丁检查 Neutron 表中是否已存在任何索引,并避免再次执行索引创建命令。