openstack の policy.json を学ぶ #opcel3

policy.json とは

各 OpenStack コンポーネントにて、各種操作に必要な権限等を指定するファイル。

例えば、

  • インスタンスの立ち上げは "member" ロールを持っていれば行える
  • プロジェクト(テナント) の作成には "admin" ロールが必要

など、操作とそれに必要なロールを対応付けます。

以下は nova の policy.json

{
    "context_is_admin":  "role:admin",
    "admin_or_owner":  "is_admin:True or project_id:%(project_id)s",
    "default": "rule:admin_or_owner",

    "cells_scheduler_filter:TargetCellFilter": "is_admin:True",

    "compute:create": "",
    "compute:create:attach_network": "",
    "compute:create:attach_volume": "",
    "compute:create:forced_host": "is_admin:True",
    "compute:get_all": "",
    "compute:get_all_tenants": "",
    "compute:start": "rule:admin_or_owner",
    "compute:stop": "rule:admin_or_owner",
    "compute:unlock_override": "rule:admin_api",

    "compute:shelve": "",
    "compute:shelve_offload": "",
    "compute:unshelve": "",
    "compute:resize": "",
    "compute:confirm_resize": "",
    "compute:revert_resize": "",
    "compute:rebuild": "",
    ...略...

大体の場合、"/etc/<コンポーネント>/policy.json" においてあります。

oslo.policy が policy.json を処理します。

書式

ポリシーは一行ずつ <ターゲット>:<ルール>という形で記述されます。

# nova list コマンドで行う、インスタンスの一覧の取得は誰でも行える
"compute:get_all":""

target

上の例で言うところの、"compute:get_all" の部分です。

"compute:create" のように "service:API" の場合もあれば、"add_image" のように "API" のみの場合もあります。

rule

"target" の操作を許可するか、禁止するかどうかなどを記述します。

rule には下記のようなものが入ります。

  • "", [], "@"
    • "target"の操作は常に許可されます
  • "!"
    • "target"の操作は常に禁止されます
  • "role:<ロール名>"
    • 指定されたロールを持つユーザーのみ "target" の操作が許可されます
  • "rule:<ルール名>"
    • ルールの alias を指定する
  • "http:"
    • 判断をリモートサーバーに委譲する.Trueが返ってきた場合に許可されます。
  • "value1 : value2"
  • and, or , not による複数条件の指定

alias

複雑なルール、よく使用するルールなどは alias を設定できる。

# ロールが admin または is_admin フラグが立っている
"admin_required": "role:admin or is_admin:1",

alias のネストも可能。

default

rule に "" を指定した際には、"target" の操作は常に許可される、と上に書きましたが、"default" という alias を記述しておくことで、""を指定した際に "default" alias が適用されるようになります。

"default": "rule:admin_or_owner"

参考にしたページ