第10章 プロジェクトとユーザーの管理

OpenStack クラウドはユーザーがいないと、あまり価値がありません。本章はユーザー、プロジェクトおよびクォータの管理に関する話題を説明します。

 プロジェクトかテナントか?

OpenStack のユーザーインターフェースおよびドキュメントにおいて、ユーザーのグループはプロジェクトまたはテナントと呼ばれます。これらの語は同じ意味で用いられます。

OpenStack Compute サービス (Nova) の初期実装は独自の認証システムを持ち、プロジェクトという用語を使用していました。認証が OpenStack Identity サービス (Keystone) プロジェクトに移行したとき、ユーザーのグループを意味する用語としてテナントという用語が使用されました。このような経緯のため、いくつかの OpenStack ツールはプロジェクトを使用し、いくつかはテナントを使用します。

このガイドはプロジェクトという用語を使用します。テナントという用語を使用するツールとやりとりする例もあります。

 プロジェクトの管理

ユーザーは少なくとも一つのプロジェクトに所属しなければいけませんが、複数のプロジェクトに所属することもできます。そのため、ユーザーを追加する前に、少なくとも一つのプロジェクトを追加する必要があります。

 プロジェクトの追加

ダッシュボードからプロジェクトを追加する方法:

  1. 管理ユーザーとしてログインします。

  2. 左側のナビゲーションバーにある「プロジェクト」リンクを選択します。

  3. 右上にある「プロジェクトの作成」ボタンをクリックします。

プロジェクト名と説明の入力が求められます(説明の入力は任意ですが、入力をお薦めします)。このプロジェクトを有効にするには、フォームの下にあるチェックボックスを選択します。これは標準で有効になっています。

プロジェクトメンバーを追加し、プロジェクトのクォータを調整することもできます。後述しますが、これらの操作を一度にすべて処理するほうが、実践的には非常に便利です。

コマンドラインインターフェース (CLI) からプロジェクトを作成する方法:

コマンドラインからのプロジェクト追加には、keystone ユーティリティを使用する必要があります。ここで「プロジェクト」の代わりに「テナント」を使用します。

# keystone tenant-create --name=demo

このコマンドは「demo」という名前のプロジェクトを作成します。--description <tenant-description>, を追加で指定することで、説明の文字列を付与できます。これは非常に便利です。また、コマンドに --enabled false を追加することにより、無効状態のグループを作成することもできます。標準で、プロジェクトは有効状態で作成されます。

 クォータ

OpenStack には数多くのクォータがあります。クォータは (ユーザー単位ではなく) プロジェクト単位で適用されます。ダッシュボード上で管理者ユーザーであれば、ナビゲーションサイドバーにある「クォータ」リンクを使用して、既定のクォータを参照できます (編集できません)。これらの規定のプロジェクトクォータはクラウドコントローラーにある nova.conf で指定されます。

クォータ関連の変更を行っていない場合、システムは以下の既定値を使用します。

表10.1 nova.conf ファイルのクォータ関連の設定オプションに関する説明
設定オプション=規定値 (型) 説明

quota_cores=20

(整数型) プロジェクト (テナント) ごとのインスタンスのコア数の最大値

quota_floating_ips=10

(整数型) プロジェクト (テナント) ごとの最大 Floating IP 数

quota_fixed_ips=-1

(整数型) プロジェクトごとの最大 Fixed IP 数 (少なくとも最大インスタンス数にはすべきです)。-1 は無制限です。

quota_gigabytes=1000

(整数型) プロジェクト (テナント) ごとのボリューム容量の最大値(単位はギガバイト)

quota_injected_file_content_bytes=10240

(整数型) injected file あたりの最大バイト数

quota_injected_file_path_bytes=255

(整数型) injected file のパス長の最大バイト数

quota_injected_files=5

(整数型) injected file の最大数

quota_instances=10

(整数型) プロジェクト (テナント) ごとの最大インスタンス数

quota_key_pairs=100

(整数型) ユーザーごとの最大キーペア数

quota_metadata_items=128

(整数型) インスタンスごとのメタデータ項目数

quota_ram=51200

(整数型) プロジェクト (テナント) ごとのインスタンスの最大 RAM 容量(メガバイト単位)

quota_security_group_rules=20

(整数型) セキュリティグループごとのセキュリティルール数

quota_security_groups=10

(整数型) プロジェクト (テナント) ごとのセキュリティグループ数

quota_volumes=10

(整数型) プロジェクト (テナント) ごとのボリューム数

設定の表は from http://docs.openstack.org/folsom/openstack-compute/admin/content/list-of-compute-config-options.html から抜粋されています。

プロジェクトの規定のクォータを変更する最も簡単な方法は、クラウドコントローラーにおいて nova.conf ファイルを編集することです。クォータは nova-scheduler サービスにより適用されます。そのため、これらのオプションを変更すると、そのサービスを再起動する必要があります。

あなたのサイトの実装がこの例のアーキテクチャーと異なるならば、/etc/nova/nova.conf にあるクォータのデフォルト値に関するオプションに対するすべての変更が nova-scheduler サービスを実行しているホストに適用されていることを確認して下さい。一貫性のあるクォータ設定のために、すべてのスケジューラーが同じクォータを持つことが非常に重要です。このガイドにおいて推奨されているベストプラクティスに従った場合、設定管理システムにより、自動的に、すべてのスケジューラーが一貫した設定を持った状態に保たれます。

各プロジェクトのクォータをダッシュボードから表示および編集する方法:

  1. 既存のプロジェクトの一覧を取得するには「プロジェクト」ナビゲーションリンクを使用します。

  2. 変更したいプロジェクトに移動し、「アクション」ドロップダウンメニューの最終行にある「クォータの変更」を選択します。

各プロジェクトのクォータを CLI から表示および編集する方法は、以下のとおりです。

コマンドラインからクォータの確認および変更をできますが、少しだけ複雑です。Keystone を使って ID を取得し、それから nova-manage を実行します。

  1. プロジェクトのクォータを一覧表示するには、まず Keystone CLI ツールを使用して ID を確認する必要があります。

    # keystone tenant-list | grep <tenant-name> 
    | 98333a1a28e746fa8c629c83a818ad57 | <tenant-name> | True | 
  2. Nova CLI ツールが「プロジェクト」を使用するところで、Keystone CLI ツールは同じ意味で「テナント」を使用することを思い出してください。

    上の例に対して、プロジェクトのクォータを表示するには、ID 98333a1a28e746fa8c629c83a818ad57 を使用する必要があります。

    # nova-manage project quota 98333a1a28e746fa8c629c83a818ad57
    metadata_items: 128
    volumes: 10
    gigabytes: 1000
    ram: 6291456
    security_group_rules: 20
    instances: 1024
    security_groups: 10
    injected_file_content_bytes: 10240
    floating_ips: 10
    injected_files: 5
    cores: 2048
    [注記]注記

    ややこしいことに、 nova-manage project quota はコマンドの最後の引き数にどんな文字列でも受け付け、その場合クォータの規定値が表示されます。特に、ID の代わりにプロジェクトの名前を入力しても、nova-manage は何も警告せず、単に嘘をつきます。

    これらの値を変更するには、上のコマンドに --key および --value フラグを追加します。プロジェクトの Floating IP のクォータを 10 から 20 に増やす方法:

    # nova-manage project quota 98333a1a28e746fa8c629c83a818ad57 --key floating_ips --value 20 
    metadata_items: 128 
    volumes: 10
    gigabytes: 1000
    ram: 6291456
    security_group_rules: 20
    instances: 1024
    security_groups: 10
    injected_file_content_bytes: 10240
    floating_ips: 20
    injected_files: 5
    cores: 2048

 ユーザー管理

直接コマンドラインツールを使ってユーザーを管理することは面倒です。一つの作業を完了するために複数のコマンドを実行する必要がありますし、多くの項目でシンボル名の代わりに UUID が使用されています。現実的に、人間はこれらのツールをそのまま使用しません。幸運なことに、OpenStack Dashboardが便利なインターフェースを提供しています。さらに、多くのサイトは個別の要求を満たすために独自ツールを作成し、サイト固有のポリシーを適用し、パッケージツールでは実現できないレベルのセルフサービスをユーザーに提供しています。

 新規ユーザーの作成

ユーザーを作成するには、以下の情報が必要です。

  • ユーザー名

  • 電子メールアドレス

  • パスワード

  • 主プロジェクト

  • 役割

ユーザー名と電子メールアドレスは見たとおりです。あなたのサイトは従うべき独自ルールがあるかもしれません。Identity サービスにおいてパスワードを設定および変更するには、管理者権限が必要です。Folsom リリースまでは、ユーザーが自分のパスワードを変更できません。これは独自のツールを作成する大きな理由になります。また、パスワードを割り当ておよび配布するときに気をつける必要があります。主プロジェクトは、単にそのユーザーが割り当てられる最初のプロジェクトです。このプロジェクトはユーザーを作成する前に存在している必要があります。役割は多くの場合ずっと「メンバー」のままになります。標準の状態で、OpenStack は次の 2 つの役割が定義されています。

  • 「member」:  一般的なユーザー。

  • 「admin」:  すべてのプロジェクトにわたり全権限を持つ管理ユーザー。非常に注意して使用する必要があります。

他の役割を定義できますが、一般的にはそうしません。

一旦これらの情報が揃ったら、ダッシュボードでのユーザーの作成は、これまでに見てきた他の Web フォームと同じです。「管理」ナビゲーションバーの「ユーザー」リンクにあります。そして、右上にある「ユーザーの作成」ボタンをクリックします。

ユーザー情報の変更は、この「ユーザー」ページから実行することもできます。多数のユーザーがいる場合、このページにはたくさんのユーザーが表示されてしまいます。ページの上部にある「フィルター」検索ボックスを使うと、表示されるユーザーの一覧を絞り込むことができます。変更しようとしているユーザーの行末にあるアクションドロップダウンメニューの「編集」を選択することにより、ユーザー作成ダイアログと非常に似ているフォームを表示できます。

 プロジェクトへのユーザーの割り当て

多くのサイトは一つのプロジェクトのみに割り当てられているユーザーで実行しています。これは、管理者にとってもユーザーにとっても、より保守的で分かりやすい選択です。管理の面では、ユーザーからインスタンスやクォータに関する問題の報告があった場合、どのプロジェクトに関するものかが明確です。ユーザーが一つのプロジェクトのみに所属している場合、ユーザーがどのプロジェクトで操作しているのかを気にする必要がありません。ただし、既定の設定では、どのユーザーも同じプロジェクトにいる他のユーザーのリソースに影響を与えることができることに注意してください。あなたの組織にとって意味があるならば、ユーザーを複数のプロジェクトに割り当てることも可能です。

ダッシュボードの「プロジェクト」ページから「アクション」列の「ユーザーの変更」を選んで、既存のユーザーへの追加のプロジェクトの割り当てや、古いプロジェクトからのユーザー削除を実行することができます。

このビューから、多くの有用な操作、いくつかの危険な操作を実行できます。

「すべてのユーザー (All Users)」という見出しが付けられた、このフォームの最初の列に、このプロジェクトにまだ割り当てられていない、クラウドのすべてのユーザーが一覧表示されます。2 列目には、すべての割り当て済みユーザーが一覧表示されます。これらの一覧は非常に長くなる可能性がありますが、それぞれの列の上部にあるフィルターフィールドに、探しているユーザー名の部分文字列を入力することにより、表示を絞り込むことができます。

ここから、プロジェクトにユーザーを追加するには + アイコンをクリックします。削除するには - をクリックします。

危険な点としては、メンバーの役割を変更する機能があることです。「プロジェクトメンバー」一覧のユーザー名の後ろにあるドロップダウンリストです。実際すべての場合で、この値は「Member」に設定すべきです。この例では意図的に、この値が 「admin」になっている管理ユーザーを示しています。

[重要]重要

「admin」は各プロジェクトの管理者ではなく、システム全体の管理者です。そのため、ユーザーに管理者の役割を与えることにより、クラウド全体にわたる管理者権限を与えることになります。

一般的な使用法は、一つのプロジェクトだけに管理ユーザーを所属させることです。慣例により、「admin」プロジェクトがクラウド環境のセットアップ中に標準で作成されます。管理ユーザーもクラウドを使用してインスタンスの起動、管理を行う場合には、管理アクセスと一般アクセス用に別々のユーザーアカウントを使用し、それらのユーザーを別々のプロジェクトにすることを強く推奨します。

 権限のカスタマイズ

デフォルトの認可設定では、管理ユーザーのみが他のプロジェクトのリソースを作成できます。OpenStack では以下の 2 種類の認可ポリシーを使うことができます。

  • 操作ベース: 特定の操作に対するアクセス基準を指定するポリシー。特定の属性に対する詳細な制御も可能です。

  • リソースベース: リソースに対して設定されたパーミッションに基づいて、特性のリソースに対するアクセスを許可するかを決定する (今のところネットワークリソースでのみ利用可能)。OpenStack により強制される実際の認可ポリシーは、導入の仕方により異なります。

ポリシーエンジンは policy.json ファイルから項目を読み込みます。このファイルの実際の位置はディストリビューションにより異なります。一般的に Nova 用の設定ファイルは /etc/nova/policy.json にあります。システムの実行中に項目を更新でき、サービスを再起動する必要がありません。今のところ、ポリシーファイルの編集がこのようなポリシーを更新する唯一の方法です。

OpenStack サービスのポリシーエンジンがポリシーと直接照合を行います。ルールはそのようなポリシーの要素の評価を意味します。たとえば、compute:create: [["rule:admin_or_owner"]] 文において、ポリシーは compute:create で、ルールは admin_or_owner です。

ポリシーのいずれかが OpenStack API 操作、もしくは指定された操作で使用されている特定の属性に一致する場合、ポリシーが OpenStack ポリシーエンジンにより呼び出されます。たとえば、ユーザーが POST /v2/{tenant_id}/servers リクエストを OpenStack Compute API サーバーに送信したときに必ず、エンジンが create:compute ポリシーを評価します。ポリシーは特定の API 拡張に関連づけることもできます。たとえば、ユーザーが compute_extension:rescue のような拡張に対して要求を行った場合、プロバイダー拡張により定義された属性は、その操作に対するルールテストを呼び出します。

認可ポリシーは、一つまたは複数のルールにより構成できます。複数のルールを指定した場合、いずれかのルールが成功と評価されれば、ポリシーの評価は成功となります。API 操作が複数のポリシーに一致すると、すべてのポリシーが成功と評価される必要があります。また、認可ルールは再帰的にもできます。あるルールにマッチした場合、これ以上展開できないルールに達するまで、そのルールは別のルールに展開されます。以下のルールが定義できます。

  • 役割に基づいたルール: リクエストを出したユーザーが指定された役割を持っていれば、成功と評価されます。たとえば、リクエストを出しているユーザーが管理者ならば、"role:admin" が成功します。

  • 項目に基づいたルール: 現在のリクエストに指定されたリソースの項目が指定された値と一致すれば、成功と評価されます。たとえば、ネットワークリソースの shared 属性が True に設定されている場合、"field:networks:shared=True"が成功します。

  • 一般的なルール: リソースの属性をユーザーのセキュリティクレデンシャルから抽出した属性と比較し、一致した場合に成功と評価されます。たとえば、リソースのテナント識別子がリクエストを出したユーザーのテナント識別子と一致すれば、"tenant_id:%(tenant_id)s" が成功します。

これは標準の nova policy.json ファイルの抜粋です。

{
	"context_is_admin":  [["role:admin"]],
	"admin_or_owner":  [["is_admin:True"], ["project_id:%(project_id)s"]], [1]
	"default": [["rule:admin_or_owner"]], [2]
	"compute:create": [ ],
	"compute:create:attach_network": [ ],
	"compute:create:attach_volume": [ ],
	"compute:get_all": [ ],
    "admin_api": [["is_admin:True"]],
	"compute_extension:accounts": [["rule:admin_api"]],
	"compute_extension:admin_actions": [["rule:admin_api"]],
	"compute_extension:admin_actions:pause": [["rule:admin_or_owner"]],
	"compute_extension:admin_actions:unpause": [["rule:admin_or_owner"]],
	...
	"compute_extension:admin_actions:migrate": [["rule:admin_api"]],
	"compute_extension:aggregates": [["rule:admin_api"]],
	"compute_extension:certificates": [ ],
	...
	"compute_extension:flavorextraspecs": [ ],
	"compute_extension:flavormanage": [["rule:admin_api"]],  [3]
	}
	

[1] 現在のユーザーが、管理者、またはリクエストで指定されたリソースの所有者 (テナント識別子が同じ) であれば、成功であると評価されるルールを表します。

[2] API 操作が policy.json のどのポリシーとも一致しなかった場合に、必ず評価される規定のポリシーを表します。

[3] フレーバーを操作する権限を、管理 API を使用する管理者だけに限定するポリシーを表します。

いくつかの場合では、いくつかの操作を管理者のみに制限すべきです。そこで、次の例では、ユーザーが自分のフレーバーを作成できるようにするシナリオの場合に、このサンプルのポリシーファイルをどのように変更すればよいかを示します。

"compute_extension:flavormanage": [ ],

 他のユーザーに悪影響を与えるユーザー

クラウドのユーザーは他のユーザーに悪影響を与える場合があります。意図的に悪意を持って行われる場合もあれば、偶然起こる場合もあります。状況を理解することで、このような混乱への対処方法について、よりよい判断ができるようになります。

例えば、あるユーザーのグループが、非常に計算負荷の高い作業用に大量のコンピュートリソースを使うインスタンスを持っているとします。これにより、コンピュートノードの負荷が高くなり、他のユーザーに影響が出ます。この状況では、ユーザーのユースケースを精査する必要があります。計算負荷が高いシナリオがよくあるケースだと判明し、ホスト集約やリージョンなど、クラウドを適切に分割することを計画すべき場合もあるでしょう。

別の例は、あるユーザーが非常に多くの帯域を消費する場合です。繰り返しですが、ユーザーが実行していることを理解することが重要です。多くの帯域を必ず使用する必要がある場合には、他のユーザーに影響を与えないように通信帯域を制限する、または、より多くの帯域を利用可能な別の場所に移動させる必要があるかもしれません。一方、ユーザーのインスタンスが侵入され、DDOS 攻撃を行っているボットネットの一部になっているかもしれません。この問題の解決法は、ネットワークにある他のサーバーが侵入された場合と同じです。ユーザーに連絡し、対応する時間を与えます。もし対応しなければ、そのインスタンスを停止します。

最後の例は、ユーザーがクラウドのリソースに繰り返し悪影響を与える場合です。ユーザーと連絡をとり、何をしようとしているのか理解します。ユーザー自身が実行しようとしていることを正しく理解していない可能性があります。または、アクセスしようとしているリソースに問題があり、リクエストがキューに入ったり遅れが発生している場合もあります。

システム管理の見過ごされがちな大事な要素の一つに、エンドユーザのためにシステム管理者が存在するという点があります。BOFH (Bastard Operator From Hell; 「地獄から来た最悪の管理者」) の道に入って、問題の原因となっているユーザーを全員停止させるようなことはしないでください。ユーザーがやりたいことを一緒になって理解し、どうするとあなたの環境がユーザーが目的を達成するのにもっと支援できるかを見つけてください。



loading table of contents...