ロールベースアクセス制御 (RBAC)

ロールベースアクセス制御 (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     |
+---------------------------+--------------------------------------+

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 です。

この時点で、プロジェクト e28769db97d9449da658bc6931fcb683net-listnet-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 ポリシーの共有

共有する 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-listqos-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 ポリシーを共有できます。

‘shared’ フラグとポリシーエントリーの関係

他の箇所に説明があるように、 neutron ではオブジェクト (network, qos-policy) をすべてのプロジェクトと共有する方法が提供されています。これを行うには、オブジェクトの shared フラグを使います。

$ 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 は両者を同じものとして扱います。したがって、 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 |
+--------------------------------------+-------------+--------------------------------------+

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     |
+---------------+--------------------------------------+

出力には、タイプが network のオブジェクト 9a4af544-7158-456d-b180-95f2e11eaa8c へのアクション access_as_shared を target_tenant * に対して許可するエントリーがあります。 * はすべてのプロジェクトを表すワイルドカードです。

現時点では、 shared フラグは単にネットワークの RBAC ポリシーにマッピングされているだけです。ネットワークの shared フラグを True に設定すると、ワイルドカードの RBAC エントリーが作成されます。 フラグを False に設定すると、ワイルドカードエントリーは削除されます。

net-listnet-show が実行されると、 shared フラグは、呼び出したプロジェクトと各ネットワークの RBAC エントリーに基いてサーバーで計算されます。 QoS ポリシーの場合は、それぞれ qos-policy-list or qos-policy-show が対応します。ワイルドカードエントリーがあれば、 shared フラグは常に True にセットされます。存在するのが特定のプロジェクトとの共有だけの場合は、そのオブジェクトが共有されたプロジェクトでは shared フラグが 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. 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 です。

この時点で、プロジェクト e28769db97d9449da658bc6931fcb683net-listnet-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 で管理されています

Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.