(ヽ'ω`) < 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を含む)
Trusted
とKnown
の違いと、All
にKnown
を含むというところが少しややこしい。
(ヽ´ω`) < 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
に全権限を付与、EditorGroup
にread, 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_default
はacl_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が設定されていない場合
- 未ログインユーザは全ての操作が不可
- ログイン済みユーザは閲覧可能
Admin
はすべての操作が可能EditorGroup
に所属しているユーザは編集可能
のつもりで設定をしている。
1, 2, 3については問題がない。
4についてだがEditorGroup
に所属しているユーザは、実は何も出来ない。
何故かと言うと、EditorGroup
がwrite
のみが設定されているため、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'
- 全てのユーザは閲覧と編集が可能
- ログイン済みユーザは、加えて削除、履歴の管理ができる
AdminGroup
は加えて、ACL設定権限を持つWikiEditorName
はすべての権限を持つBadGuy
は何もできない(BANされている)
5のBadGuy
ユーザはすべての権限が無いように設定されているが、ログアウトするとAll
に含まれるため読み込みと編集が可能になってしまう。
簡単なCMS
管理者だけが編集可能な、簡易なCMS。
acl_rights_default = u'All:read' acl_rights_before = u'WebMaster,OtherWebMaster:read,write,admin,delete,revert'
- 全てのユーザは閲覧が可能
WebMaster
とOtherWebMaster
はすべての操作が可能
非常に単純でわかりやすい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
(ヽ´ω`) < 懺悔
(ヽ´ω`) < 書いてみたけどやっぱり複雑なんですよね…間違いがあるかも
(ヽ´ω`) < ちょっとまて
この記事で普通にユーザグループの話をしてたけど、そもそもグループってどうやって作るのよ?
(ヽ´ω`) < それは次の記事で