ロールベースアクセス制御 (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 |
+---------------------------+--------------------------------------+
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 が net-list や net-show を実行すると、このネットワークが見えますし、このネットワークにポートを作成することもできます。 (管理者と所有者以外の) 他のユーザーにはこのネットワークは見えません。
このプロジェクトへのアクセス許可を削除するには、 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 ポリシーを作成します。
$ 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 |
+-------------+--------------------------------------+
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 `` が qos-policy-list や qos-policy-show を実行すると、この QoS ポリシーが見えますし、この QoS ポリシーをネットワークのポートに結び付けることもできます。 (管理者と所有者以外の) 他のユーザーにはこの QoS ポリシーは見えません。
このプロジェクトへのアクセス許可を削除するには、 rbac-delete コマンドを使って、作成した RBAC ポリシーを削除します。
$ neutron rbac-delete e45e6917-3f3f-4835-ad54-d12c9151541d
Deleted rbac_policy: e45e6917-3f3f-4835-ad54-d12c9151541d
このプロジェクトにその QoS ポリシーが適用されたネットワークのポートがある場合は、その QoS ポリシーが使われなくなるまで RBAC ポリシーの削除は行われません。
$ 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 ポリシーを共有できます。
あるネットワークの外部ネットワークとしての利用を、すべてのプロジェクトではなく特定のプロジェクトに対してだけ許可するには、 access_as_external アクションを使用します。
外部ネットワークとして利用できるようにするネットワークを作成します。
$ 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 |
+---------------------------+--------------------------------------+
rbac-create コマンドを使ってポリシーエントリーを作成します (この例では、共有対象のプロジェクト ID は e28769db97d9449da658bc6931fcb683 です)。
$ neutron rbac-create --target-tenant e28769db97d9449da658bc6931fcb683 \
--action access_as_external --type network f9e39715-f7da-4bca-a74d-fc3675321661
Created a new rbac_policy:
+---------------+--------------------------------------+
| Field | Value |
+---------------+--------------------------------------+
| action | access_as_external |
| id | c26b3b05-5781-48a1-a36a-fb63072b5e56 |
| object_id | f9e39715-f7da-4bca-a74d-fc3675321661 |
| object_type | network |
| target_tenant | e28769db97d9449da658bc6931fcb683 |
| tenant_id | dfe49b63660e494fbdbf6ad2ca2a810f |
+---------------+--------------------------------------+
target-tenant パラメーターは、このネットワークへのアクセスが必要なプロジェクトです。 action パラメーターは、そのプロジェクトに許可する内容を指定します。 type パラメーターは、対象オブジェクトがネットワークであることを示しています。最後のパラメーターは外部アクセスを許可するネットワークの ID です。
この時点で、プロジェクト e28769db97d9449da658bc6931fcb683 が net-list や net-show を実行すると、このネットワークが見えますし、このネットワークにルーターのゲートウェイポートを接続できます。 (管理者と所有者以外の) 他のユーザーにはこのネットワークは見えません。
このプロジェクトへのアクセス許可を削除するには、 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.
この手順を繰り返して、任意の数のプロジェクトに対して、あるネットワークを外部ネットワークとして利用可能にできます。
ネットワーク作成時に external (外部ネットワーク) フラグが指定された場合は、全員にアクセスを許可するワイルドカードの 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 |
+---------------------------+--------------------------------------+
上記の出力では、標準の router: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 | * |
+--------------------------------------+---------------+
他の access_as_external RBAC ポリシーと同じく、このポリシーも、同じ制約の元、変更したり削除したりできます。
デフォルトの policy.json では、通常ユーザーがワイルドカードで他のすべてのプロジェクトとオブジェクトを共有することは許可されていませんが、通常ユーザーが特定のプロジェクトとオブジェクトを共有することは許可されています。
運用者が通常ユーザーにこれを許したくない場合は、 policy.json のエントリー create_rbac_policy を "" から "rule:admin_only" に変更します。
管理者以外のユーザーがこの機能を使って別のプロジェクトとネットワークを共有している場合、そのユーザーには他のプロジェクトが作成したポートは見えませんし、そのポートを削除することもできません。これは、 ユーザーが管理者かサービスユーザー以外の場合、neutron のデータベース操作では、データベースクエリーが要求を行ったユーザーのプロジェクトが所有するオブジェクトに自動的に限定されるためです。この問題の状況はバグ https://bugs.launchpad.net/neutron/+bug/1498790 で管理されています
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.