すべてのウェブアプリケーションソフトウェアは、非常に複雑で、どのアップリケーションにも時々発見されるセキュリティの問題があります。通常、これらの問題は、プログラマが予期することのできない入力の組み合わせに関係しています。Moodleプロジェクトでは、セキュリティを重要な部分であると認識し、随時セキュリティホールに対応する等、継続した改善作業を行っています。

すべての前に

  • この記事には、あなたのインストール済みMoodleに関する重要なセキュリティ対策が記載されています。
  • セキュリティ問題は、直接 http://security.moodle.org に投稿してください - 他の場所でしたら開発者が見落とす可能性がありますし、( アタックを避けるため ) 問題が解決されるまで一般公衆にリリースされないからです。
  • 同じ理由で、セキュリティ上の弱点 ( exploits ) をbugtrackerやフォーラムに投稿しないでください。

シンプルなセキュリティ対策

  • 最良のセキュリティ対策は、データのバックアップを適切に取ることです! しかし、バックアップデータをリストアできないようでしたら、適切なバックアップと呼ぶことができません。リストア処理をテストしてください!
  • あなたが使用するソフトウェアまたはサービスのみをロードするようにしてください。
  • 定期的にMoodleのアップデートを行ってください。
  • あなたが寒い冬の日に着る服の層にならって、セキュリティ対策を行ってください。

基本的な推奨

  • それぞれのリリースでMoodleを定期的にアップデートしてください。
リリース後、公開されるセキュリティホール情報は、クラッカーの注意を引きます。古いバージョンほど、より脆弱性を含む場合があります。
  • PHPのregister globals ( register_globals ) を無効にしてください。
サードバーティ開発によるMoodle用スクリプトのXSS問題を防ぐ助けになります。
  • 管理者および教師には強力なパスワードを使用してください。
「推測が難しい」パスワードの使用は、アカウントの「brute force」クラッキングを防ぐ、基本的なセキュリティ対策です。
  • 信頼できるユーザにのみ教師アカウントを与えてください。プロダクションサーバ ( 実際に運用するサーバ ) で、公開したサンドボックスにフリーの教師アカウントを作成しないでください。
教師アカウントは、非常に自由な権限があり、データを悪用したり盗むことが簡単にできてしまいます。
  • あなたのシステムを可能な限り分離してください。
もう1つの基本的なセキュリティテクニックは、異なるシステムで異なるパスワードを使用し、異なるサービスには異なるマシンを使用すること等です。このことは、1つのアカウントまたは1つのサーバが奪取されても、被害が広範囲に及ぶことを防ぎます。

定期的にアップデートを実行する

  • システムを定期的にアップデートしてください。
  • Windows Update ( Microsoft Update )
  • Linux: up2date、yum、apt-get
cronを使用してスクリプトによる自動アップデートをお考えください。
  • Mac OSXシステムアップデート
  • php、apache、Moodleは、可能な限り常に最新のバージョンを使用してください。

最新情報を取得するため、メーリングリストを使用する

ファイアウォール

  • セキュリティ専門家は、デュアルファイアーウォールを推奨しています。
ハードウェア/ソフトウェアのコンビネーション
  • 利用しないサービスを無効にすることは、ファイアーウォールと同じく効果的です。
netstat -a コマンドを使用して、開いているネットワークポートを調査してください。
  • ファイアウォールは、防御を保障するものではありません。
  • 許可されたポート
80、443 ( ssl )、9111 ( chat用 )
Remote admin: ssh 22 または RDP ( Remote Desktop Protocol ) 3389

最悪の事態に備える

Moodleセキュリティアラート ( 警報 )

  • あなたのサイトをMoodle.orgに登録してください。
登録したユーザにはメールアラート ( 警報 ) が送信されます。

そのほかの考慮すべき事項

下記のすべては、あなたが考慮しても良い、セキュリティ全般に対して影響を与える事項です:

  • opentogoogleを無効にする、特にK12サイト。
  • SSLを使用する、httpslogins=yes。
  • ゲストアクセスを無効にする。
  • すべてのコースに登録キーを設定する。
  • 強固なパスワードを使用する。
  • セキュアフォーム設定を使用する。
  • MySQLのrootユーザにパスワードを設定する。
  • MySQLのネットワークアクセスを無効にする。

もっとも安全な/こだわり過ぎのファイルパーミッション

あなたがMoodleをシールドサーバで稼動させて ( 例 マシンにユーザログインを許可しない )、rootがMoodleコードおよびMoodleの設定 ( config.php ) を管理していると仮定すれば、これはもっとも厳重なパーミッションだと考えられます:

1. moodledataディレクトリおよびディレクトリ内のすべてのコンテンツ ( およびサブディレクトリ、セッションを含む ):

オーナー: apache user ( apache、httpd、www-data、その他なんでも )
グループ: apache group ( apache、httpd、www-data、その他なんでも )
パーミッション: ディレクトリに700、ファイルに600

2. moodleディレクトリ、ディレクトリ内の全てのコンテンツおよびサブディレクトリ ( config.phpを含む ):

オーナー: root
グループ: root
パーミッション: ディレクトリに755ファイルに644

あなたがローカルログインを許可している場合、2.は次のようにしてください:

オーナー: root
グループ: apache group
パーミッション: ディレクトリに750ファイルに640

これらのパーミッションは、こだわり過ぎのファイルパーミッションであると思ってください。より少ない厳密なパーミッションでmoodledataおよびmoodelディレクトリ ( およびサブディレクトリ ) を十分に安全にすることができます。

ログインしないとユーザプロフィールの写真が表示されないようにするには

現状では、ユーザプロフィールにアップロードした写真へは、ログインせずにアクセスすることが可能です。

  • Moodleを改造しない場合
  1. 自分の写真を公開されたくない場合、個人的な写真をアップロードしないように使用許諾等に記載する。
  2. config.phpに $CFG->disableuserimages = true; を追加して、ユーザが個人的な写真をアップロードできないようにする。
  • Moodleを改造する場合
  • /users/pix.phpを下記のように改造することで、ログインなしのユーザ写真アクセスを禁止する。

<?PHP // $Id: pix.php,v 1.15 2006/09/23 09:38:39 skodak Exp $

     // This function fetches user pictures from the data directory
     // Syntax:   pix.php/userid/f1.jpg or pix.php/userid/f2.jpg
     //     OR:   ?file=userid/f1.jpg or ?file=userid/f2.jpg


// $nomoodlecookie = true; // Because it interferes with caching

   require_once('../config.php');
   require_once($CFG->libdir.'/filelib.php');


   // disable moodle specific debug messages
   disable_debugging();


   $relativepath = get_file_argument('pix.php');


   $args = explode('/', trim($relativepath, '/'));


   if (count($args) == 2) {
       $userid   = (integer)$args[0];
       $image    = $args[1];
       $pathname = $CFG->dataroot.'/users/'.$userid.'/'.$image;
   } else {
       $image    = 'f1.png';
       $pathname = $CFG->dirroot.'/pix/u/f1.png';
   }


   if (file_exists($pathname) and !is_dir($pathname)) {
       send_file($pathname, $image);
   } else {
       header('HTTP/1.0 404 not found');
       error(get_string('filenotfound', 'error')); //this is not displayed on IIS??
   }

?>

関連情報