「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

- 中川 嘉宏 の投稿
返信数: 7
このフォーラムで色々勉強しているものです。
現在、moodle1.8をグローバルアドレスで運営しています。
お尋ねしたいのは、「アカウント作成済みのユーザは、学内外からloginできるが、新規アカウント作成 (signup) は学内のプライベートアドレスのクライアントのみとする」、という設定は可能でしょうか。
以上、よろしくお願いします。

中川 嘉宏 への返信

Re: 「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> お尋ねしたいのは、「アカウント作成済みのユーザは、学内外からloginできるが、新規アカウント作成 (signup) は学内のプライベートアドレスのクライアントのみとする」、という設定は可能でしょうか。

残念ですが、「新規アカウント作成を学内のプライベートアドレスのクライアントのみとする」設定はできないようです。

新規アカウント作成用のプログラム (login/signup.php) を修正することで、ご希望の動作を実現することができます。具体的には、下記のような修正により、Moodleのバージョンアップに対しても影響が少ないと思います。

ご参考までに。

1. Moodleの設定ファイルconfig.phpにサブネットとIPアドレスを記述する。
例)
$CFG->subnet = '192.168.0.1/30, xxx.xxx.xxx.xxx';

2. 登録者のIPアドレスによりユーザ登録可否を判断する。
1.で設定した「$CFG->subnet」を使って、lib/moodlelib.phpの関数address_in_subnet()でユーザの登録可否を判断します。

Mitsuhiro Yoshida への返信

Re: 「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

- Tatsuya Shirai の投稿

 なるほど!これは考えもしなかったことですが,セキュリティポリシー上は非常に重要な話ですね.

 2に関して(login/signup.phpの冒頭)ですが,例えば以下のような感じで良いですよね.

    require_once('signup_form.php');

    if (empty($CFG->registerauth)) {
        error("Sorry, you may not use this page.");
    }
// ここから追加
    if (isset($CFG->subnet)) {
        if (!address_in_subnet(getremoteaddr(), $CFG->subnet)) {
            error("Sorry, you may not use this page.");
        }
    }
// ここまで追加
    $authplugin = get_auth_plugin($CFG->registerauth);

    if (!$authplugin->can_signup()) {
        error("Sorry, you may not use this page.");
    }

 $CFG->subnetというのはMoodle中では使用されていない新規の変数ですね.
 ちょっと実験してみた感じではOKそうです.

 実は当初,クライアントPCのIPアドレスを取得するのに,$_SERVER['REMOTE_ADDR']を試みたのですが,NGでした.多くの場合はOKなのかも知れませんが,本校の場合はProxyサーバを介してWebページが公開され,外部からアクセスする場合もこのサーバ(と別のサーバ)を介してアクセスします.つまり学外からも学内からも,Moodleのサイトから見ると区別がつかない.getremoteaddr()関数を使うことで,学外と学内の区別がつくようになりました.
 getremoteaddr()関数はlib/moodlelib.phpの中で宣言されていますが,他の2つのサーバ変数をチェックすることで,なるべくオリジナルに近いIPアドレスを返すようになっていました.ログに記録を残すadd_to_log()関数でも使われています.


なお,あまりサブネットアドレスの設定をよく理解できていないのですが,
function address_in_subnet()のコメントを見ると,
 * The parameter is a comma separated string of subnet definitions.
 * Subnet strings can be in one of three formats:
 *   1: xxx.xxx.xxx.xxx/xx
 *   2: xxx.xxx
 *   3: xxx.xxx.xxx.xxx-xxx   //a range of IP addresses in the last group.
このようになっています.

 本校のIPアドレスは172.16.*.*です.タイプ1の形式で,

$CFG->subnet = '172.16.x.y/16';

としました.x, yは実際にはMoodleサイトのIPアドレスです.同じ学内からProxyを介して学内のMoodleサイトにアクセスした場合は,172.16.a.bのようなProxyサーバのアドレスでアクセスしたことになります.学内のどのPCからアクセスしても,aとbの値は同じ値です.つまり下16bitは仲間だぞ,そういう意味の設定であると考えて良いのですよね?

Tatsuya Shirai への返信

Re: 「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> 2に関して(login/signup.phpの冒頭)ですが,例えば以下のような感じで良いですよね.

はい、素晴らしいです。笑顔
エラーメッセージの部分は、下記のようにja_utf8/error.phpの「 $string['cannotusepage2'] = '申し訳ございません、あなたはこのページを使用できません。'; 」を使っても良いですね。

// ここから追加
if (isset($CFG->subnet)) {
if (!address_in_subnet(getremoteaddr(), $CFG->subnet)) {
print_error('cannotusepage2');
}
}
// ここまで追加

Mitsuhiro Yoshida への返信

function print_error()

- Tatsuya Shirai の投稿

lib/weblib.php

Print an error page displaying an error message.  New method - use this for new code.

 error()よりもprint_error()の方がエラーページを発生させる関数としては新しいスタイルなのですね.print_error()を使えば,error(get_string())と入れ子にする必要が無い,というか,強制的に言語パックの文章を使うようになる,という意味でも新しいスタイルなのですね.なるほど,勉強になりました.

Tatsuya Shirai への返信

Re: function print_error()

- Tatsuya Shirai の投稿

 こちらも本日のバージョンのMoodle1.9.2+では変更が入っています.デフォルトの言語パックのモジュール名($module)がnulから'error'に変わっています.

 あれ,でも,元々も関数宣言のところでは省略時にnulになっていましたが,どのみち,if (empty($module)||...) でチェックして,nulならば'error'にするようにコードが書かれていましたのであまり変わりなし? $modulelinkに影響があるのか,ともかく少しだけ変わっています.独自のエラー処理を追加した方はチェックした方が良いかも知れませんね.

Tatsuya Shirai への返信

Re: 「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

- 中川 嘉宏 の投稿
教えていただいたコード追加を行い、subnetを
$CFG->subnet = '192.168.0.1/16, xxx.xxx.xxx.1/24';
と設定し、許されたアドレス範囲のみ「新しいアカウントを作成する」がアクセス可能かを調べました。

結果は、学内で使用されているIPアドレス(プライベート|グローバル)のみ「新しいアカウントを作成する」ページがアクセスでき、期待する動作が確認されました。

具体的なコードを示していただき、助かりました。
本当にありがとうございました。

中川 嘉宏 への返信

Re: 「新しいアカウントを作成する」のページアクセスを学内からのみにする方法は?

- Tatsuya Shirai の投稿
 本日公開されたMoodleでは,タイムリーなことに,function address_in_subnet()に修正が加わっています.$CFG->subnetを設定してもうまく機能しない方は,試しにMoodleをアップデートしてみると正常に機能するようになるかも知れません.
(いままで正常に動いていたのがダメになる可能性もゼロではありませんがウインク