(ヽ´ω`) < 助けてほしいマン

わからないことを助けてほしいマンが書くブログ

(ヽ'ω`) < Moinmoinのアクセス制限(ACL)設定

(ヽ'ω`) < 好き勝手やられるとこっちも困るんですよ

Moinmoinの設置がおわったのだが、デフォルト状態ではログインしようがしまいがなんでも出来てしまう。

というわけで、せっかく開設したWikiに秩序をもたらすために、アクセス制限・ACLの設定を行う。

内容については、公式Wikiの内容に沿って行くかたちで。

HelpOnAccessControlLists - MoinMoin

(ヽ´ω`) < 権限(Permission, right)の種類

ACLで設定可能な権限については、以下の5つがある。

  • read - ページの閲覧と、ページに添付されたファイルのダウンロード
  • write - ページの編集と、添付ファイルのアップロード
  • delete - ページの削除と、添付ファイルの削除
  • revert - ページを過去のバージョンに戻す作業
  • admin - ページのACL設定(#acl行の編集)、admin権限の付与

ページ名の変更については独立した権限は無く、read, write, deleteの権限を持つユーザが可能となる。

添付ファイルへのアクセスに関するACLは、添付元のページのACLに準ずる。

ページ毎に設定されたACLは、wikiconfig.py内のacl_rights_valid設定で上書きされる。これについては後述。

(ヽ´ω`) < 対象(Group)の種類

ACLを付与する対象としては以下の5つ。

  • User - 一般的なユーザ
  • SomeGroup - 一般的なグループ
  • Trusted - 認証・承認済みユーザ
  • Known - 認証済みユーザ
  • All - 全てのユーザ(Knownを含む)

TrustedKnownの違いと、AllKnownを含むというところが少しややこしい。

(ヽ´ω`) < ACLのフォーマット

ACLを設定する時は、以下のフォーマットで設定する

[+-]User[,SomeGroup,...]:[right[,right,...]] [[+-]OtherUser:...] [[+-]Trusted:...] [[+-]Known:...] [[+-]All:...] [Default]

これまたちょっとわかりづらいが、

対象:権限[,権限,...] [対象...]

の形式で権限の付与を記述していく。

公式ドキュメントでは以下の内容をsimple exampleとして紹介している。

#acl JohnDoe:read,write,delete,revert,admin EditorGroup:read,write,revert All:read

上記の例では、ユーザJohnDoeに全権限を付与、EditorGroupread, write, revert、その他の全ユーザにはreadのみの権限を付与している。

空白の扱いについて

複数の権限を定義するときには、半角空白が区切りになるので、権限と権限の間は,のみで前後に空白を挿入してはならない。

自分もついついやってしまうが、下記の記述は読みやすいかもしれないけどけどNG

#acl hoge:read, write, delete

+-について

ユーザ・グループ名の前に付与する+-については、+が権限があることを明示し、-は権限がないことを明示する。 これについては次の記述の順番についてとまとめて例を見るとわかりやすいかもしれない。

さらにACLの定義場所の説明が終わった後で、もう一度例を挙げて説明する。

記述の順番について

MoinmoinのACLではFirst Match Alogrithmに基づいて処理が行われる。つまり、最初に条件にマッチした時点で処理が中断され、アクセスの可否が決定される。

例えば

+All:read -SomeUser:admin SomeGroup:read,write,admin

とACLが設定されていた場合、

  • ページのread要求があった場合はユーザが誰であろうが許可
  • SomeUserからadmin要求があった場合は拒否
  • SomeGroupに所属しているユーザからread,write,adminの要求があった場合は許可

となる。

(ヽ´ω`) < ページ単位のACLとWiki単位のACL

Moinmoinでは2箇所について、ACLの設定を行う場所がある。

(ヽ´ω`) < ページ単位のACL

各ページの最上部に#aclで始まる行がある場合、その内容がページのACLとして処理される。

#acl All:read EditorGroup:read,write AdminGroup:read,write,delete,revert,admin

上記の例では、この記述があるページについては

  • 全てのユーザがread可能
  • 加えてEditorGroupが編集可能
  • 更に加えてAdminGroupがページの削除、履歴管理、ACL設定が可能

となる。

AdminGroupはこのページのACLを

#acl SomeGroup:read EditorGroup:read,write AdminGroup:read,write,delete,rever,admin All:

と変更することで、特定のグループ(SomeGroup)のみへの限定公開と変更することができる。

(ヽ´ω`) < Wiki単位のACL

もう一つのACLの設定場所は、wikiconfig.pyの中で下記の変数への代入を行うことで設定が可能となる。

変数名 説明
acl_rights_before ページのACLを探す前に処理されるACL
acl_rights_default ACLが設定されていなかった時のデフォルトACL値
acl_rights_after ACLを探したがどれにもマッチしなかった時に処理されるACL

acl_rights_before

acl_rights_beforeは全てのページに対してACLを優先的に割り当てる。例えば、

acl_rights_before = u'-All:read Known:read'

とあった場合は、全てのページがログインユーザ以外は閲覧不可能となる。

acl_rights_default

acl_rights_defaultacl_rights_beforeとページ内のACL設定、両方に引っかからなかった場合のデフォルトACL

acl_rights_default = u'All:read'

とあれば、acl_rights_beforeやページ内ACLで明示的に-で不許可とされているユーザ・グループやページ以外は、全てのページが閲覧可能となる。

acl_rights_after

acl_rights_afterは公式のドキュメントにも

after means not forgetting stuff accidentally (like maybe giving read rights to all)

とあるように、基本的にはacl_rights_defaultに書いておくべき内容かもしれないけど、それでも忘れないように明示的に指定すべきACLを記述する。例としてはAll:readのような内容が挙げられている)

(ヽ´ω) < ここでもう一度+-`について

さて、ここまでの知識を前提に以下のACLを考える。

acl_rights_before = u"Admin:read,write,delete,revert,admin EditorGroup:write"
acl_rights_default = u"Known:read All:"

上記ACLがwikiconfig.pyで定義されていて、ページACLが設定されていない場合

  1. 未ログインユーザは全ての操作が不可
  2. ログイン済みユーザは閲覧可能
  3. Adminはすべての操作が可能
  4. EditorGroupに所属しているユーザは編集可能

のつもりで設定をしている。

1, 2, 3については問題がない。

4についてだがEditorGroupに所属しているユーザは、実は何も出来ない。

何故かと言うと、EditorGroupwriteのみが設定されているため、EditorGroupに所属しているユーザが編集のページを開こうとしてもread権限が無いためページを開くことが出来ない。

EditorGroupに所属しているユーザはログインしていることが前提なので、Known:readに引っかかると思うかもしれないが、First Match Algorithmであるため先にEditorGroup:writeに引っかかってしまう。

解決方法としては、

acl_rights_before = u"Admin:read,write,delete,revert,admin EditorGroup:read,write"
acl_rights_default = u"Known:read All:"

とするのが素直な方法だが

ここで+の登場

acl_rights_before = u"Admin:read,write,delete,revert,admin +EditorGroup:write"
acl_rights_default = u"Known:read All:"

と設定する。+が指定されたグループは要求した権限が見つからない場合は、処理を中断せずに残りのACLを確認する。

少しわかりにくいが、+を付けることで特定の権限を明示的に付与することができると考えるとわかりやすいかもしれない。

(ヽ´ω`) < "-"はわかりやすいんだけどね…

(ヽ´ω`) < あのー、結構複雑なんですけど…

わかります。

設定をフレキシブルにできるようにということで、色々と機能が用意されているけど、逆によくわからなくなっているパターン。

ということで、公式ドキュメントにはこういうパターンが一般的だろうなーという、いくつかの例が掲載されているので、それを引用して簡単に解説。

一般的な開放されたWiki

よくあるタイプの書き込み権限が開放されたWiki。

acl_rights_before = u'WikiEditorName:read,write,admin,delete,revert +AdminGroup:admin BadGuy:'
acl_rights_default = u'Known:read,write,delete,revert All:read,write'
  1. 全てのユーザは閲覧と編集が可能
  2. ログイン済みユーザは、加えて削除、履歴の管理ができる
  3. AdminGroupは加えて、ACL設定権限を持つ
  4. WikiEditorNameはすべての権限を持つ
  5. BadGuyは何もできない(BANされている)

5のBadGuyユーザはすべての権限が無いように設定されているが、ログアウトするとAllに含まれるため読み込みと編集が可能になってしまう。

簡単なCMS

管理者だけが編集可能な、簡易なCMS。

acl_rights_default = u'All:read'
acl_rights_before  = u'WebMaster,OtherWebMaster:read,write,admin,delete,revert'
  1. 全てのユーザは閲覧が可能
  2. WebMasterOtherWebMasterはすべての操作が可能

非常に単純でわかりやすいACL。

もしも編集途中のページが有るなら、ページ最上部にページACLを以下のように設定する。

#acl All:

これで、その編集途中のページは完成まで見えなくなる。ページが完成したら、このACL行を除去してやれば、公開状態とすることができる。

また、基本的には閲覧のみだがコメントを書き込むためのページを用意したいなら、

#acl All:read,write

上記ACLを記述したページを、コメント用ページとして作成すればOK。

他にも

公式ドキュメントのページでは上記2例の他にも"Wiki on Intranet"と"Wiki as a public company page"と2パターンのACLについても記載してある。興味があればチェックしてみるといいかも。

HelpOnAccessControlLists - MoinMoin

(ヽ´ω`) < 懺悔

(ヽ´ω`) < 書いてみたけどやっぱり複雑なんですよね…間違いがあるかも

(ヽ´ω`) < ちょっとまて

この記事で普通にユーザグループの話をしてたけど、そもそもグループってどうやって作るのよ?

(ヽ´ω`) < それは次の記事で