手順で指示されているセキュリティ設定をまとめて、対応した内容になっています。一部は後回し/非対応にしました。
【1】簡易セキュリティ対策
【2】基本推奨
【3】通常更新の有効化
【4】メーリングリスト使用
【5】ファイアウォール
【6】パスワードポリシー
【7】最悪の事態に備える
【8】Moodleセキュリティ警告
【9】様々な検討事項
【10】安全なファイルパーミッション
【11】専用サーバーでMoodleを運用
【12】共有ホスティング環境でMoodleを運用
【1】簡易セキュリティ対策
(1-1)バックアップを取り、リストア手順を正確にしましょう
→後でバックアップおよびリストア手順に対応し、ページを作成予定
(1-2)必要ないソフトウェアやサービスは使わない
→今回はMoodle専用サーバーだから問題なし
(1-3)定期的に更新
→とりあえずyum updateで対応、cronで定期実行
スクリプトを書くほどではないのでcrontabで設定します。
/usr/bin/crontab -e
以下を記述して保存する。(毎週月曜深夜3時に実行)
00 03 * * 1 /usr/bin/yum -y update
【2】基本推奨
(2-1)Moodleのアップデート(セキュリティホール対応)
→保留、後でMoodleアップデートのページを作成予定
(2-2)register_globalsを無効化(XSS防止)
→調べた結果、PHP5.4.0で削除されたようです
上記より古いバージョンのPHPを使用している場合、以下2つのどちらかで対応します。
(私の環境はPHP5.4.16のため対応しませんでした
(2-2-1)php.iniに記述
→/etc/php.ini内に「register_globals=off」と追記
(2-2-2).htaccessに記述
→/var/www/html/moodle/.htaccessに「php_flag register_globals off」と記述
※/etc/httpd/conf/httpd.confにも以下記述を行い、apache再起動も行う必要があります
<Directory "/var/www/html/moodle"> AllowOverride All </Directory>
Apache再起動
sudo systemctl restart httpd.service
(2-3)管理者/教師のパスワードを強固なものにする
→大文字小文字数字混じりの長めのパスワードが良いと思います
(2-4)信頼できるユーザにのみ教師アカウントを与える
→とりあえず現在は私だけで運用
・システムごとにパスワードを変える
→他のサービス等で同じパスワードは使用していません
【3】通常更新の有効化
・cronによるup2date/yum/apt-getコマンドを使った自動更新
・php/apache/moodleを最新版にする
→とりあえずは随時更新するものとしました。
【4】メーリングリスト使用
セキュリティ動向を知るためのメーリングリスト登録です。とりあえず日本版のメーリングリストに登録した方がよいかと思います。私はひとまず登録なしで進めましたが、PHPやMySQLの情報は定期的に取得した方が良いです。
・CERT
→US-CERT、米国国土安全保障省(DHS)配下の情報セキュリティ対策組織のメーリングリスト登録が推奨されています。とりあえず英語だと分かり辛いので上記は登録せず、日本版のセキュリティ組織としてJPCERT/CCのメーリングリストに登録する事にします。
手順(1):メールを作成する
手順(2):指定された宛先(announce-ctl@jpcert.or.jp)を設定する
手順(3):本文にsubscribeと記述し、送信
・PHP
→こちらも英語は辛いので、日本PHPユーザー会のメーリングリストが良いかと。ユーザー向けのメーリングリスト登録ページはこちら。
・MySQL
→こちらも日本MySQLユーザー会のメーリングリストが存在しますので、そちらから。
【5】ファイアウォール
・ハードウェア/ソフトウェアの二重でFWを設定
→VPS環境なので、今回はCentOS上のiptablesのみで対応
・未使用のポートは無効化しましょう:次で指定する使用ポート以外を閉じます
許可ポート:80(HTTP)/443(HTTPS)/9111(チャット用)
※必要に応じて:22(SSH)/3389(リモートデスクトップ使う場合のみ)
【6】パスワードポリシー
Moodleのユーザー(教員/学生など)が使用するパスワードのポリシーを強制させます。
Moodle画面から設定->サイト管理->セキュリティ->サイトポリシーで以下を強制できます。
・パスワード長
・数字/小文字/大文字/非英数字/連続した同一文字
ただし現実的に覚えられる内容にしてあげましょうね、との事。
【7】最悪の事態に備える
・バックアップを準備する
・リカバリを定期的に練習する:実際にやってみて、手順等問題がないか確認
・定期的にルートキット検出ツールを使用する
バックアップ/リカバリについては後でバックアップおよびリストア手順に対応し、ページを作成予定
ルートキット検出ツールはLinuxならchklootkit、WindowsならRootkitRevealerを使うようです
とりあえずLinuxで対応する手順のみ記載します。
※参考:rootkit検知ツール導入(chkrootkit)
Moodleをインストールしたサーバー上で以下コマンドを実行。
リポジトリ(デフォルト)に存在するか確認。
yum list | grep chkrootkit
※ここで表示された場合、yum install chkrootkitでインストールできると思います(現時点では存在しない)
手動でchkrootkitダウンロード。
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
ファイル解凍。
tar zxvf chkrootkit.tar.gz
ホームディレクトリにbinディレクトリを作成し、その中にchkrootkitを配置
mkdir -p ~/bin && mv chkrootkit-0.50/chkrootkit ~/bin
不要なファイル/ディレクトリ削除。
rm -rf chkrootkit-0.50/ rm -f chkrootkit.tar.gz
試しに実行。
chkrootkit | grep INFECTED
ここでcan’t find ‘○○’と表示された場合、チェックに必要なコマンドが未インストールの状態です。私はnetstatコマンドがないようだったので、インストールしました。
sudo yum install net-tools
※CentOS7ではnet-tools(netstatを含むパッケージ)が廃止予定となっており、ssコマンドを使用する事が推奨されているようです。ただしchkrootkitではnetstatを使用しているためにインストールしました。(参考:RHEL7/CentOS7でipコマンドをマスター)
再度、実行。
chkrootkit | grep INFECTED
※何も表示されなければ、問題なし(検知しても必ずしもキット設置されたわけではないようなので、表示あった場合は要確認)
定期実行(cron)の設定を作る。
vi /etc/cron.daily/chkrootkit
ファイル内容を以下として保存。(誤検知設定も書いてあったので、流用させてもらいました)
#!/bin/bash # パス設定 PATH=/usr/bin:/bin:/root/bin # 一時ログ保存ファイル TMPLOG=`mktemp` # chkrootkit実行 chkrootkit > $TMPLOG # ログ出力(chkrootkitタグをつけてるので、後で/var/log/messagesからの抽出が行いやすい) cat $TMPLOG | logger -t chkrootkit # SMTPSのbindshell誤検知対応 if [ ! -z "$(grep 465 $TMPLOG)" ] && \ [ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then sed -i '/465/d' $TMPLOG fi # upstartパッケージ更新時のSuckit誤検知対応 if [ ! -z "$(grep Suckit $TMPLOG)" ] && \ [ -z $(rpm -V `rpm -qf /sbin/init`) ]; then sed -i '/Suckit/d' $TMPLOG fi # rootkit検知時のみroot宛メール送信(SMTP入れてないのでとりあえず無効化) #[ ! -z "$(grep INFECTED $TMPLOG)" ] && \ #grep INFECTED $TMPLOG | mail -s "chkrootkit report in `hostname`" root rm -f $TMPLOG
実行権限付与。
chmod 700 /etc/cron.daily/chkrootkit
参考サイトではchkrootkitで使うコマンド自体改ざんされるとこまるので、現時点でのコマンドを圧縮/メールで受け取って保持しておくようになっています。とりあえず私はメール環境をまだ構築していないので、圧縮してFTPツールで取得して保管しておくことにします。
chkrootkit使用コマンド退避先ディレクトリ作成
mkdir chkrootkitcmd
chkrootkit使用コマンドを退避先ディレクトリへコピー
cp `which --skip-alias awk cut echo egrep find head id ls netstat ps strings sed ssh uname` chkrootkitcmd/
退避したchkrootkitの動作確認。
chkrootkit -p chkrootkitcmd | grep INFECTED
chkrootkit使用コマンド退避先ディレクトリ圧縮
tar cfvz chkrootkitcmd.tar.gz chkrootkitcmd
chkrootkit使用コマンド退避先ディレクトリ削除
rm -rf chkrootkitcmd
ここで圧縮したファイル「chkrootkitcmd.tar.gz」をFTPツールで取得し、自身で保管しておきます。
chkrootkit使用コマンド(圧縮版)削除
rm -f chkrootkitcmd.tar.gz
【8】Moodleセキュリティ警告
あなたのサイトをmoodle.orgに登録してください。登録ユーザにはメールアラートが送信されます。
とされていますが、ウェブ及びRSSでもアラートは掲載されるようです。
折角なので登録手順を載せます。
自分のMoodleサイト上から登録する方法と、moodle.orgから登録する方法があるみたいです。とりあえずmoodle.orgにアカウントを作って登録する事にしました。(自サイトから登録すると後でサイト情報どうやって変更するのか不安だったため)
・moodle.orgにアクセス。アカウントがないので、「新しいアカウントを作成する」ボタン押下。
・ユーザ名やパスワード等、必須事項を入力。作成が終わると、登録したアドレスにメールが飛んできます。
・メールに記載されたリンクを選択し、アカウントを有効化。
多分、これでアラートがメールで送られてくるのだと思います。
サイト自体はある程度コース等完成してから登録することにします。今は行いませんが、手順配下。
・管理者でログインし、管理->サイト管理->登録を選択
・登録情報を入力し、登録完了
【9】様々な検討事項
9種類ぐらいの検討事項が提示されていました。1つずつ対応を決めます。
(9-1)セキュアフォーム設定を使用してください。
→
(9-2)常にMySQLのrootパスワードを設定してください。
→Moodle環境構築 その1で対応済み。
※MySQL(MariaDB)インストール時にmysql_secure_installation実行で対応
(9-3)MySQLネットワークアクセスを無効にしてください。
→
(9-4)SSLを使用してください (httpslogins=yes)。
→
(9-5)良いパスワードを使用してください – 「設定 > サイト管理 > セキュリティ > サイトポリシー」のパスワードポリシーを設定してください。
→
(9-6)「設定 > サイト管理 > セキュリティ > サイトポリシー」の「opentogoogle」設定を有効にしないでください。
→
(9-7)ゲストアクセスを無効にしてください。
→
(9-8)すべてのコースに登録キーを設定するか、すべてのコースにおいて「コース登録可能 = No」に設定してください。
→
(9-9)「管理 > サイト管理 > プラグイン > 受講登録 > 自己登録」で登録キーヒント (「ヒントを表示する」) が無効にされていることを確認してください。
【10】安全なファイルパーミッション
【11】専用サーバーでMoodleを運用
【12】共有ホスティング環境でMoodleを運用