サイトマップ

DokuWikiのIPアドレス制限

action単位で特定のIPアドレスからのみに制限できるようにする。

目的

セキュリティの強化のため、特定のIPアドレスのみからログインできないようにしたいという思いが発端。ログインを制御することを調べるうち、アクション単位で制御できればより汎用性がありそうだと思った。

実装方法

actionの実行以前に判断をしなければならない。actionの実行はinc/actions.phpの以下のところで行われる。

function act_dispatch(){
  :
  // give plugins an opportunity to process the action
  $evt = new Doku_Event('ACTION_ACT_PREPROCESS',$ACT);
  if ($evt->advise_before()) {
    : //←ここ
  }  // end event ACTION_ACT_PREPROCESS default action
  $evt->advise_after();
}

従って、利用可能なイベントは

  • DOKUWIKI_STARTED
  • ACTION_ACT_PREPROCESS

のいずれかということになる。actionの実行そのものを制御するためには、ACTION_ACT_PREPROCESSを使えばよい。

ボタンの表示について

実行できないアクションのボタンが表示されるのは望ましくない。ボタンの表示・非表示はinc/confutils.phpのactionOK($action)の戻り値で制御される。この判定はグローバル変数$conf['disableactions']にコンマ区切りのリストとして記述されているものとなるので、アクセス制限かけたいものをこれに追加すればよい。

認証チェックについて

ログインできないアドレスからは当然認証も不可能となっているべき。これは、万が一にも認証cookieが漏れてなりすましされることを防ぐ効果がある。これは、少々乱暴だが、loginアクションが制御対象の場合はセッションを破棄してしまうことで、auth_validateToken()のチェックが通らなくなることが利用できるかも。

実験

  1. ipblockプラグインをactionプラグインとして作成する。
  2. ipblock/action.phpでACTION_ACT_PREPROCESSをフックし、アクセス判定関数を呼び出す。
  3. アクセス判定関数では、設定のIPアドレス制御リストを読み込み、リモートアドレスがそれに一致するIPアドレスでなければ、$conf['disableactions']にアクション制御リストを追加する。
  4. 動作確認のため、通常の設定のアクション制御はすべてチェックをはずし、何でもできるようにしておく。
  5. テスト用のクライアントマシンAのIPアドレスのみをセットし、IPアドレスによるアクション制御を順次チェックを追加し、それぞれが変わらず機能すること、指定していないクライアントマシンBから同様にアクセスし、指定したアクションが機能していないことを確認する。
  6. サイト設定で既に無効となっているアクションはそのままにする。

実験結果

  1. イベントの伝播をいじる必要はなくて、$conf['disableactions']の値を直すだけでボタンの表示とコマンド実行制御ができるようである。

備考

  • 調査対象バージョン:2010-11-07 “Anteater”, 2011-05-25 “Rincewind”
  • IPアドレスの取得には、inc/common.php:clientIP($single)が使用できる。

成果

 
research/1306920425.txt · 最終更新: 2011/06/10 13:17 by Kazuyuki Matsuda
特に明示されていない限り、本サイトの内容は次のライセンスに従います:Copyright(C) 2011 Shorindo, Inc. All Rights Reserved
Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki