4. プロジェクト、ユーザー、ロールの管理

クラウドの管理者は、プロジェクト、ユーザー、ロールを管理します。プロジェクトとは、ユーザーの割り当てが可能な、クラウド内の組織単位のことです。プロジェクトは、テナントまたはアカウントとしても知られています。ユーザーは、1 つまたは複数のプロジェクトのメンバーになることができます。ロールは、ユーザーが実行できるアクションを定義します。ロールは、ユーザーとプロジェクトのペアに割り当てます。

OpenStack サービスのロールのアクションは /etc/PROJECT/policy.json ファイルで定義できます。たとえば、Compute Service のロールが実行可能なアクションは /etc/nova/policy.json ファイルで定義します。

プロジェクト、ユーザー、ロールは個別に管理することができます。

クラウドの設定時に、オペレーターはプロジェクト、ユーザー、ロールを少なくとも 1 つ定義してください。

プロジェクトおよびユーザーの追加、更新、削除、1 つまたは複数のプロジェクトへのユーザーの割り当て、割り当ての変更または削除についての方法を実習します。プロジェクトまたはユーザーを有効化、または一時的に無効化するには、そのプロジェクトまたはユーザーを更新します。また、プロジェクトレベルでクォータを変更することも可能です。

ユーザーアカウントを削除する前に、主要プロジェクトからこのユーザーアカウントを削除する必要があります。

keystone クライアントのコマンドを実行する前に、OpenStack の RC ファイルをダウンロードして読み込む必要があります。https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux_OpenStack_Platform/エンドユーザーガイド を参照してください。

4.1. サービス

サービスカタログを確認するには、以下の keystone クライアントのコマンドを使用します。

4.1.1. service-create

キーワード引数:

  • 名前

  • 種別

  • 説明

例:

$ keystone service-create \
 --name=nova \
 --type=compute \
 --description="Nova Compute Service"

4.1.2. service-list

引数

  • service_id

例:

$ keystone service-list

4.1.3. service-get

引数

  • service_id

例:

$ keystone service-get 08741d8ed88242ca88d1f61484a0fe3b

4.1.4. service-delete

引数

  • service_id

例:

$ keystone service-delete 08741d8ed88242ca88d1f61484a0fe3b

4.1.5. テナント (プロジェクト) の作成

テナントは、0 以上のユーザーのグループです。nova では、テナントは仮想マシンを所有し、swift では、テナントはコンテナーを所有します。ダッシュボードでは、テナントはプロジェクトとして表示されます。ユーザーは、複数のテナントと関連付けすることが可能です。また、各テナントとユーザーのペアには、ロールを割り当てることができます。

  1. 全プロジェクトとその ID、名前、プロジェクトの有効化/無効化の状態を表示します。

    $ keystone tenant-list
    +----------------------------------+--------------------+---------+
    |                id                |        name        | enabled |
    +----------------------------------+--------------------+---------+
    | f7ac731cc11f40efbc03a9f9e1d1d21f |       admin        |   True  |
    | c150ab41f0d9443f8874e32e725a4cc8 |      alt_demo      |   True  |
    | a9debfe41a6d4d09a677da737b907d5e |        demo        |   True  |
    | 9208739195a34c628c58c95d157917d7 | invisible_to_admin |   True  |
    | 3943a53dc92a49b2827fae94363851e1 |      service       |   True  |
    | 80cab5e1f02045abad92a2864cfd76cb |    test_project    |   True  |
    +----------------------------------+--------------------+---------+
  2. new-project という名前のプロジェクトを作成します。

    $ keystone tenant-create --name new-project --description 'my new project'

    デフォルトでは、このプロジェクトは有効になっています。

    +-------------+----------------------------------+
    |   Property  |              Value               |
    +-------------+----------------------------------+
    | description |          my new project          |
    |   enabled   |               True               |
    |      id     | 1a4a0618b306462c9830f876b0bd6af2 |
    |     name    |           new-project            |
    +-------------+----------------------------------+

    次の手順で更新できるように、プロジェクトの ID をメモしておいてください。

4.1.6. プロジェクトの更新

プロジェクト ID を指定して、プロジェクトを更新します。プロジェクトの名前、説明、有効化ステータスを更新できます。

  1. 一時的にプロジェクトを無効にします。

    $ keystone tenant-update PROJECT_ID --enabled false
  2. 無効にしたプロジェクトを有効にします。

    $ keystone tenant-update PROJECT_ID --enabled true
  3. プロジェクト名を更新します。

    $ keystone tenant-update PROJECT_ID --name project-new
  4. 変更内容を確認するには、更新したプロジェクトの情報を表示します。

    $ keystone tenant-get PROJECT_ID
    +-------------+----------------------------------+
    |   Property  |              Value               |
    +-------------+----------------------------------+
    | description |          my new project          |
    |   enabled   |               True               |
    |      id     | 1a4a0618b306462c9830f876b0bd6af2 |
    |     name    |           project-new            |
    +-------------+----------------------------------+

4.1.7. プロジェクトの削除

  • プロジェクトを削除します。

    $ keystone tenant-delete PROJECT_ID

4.1.8. ユーザーの作成

  1. 全ユーザーを表示します。

    $ keystone user-list

    この出力では、ユーザーの ID、名前、有効化の状態、メールが表示されます。

    +----------------------------------+----------+---------+----------------------+
    |                id                |   name   | enabled |        email         |
    +----------------------------------+----------+---------+----------------------+
    | 352b37f5c89144d4ad0534139266d51f |  admin   |   True  |  admin@example.com   |
    | 86c0de739bcb4802b8dc786921355813 |   demo   |   True  |   demo@example.com   |
    | 32ec34aae8ea432e8af560a1cec0e881 |  glance  |   True  |  glance@example.com  |
    | 7047fcb7908e420cb36e13bbd72c972c |   nova   |   True  |   nova@example.com   |
    +----------------------------------+----------+---------+----------------------+
  2. ユーザーを作成するには、名前を指定する必要があります。任意で、テナント ID、パスワード、メールアドレスを指定できます。テナント ID とパスワードの情報がなければダッシュボードにログインできないため、テナント ID とパスワードを指定することを推奨します。。

    new-user ユーザーを作成します。

    $ keystone user-create --name new-user --tenant_id 1a4a0618b306462c9830f876b0bd6af2 --pass PASSWORD
    +----------+----------------------------------+
    | Property |              Value               |
    +----------+----------------------------------+
    |  email   |                                  |
    | enabled  |               True               |
    |    id    | 6e5140962b424cb9814fb172889d3be2 |
    |   name   |             new-user             |
    | tenantId | 1a4a0618b306462c9830f876b0bd6af2 |
    +----------+----------------------------------+

4.1.9. ユーザーの更新

ユーザーの名前、メール、アドレス、有効化ステータスを更新できます。

  1. ユーザーアカウントを一時的に無効にします。

    $ keystone user-update USER_ID --enabled false

    ユーザーアカウントを無効にした場合、ユーザーはダッシュボードにログインできませんが、ユーザーアカウントのデータは保持されるため、いつでもそのユーザーを有効にすることができます。

  2. 無効にしたユーザーアカウントを有効にします。

    $ keystone user-update USER_ID --enabled true
  3. ユーザーアカウントの名前と説明を変更します。

    $ keystone user-update USER_ID --name user-new --email new-user@example.com
    ユーザーが更新されました。

4.1.10. ユーザーの削除

  • 指定のユーザーアカウントを削除します。

    $ keystone user-delete USER_ID

4.1.11. ロールの作成および割り当て

ユーザーは複数のプロジェクトのメンバーになることができます。複数のプロジェクトにユーザーを割り当てるには、ロールを定義してそのロールをユーザーとプロジェクトのペアに割り当てます。

  1. 利用可能なロールを一覧表示します。

    $ keystone role-list
    +----------------------------------+---------------+
    |                id                |      name     |
    +----------------------------------+---------------+
    | 71ccc37d41c8491c975ae72676db687f |     Member    |
    | 149f50a1fe684bfa88dae76a48d26ef7 | ResellerAdmin |
    | 9fe2ff9ee4384b1894a90878d3e92bab |    _member_   |
    | 6ecf391421604da985db2f141e46a7c8 |     admin     |
    | deb4fffd123c4d02a907c2c74559dccf |  anotherrole  |
    +----------------------------------+---------------+
  2. new-role ロールを作成します。

    $ keystone role-create --name new-role
    +----------+----------------------------------+
    | Property |              Value               |
    +----------+----------------------------------+
    |    id    | bef1f95537914b1295da6aa038ef4de6 |
    |   name   |             new-role             |
    +----------+----------------------------------+
  3. ユーザーをプロジェクトに割り当てるには、ロールをユーザーとプロジェクトのペアに割り当てる必要があります。これには、ユーザー、ロール、プロジェクト ID が必要です。

    1. ユーザーを一覧表示します。

      $ keystone user-list
      +----------------------------------+----------+---------+----------------------+
      |                id                |   name   | enabled |        email         |
      +----------------------------------+----------+---------+----------------------+
      | 352b37f5c89144d4ad0534139266d51f |  admin   |   True  |  admin@example.com   |
      | 981422ec906d4842b2fc2a8658a5b534 | alt_demo |   True  | alt_demo@example.com |
      | 036e22a764ae497992f5fb8e9fd79896 |  cinder  |   True  |  cinder@example.com  |
      | 86c0de739bcb4802b8dc786921355813 |   demo   |   True  |   demo@example.com   |
      | 32ec34aae8ea432e8af560a1cec0e881 |  glance  |   True  |  glance@example.com  |
      | 7047fcb7908e420cb36e13bbd72c972c |   nova   |   True  |   nova@example.com   |
      +----------------------------------+----------+---------+----------------------+

      ロールを割り当てるユーザーの ID をメモします。

    2. ロール ID を一覧表示します。

      $ keystone role-list
      +----------------------------------+---------------+
      |                id                |      name     |
      +----------------------------------+---------------+
      | 71ccc37d41c8491c975ae72676db687f |     Member    |
      | 149f50a1fe684bfa88dae76a48d26ef7 | ResellerAdmin |
      | 9fe2ff9ee4384b1894a90878d3e92bab |    _member_   |
      | 6ecf391421604da985db2f141e46a7c8 |     admin     |
      | deb4fffd123c4d02a907c2c74559dccf |  anotherrole  |
      | bef1f95537914b1295da6aa038ef4de6 |    new-role   |
      +----------------------------------+---------------+

      割り当てるロールの ID をメモします。

    3. プロジェクトを一覧表示します。

      $ keystone tenant-list
      +----------------------------------+--------------------+---------+
      |                id                |        name        | enabled |
      +----------------------------------+--------------------+---------+
      | f7ac731cc11f40efbc03a9f9e1d1d21f |       admin        |   True  |
      | c150ab41f0d9443f8874e32e725a4cc8 |      alt_demo      |   True  |
      | a9debfe41a6d4d09a677da737b907d5e |        demo        |   True  |
      | 9208739195a34c628c58c95d157917d7 | invisible_to_admin |   True  |
      | caa9b4ce7d5c4225aa25d6ff8b35c31f |      new-user      |   True  |
      | 1a4a0618b306462c9830f876b0bd6af2 |    project-new     |   True  |
      | 3943a53dc92a49b2827fae94363851e1 |      service       |   True  |
      | 80cab5e1f02045abad92a2864cfd76cb |    test_project    |   True  |
      +----------------------------------+--------------------+---------+

      ロールを割り当てるプロジェクトの ID をメモします。

  4. ユーザーとプロジェクトのペアにロールを割り当てます。以下の例では、new-role ロールが demotest-project のペアに割り当てられます。

    $ keystone user-role-add --user USER_ID --role ROLE_ID --tenant TENANT_ID
  5. ロールの割り当てを確認します。

    $ keystone user-role-list --user USER_ID --tenant TENANT_ID
    +------------------------+----------+------------------------+------------------------+
    |           id           |   name   |        user_id         |       tenant_id        |
    +------------------------+----------+------------------------+------------------------+
    | bef1f95537914b1295.etc | new-role | 86c0de739bcb4802b8.etc | 80cab5e1f02045abad.etc |
    +------------------------+----------+------------------------+------------------------+
  6. 指定のロールの詳細を取得します。

    $ keystone role-get ROLE_ID
    +----------+----------------------------------+
    | Property |              Value               |
    +----------+----------------------------------+
    |    id    | bef1f95537914b1295da6aa038ef4de6 |
    |   name   |             new-role             |
    +----------+----------------------------------+
  7. ユーザーとプロジェクトのペアからロールを削除します。

    $ keystone user-role-remove --user USER_ID --role ROLE_ID --tenant TENANT_ID
  8. ロールの削除を確認するには、以下のコマンドを実行してください。

    $ keystone user-role-list --user USER_ID --tenant TENANT_ID

    ロールが削除された場合、そのロールはコマンドの出力から省略されます。

4.2. プロジェクトセキュリティの管理

セキュリティグループは、全プロジェクトのインスタンスに適用される IP フィルターのルールセットで、インスタンスへのネットワークのアクセス権限を定義します。グループルールはプロジェクト別になっており、プロジェクトメンバーは自分のグループのデフォルトルールを編集して新規ルールセットを追加することができます。

プロジェクトにはすべて「default」のセキュリティグループが存在し、他にセキュリティグループが定義されていないインスタンスに対して適用されます。このセキュリティグループは、初期設定を変更しない限り、お使いのインスタンスへの受信トラフィックをすべて拒否し、送信トラフィックのみを許可します。

注記

ダッシュボードを使用したルール更新に関する情報は、「プロジェクトセキュリティの管理」を参照してください。

/etc/nova/nova.conf ファイルの allow_same_net_traffic オプションを使用して、ネットワークを共有するホストに対してルールを適用するかどうかを、グローバルに制御することができます。

各設定の動作:

  • True (default): 同じサブネット上のホストはフィルタリングされず、それらのホスト間では全種別のトラフィックの通過が許可されます。フラットなネットワーク上では、全プロジェクトのインスタンスすべてがフィルタリングなしに通信できます。VLAN ネットワークでは、同じプロジェクト内のインスタンス間でアクセスが可能です。また、同じサブネットからのトラフィックをすべて許可するように default のセキュリティグループを設定することで、この設定をシミュレートすることができます。

  • False: セキュリティグループが全接続に対して有効になります。

また、セキュリティグループの最大ルール数は、security_group_rules で制御され、各プロジェクトで許容されるセキュリティグループの数は security_groups クォータで制御されます (「クォータの管理」参照)。

手順3.1 現在のセキュリティグループを一覧表示、表示します。

nova コマンドを使用して、コマンドラインからプロジェクトのセキュリティグループ一覧を取得できます。

  1. セキュリティグループのルールをチェックするユーザーとテナントに、システム変数が設定されていることを確認します。たとえば、

    export OS_USERNAME=demo00
    export OS_TENANT_NAME=tenant01
  2. 以下のコマンドで、セキュリティグループを出力します。

    $ nova secgroup-list
    +---------+-------------+
    | Name    | Description |
    +---------+-------------+
    | default | default     |
    | open    | all ports   |
    +---------+-------------+
  3. 以下のように、グループの詳細を表示します。

    $ nova secgroup-list-rules groupName

    例を以下に示します。

    $ nova secgroup-list-rules open
    +-------------+-----------+---------+-----------+--------------+
     | IP Protocol | From Port | To Port | IP Range  | Source Group |
     +-------------+-----------+---------+-----------+--------------+
     | icmp        | -1        | 255     | 0.0.0.0/0 |              |
     | tcp         | 1         | 65535   | 0.0.0.0/0 |              |
     | udp         | 1         | 65535   | 0.0.0.0/0 |              |
     +-------------+-----------+---------+-----------+--------------+

    デフォルトは「拒否」であるため、これらのルールは「許可」タイプのルールです。最初のコラムは、IP プロトコル (icmp、tcp、または udp) で、2 番目と 3 番目のコラムは、影響を受けるポート範囲を指定します。3 番目のコラムは、CIDR 形式で IP 範囲を指定します。この例は、全 IP から通信が許可された全プロトコルの完全なポート範囲を表示しています。

手順3.2 セキュリティグループの作成

新規セキュリティグループを追加する際は、簡潔な記述名を選択するようにしてください。通常長い説明フィールドが表示されない場所でも、この名前はこのグループを使用するインスタンスの簡単な説明の欄に表示されます。たとえば、インスタンスがセキュリティグループ「http」を使用していると表示された方が「bobs_group」や「secgrp1」よりもはるかに判断しやすくなります。

  1. セキュリティグループのルールをチェックするユーザーとテナントに、システム変数が設定されていることを確認します。

  2. 以下のように、セキュリティグループを追加します。

    $ nova secgroup-create Group Name Description

    例を以下に示します。

    $ nova secgroup-create global_http "Allows Web traffic anywhere on the Internet."
    +---------------------+-------------+----------------------------------------------+
    | Id                  | Name        | Description                                  |
    +---------------------+-------------+----------------------------------------------+
    | 1578a08c-...dd9f23b | global_http | Allows Web traffic anywhere on the Internet. |
    +---------------------+-------------+----------------------------------------------+

  3. 以下のように、新しいグループルールを追加します。

    $ nova secgroup-add-rule secGroupName ip-protocol from-port to-port CIDR

    引数は位置引数で、「from-port」と「to-port」の引数は、アクセスが許可されているローカルのポート範囲の接続を指定しており、この接続の送信元ポートと宛先ポートを指定しているわけではありません。たとえば、

    $ nova secgroup-add-rule global_http tcp 80 80 0.0.0.0/0
    +-------------+-----------+---------+-----------+--------------+
    | IP Protocol | From Port | To Port | IP Range  | Source Group |
    +-------------+-----------+---------+-----------+--------------+
    | tcp         | 80        | 80      | 0.0.0.0/0 |              |
    +-------------+-----------+---------+-----------+--------------+

    追加のルールを作成することで、複雑なルールセットを作成することができます。たとえば、http および https トラフィックの通過を許可するには、以下のコマンドを実行します。

    $ nova secgroup-add-rule global_http tcp 443 443 0.0.0.0/0
    +-------------+-----------+---------+-----------+--------------+
    | IP Protocol | From Port | To Port | IP Range  | Source Group |
    +-------------+-----------+---------+-----------+--------------+
    | tcp         | 443       | 443     | 0.0.0.0/0 |              |
    +-------------+-----------+---------+-----------+--------------+

    新たに追加されたルールのみが出力されますが、これは追加操作で、両ルールが作成され、有効になります。

  4. 以下のように、新規のセキュリティグループをすべて表示します。

    $ nova secgroup-list-rules global_http
    +-------------+-----------+---------+-----------+--------------+
    | IP Protocol | From Port | To Port | IP Range  | Source Group |
    +-------------+-----------+---------+-----------+--------------+
    | tcp         | 80        | 80      | 0.0.0.0/0 |              |
    | tcp         | 443       | 443     | 0.0.0.0/0 |              |
    +-------------+-----------+---------+-----------+--------------+

手順3.3 セキュリティグループの削除

  1. セキュリティグループを削除するユーザーとテナントに、システム変数が設定されていることを確認します。

  2. 以下のように、セキュリティグループを削除します。

    $ nova secgroup-delete GroupName

    例を以下に示します。

    $ nova secgroup-delete global_http

手順3.4 インスタンスのクラスターに対してセキュリティグループルールを作成する手順

ソースグループは、許可されたソースの CIDR を特別かつ動的に定義する方法です。ユーザーがソースグループ (セキュリティグループ名) を指定し、このソースグループを使用して、全ユーザーの他のインスタンスが動的に選択されます。これにより、クラスターの各新規メンバーを許可するための、個別ルールが必要なくなります。

  1. セキュリティグループを削除するユーザーとテナントに、システム変数が設定されていることを確認します。

  2. 以下のように、ソースグループを追加します。

    $ nova secgroup-add-group-rule secGroupName source-group ip-protocol from-port to-port

    例を以下に示します。

    $ nova secgroup-add-group-rule cluster global_http tcp 22 22

    cluster ルールは、global_http グループを使用する他のインスタンスからの ssh アクセスを許可します。