ネットワークのロールベースアクセス制御

ネットワークのロールベースアクセス制御

Liberty リリースで新しいポリシーフレームワークが追加され、リソースへのアクセスを特定のプロジェクトに対して許可できるようになりました。運用者とユーザーのどちらもがこの機能を利用できます。 Liberty リリースの時点では、この機能を使ってアクセスを許可できるのは、ネットワークへのポート作成だけです。

特定のプロジェクトとのネットワークの共有

特定のプロジェクトとのネットワークを共有するには、アクセスを許可したいプロジェクトに対してそのネットワークへの 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                       | 0                                    |
| 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.

この手順を繰り返して、任意の数のプロジェクトとネットワークを共有できます。

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

他の箇所に説明があるように、 neutron ではネットワークをすべてのプロジェクトと共有する方法が提供されています。これを行うには、ネットワークの shared フラグを使います。

$ neutron net-create global_network --shared

Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 9a4af544-7158-456d-b180-95f2e11eaa8c |
| mtu                       | 0                                    |
| 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_id                            |
+--------------------------------------+--------------------------------------+
| fcc63ae1-c56e-449d-8fb0-4f49f3cc8b55 | 9a4af544-7158-456d-b180-95f2e11eaa8c |
+--------------------------------------+--------------------------------------+

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 * に対して許可するエントリーがあります。 * はすべてのプロジェクトを表すワイルドカードです。

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

net-listnet-show が実行されると、 shared フラグは、呼び出したプロジェクトと各ネットワークの RBAC エントリーに基いてサーバーで計算されます。ワイルドカードエントリーがあれば、 shared フラグは常に True にセットされます。存在するのが特定のプロジェクトとの共有だけの場合は、そのネットワークが共有されたプロジェクトでは shared フラグが True に見え、他のプロジェクトではフラグは False に見えます。

通常ユーザー同士のネットワーク共有をさせたくない場合

neutron のデフォルトの 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.