■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

Admin領域へのIPアドレスによるアクセス制限

 

 1  |  2   | 次のページ>

cruel > Admin領域へのIPアドレスによるアクセス制限 @ 2011/2/27 0:06
はじめまして。
投稿する場所に迷ったのですが、簡単なハック(とも言えない内容
ですが……) を行いましたので、こちらに書き込みいたします。

クライアントより、Admin領域には特定のIPアドレスからのみアク
セス許可したいとの依頼があり、.htaccess 等では解決しません
でしたので、本体に手を入れさせていただきました。

・BaserCMS/baser/controllers/users_controller.php

var $components = array('ReplacePrefix', 'Auth','Cookie','AuthConfigure', 'EmailEx');

行を

var $components = array('ReplacePrefix', 'Auth','Cookie','AuthConfigure', 'EmailEx','RequestHandler');

とし、認証部分を以下のようにしました。

function beforeFilter() {

	// IPアドレスによるアクセス制限
	$ip = $this->RequestHandler->getClientIP();
	$allowip = 'XXX.XXX.XXX.XXX';
	if ($ip == $allowip) {

		/* 認証設定 */
		// beforeFilterの前に記述する必要あり
		$this->Auth->allow('mypage_login', 'admin_login', 'admin_logout','admin_login_exec', 'admin_reset_password');
		if(isset($this->params['prefix'])) {
			$this->Auth->allow($this->params['prefix'].'_login', $this->params['prefix'].'_logout', $this->params['prefix'].'_reset_password');
			$this->set('usePermission',$this->UserGroup->checkOtherAdmins());
		}

		parent::beforeFilter();

		$this->ReplacePrefix->allow('login', 'logout', 'reset_password', 'auth_prefix_error');

	}
}


上記書き換えで問題なく制限ができているようです。

こちらに書き込みいたしましたのは、もし同様の課題をお持ちの方が
おられたら、という参考のためと、バージョンアップの度に毎回書き
換えるのも書き換え忘れなどが発生する可能性もございますので、標
準の機能やセキュリティ強化プラグインとして、実装していただけれ
ばありがたいなあという、ご要望も兼ねてのものとなります。

自分で勉強するべきなのですが、なかなかゼロからプラグイン開発が
できるスキルもなく、虫のいい話で申し訳ないのですが、ご検討いた
だけるとありがたく存じます。
yosyos > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/2/27 9:38
cruel さん

はじめまして。

私が管理画面にIP制限やBasic認証を置きたい場合、htaccessに記述しているので
ご参考までに。
(あくまでディレクトリ構成をbasercmsの基本構成に習っている場合の対処法ですが)

/app/webroot/以下にadminディレクトリを作ります。
↓こうなります
/app/webroot/admin/

adminディレクトリの中に.htaccessを置きます。

.htaccessには以下のように書きます。

#Basic認証を使う場合 ******は.htpasswdのフルパス
AuthUserFile ******
AuthGroupFile /dev/null
AuthName "Input ID and Password."
AuthType Basic
require valid-user

#以下IP制限 xxx.xxx.xxx.xxxは任意の許可IP
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/$ ../index.php?url=admin/index [QSA,L]
    RewriteRule ^(.*)$ ../index.php?url=admin/$1 [QSA,L]
</IfModule>


私の場合はこれでうまくいっているので、よろしければお試しください。
(Basic認証やhtaccessの記述方法は、ここではご説明できないので検索してください。)

BaserCMSのバージョン:1.6.9.1
レンタルサーバー名:独自 さくら(専用SV) ロリポップ heteml 等
スマートURLの利用:ON
設置フォルダ:ドキュメントルート(vhost含)
利用しているデータベース:MySQL
OSの種類:割愛
PHPのバージョン:割愛
データベース種類・バージョン:割愛
cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/2/27 23:03
yosyos さま

早速のアドバイス、誠にありがとうございます。

スマートURLがオンの環境ですと、.htaccessで制限が可能なのですね。
CakePHPのMVCモデル等の動きがよく分かっておりませんでしたので、大変
勉強になりました。

ただ、残念なことに今回利用するクライアントのサーバーは mod_rewrite
に対応しておらず、スマートURLが利用できない環境でして、検証してみた
ところ、お教えいただいた対策では制限できないようでした。私のサーバー
環境の説明が不足しており、申し訳ございませんでした。

現在のサーバー環境等は、以下の通りです。

BaserCMSのバージョン : 1.6.9.1
サーバー名 : クライアントのサーバー(apache2.0.x)
スマートURLの利用 : オフ(mod_rewrite 利用不可)
設置フォルダ : サブフォルダ
データベース : SQLite3
OSの種類 : Linux Kernel 2.6x
PHPのバージョン : 5.2.6


mod_rewrite が利用不可能な環境では、現状コードに手を入れる方法
しかないのでしょうか・・・。
yosyos > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/2/28 22:04
cruel さん

スマートURLが使えない環境で運用したことがなかったので
お門違いな回答をしてしまったようで申し訳ないです。

私ならどうやってしのぐかを少し考えてみました。
模範解答には程遠いと思いますが・・・

1.baser/controllers/users_controller.php を app/controllers/users_controller.phpにコピーしてcruelさんの処置を施す。

baserをバージョンUPすることを考えて、baser/以下のソースに手を加えないことを考えます。
そのために、app/に移動してコントローラーをオーバーライドするようにします。
但し、バージョンUPをするとコピーしたソースを更新(マージ)しなくてはならないので、結果的には同じことかなと・・・

2.app/config/bootstrap.phpに処置を加える。

本来ならばapp/controllers/app_controller.phpにフックを仕込みたいところですが
baser/controllers/app_controller.phpがあるので、できませんでした。
なので、baser/controllers/app_controller.php実行以前に仕込める場所はと考えると
app/config/以下の何かか。

cakePHP 及び baserCMS の規範に沿っていないのですが
bootstrap.php仕込みの方法で考えました。

例えば以下のような感じで
$hosts = array('192.168.0.1','192.168.1.1','localhost','127.0.0.1');
if(preg_match("/^\/admin.*/i",$_SERVER['PATH_INFO'])){//adminが含まれていたら
        if(!in_array($_SERVER['REMOTE_ADDR'],$hosts)){//$hosts以外のIPはルートにリダイレクトする
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: http://$_SERVER[HTTP_HOST]/");
                exit();
        }
}


どちらもスマートじゃないのですが、やむを得ずの場合、私ならこうやっちゃうだろうな・・・
という回答でしかないのですがいかがでしょうか?

※この記事をご覧の方で同様の事案に対応されている人がいましたら、私も教えて頂きたいです。
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/1 0:48
こんばんは。

BaserCMSのアップデートに耐えうるようにカスタマイズするというのが結構悩みどころなのですが、
今回の要件であれば、BaserCMS のプラグインフックという仕組みを使えば
コアには何も手を加えずに beforeFilter をフックできます。
http://basercms.net/manuals/programmers/5.html

プラグインといっても1ファイルで簡単に実装できます。
次のような構成にし、クラスを一個作ります。
(プラグイン名は適当にadmin_permissionとしました)

■ フォルダ構成
app
 |- plugins
    |- admin_permission
      |- controllers
        |-components
          |- admin_permission_hook.php


■ admin_permission_hook.php
class AdminPermissionHookComponent extends Object {
	
	var $registerHooks = array('initialize','beforeRender');
	var $allowClients = array('192.168.0.1','192.168.1.1','localhost','127.0.0.1');
	function initialize(&$controller){
		if(!empty($controller->params['admin'])){
			$controller->components += array('RequestHandler');
		}
	}
	function beforeRender(&$controller){
		if(!empty($controller->params['admin']) && $controller->name != 'CakeError'){
			if(!in_array($controller->RequestHandler->getClientIP(),$this->allowClients)){
				$controller->notFound();
			}
		}
	}
	
}


とりあえず、プラグインフックの仕組みだけお伝えしたかったので、許可するIPはクラスにハードコーディングしちゃってます。
許可しないIPからのアクセスの場合、NOT FOUNDとするようにしているのですが、その際に、$controller->params['admin'] が有効のまま呼び出されてしまうので、コントローラーがCakeErrorの場合にはチェックしないようにしてます。

利用するには、管理画面のプラグイン一覧で有効にする必要がありますのでご注意ください。
あと、これをプラグインとして配布するには、許可IPを管理画面で登録できるようにしたりする必要がありますね。

みんなでBaserCMSのプラグイン開発で盛り上がっていければ嬉しいですね〜

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 4:18
ご返信が遅くなりまして申し訳ございません。本日動作の検証を行いましたので、
ご報告させていただきます。


yosyos さま

とんでもございません。.htaccess での制限が可能ということが分かっただけ
でも大変な収穫でした。スマートURLが有効な環境でしたら、webroot内にフォル
ダを作れば .htaccess が有効になるという考えがございませんでしたので、
大変勉強になりました。

また、フックする部分に関しましてもご考察いただき、ありがとうございました。
bootstrap.php の 配置パターン コメントの直下に追加することで、動作確認
できました。私のものよりこちらの方が、ページトップに遷移するため遙かに
スマートでいいですね。(クライアントへのデモページは、こちらのパターンにて
開示させていただきます(^^;)


ryuring さま

プラグインの作成方法の御指南、誠にありがとうございます。1ファイルにて
プラグインとして動作するのですね。たくさんのファイルを用意しないといけ
ないものと考えておりましたため、目から鱗でした。

ただ、お教えいただいたプラグインでは、IPアドレスでの制限がうまくかから
ないようでした。ご掲示いただいた通りのフォルダ構成でファイルを作成し、
プラグインとしては登録でき、動作しているようなのですが、許可したIPアド
レス以外からも管理者エリアに入れるようです。

私のミスの可能性が大かと存じますが、ご確認いただければ幸いです。私の
テスト環境は以下の通りです。


BaserCMSのバージョン : 1.6.9.1(既存の全パッチ済)
サーバー名 : apache2.2x
スマートURLの利用 : オフ
設置フォルダ : サブフォルダ
データベース : CSV
OSの種類 : CentOS 5.5
PHPのバージョン : 5.3.5


よろしくお願い申し上げます。
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 5:13
ごめんなさい、本体に影響を与えないプラグインでの簡単な実装例をヒントとしてお伝えしたかっただけなので動作検証は全く行ってませんでした。
フック処理の中身は色々書き方があると思いますので色々試して頂ければとおもいます。

どなたかプラグインとして作ってくれたら嬉しいなあ

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 5:38
ryuring さま

サンプルコードだった旨、承りました。私の方でもこのコードを参考に、動作
するプラグイン的な物が作れないかどうか、テストしてみます。この度は誠に
ありがとうございました。

# ただ、そのクライアントにBaserCMSを導入するという話自体が宙に浮きかけて
# おりまして、作っても徒労となる可能性も出てきているのが憂鬱ではありますが
# ・・・orz
yosyos > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 23:47
cruel さん

動作されたようで何よりです。
クライアントのお話、上手くランディングされることを祈るばかりです。

ryuring さん

BaserCMSのプラグインフックは盲点でした。。。
ご指南ありがとうございました。
IPブロック・Basic認証・Digest認証を絡めた形でプラグインを妄想してみたのですが
現状手が回らず、すぐに着手はできなそうです。
CakePHP Securityコンポーネントを使った方向で考えてはいますが...

嬉しいことか悲しいことかこんな時に限って忙しくなってます…
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/4 0:30
> cruel さん

先日書いたプラグインを実際に試したのですが、こちらの環境では正常動作しました。
下記のコードで実際のIPの値を確認してみてください。in_arrayでチェックをかけているだけなのでデバッグは簡単だと思います。

var_dump($controller->RequestHandler->getClientIP());


> yosyos さん

忙しい事は何よりです!是非本業を頑張ってください!

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

 

 1  |  2   | 次のページ>

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
41 人のユーザが現在オンラインです。 (39 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 41