- 自動バックアップ
- ネットワークトラフィックの監視
- アクセス解析
- 通知メールの件名の文字化け
- サーバマシンの移行
- マシンスペック
- OSのインストール
- 一般ユーザの作成
- bashの環境設定
- sudoユーザの設定
- yumの設定
- rootメールの転送先設定
- sendmailの設定
- Apacheの設定
- Apacheのリバースプロクシとバーチャルホストの設定
- PHPをダウングレード
- MySQLサーバの設定
- MySQLデータのバックアップとリストア
- XOOPSやWikiデータのバックアップとリストア
- Apacheの起動
- Wikiの添付ファイルの容量制限
- 登録ユーザ一覧の表示項目の変更
- ネットワーク構成
- リバースプロクシ(Reverse Proxy)の設定 (Solarisマシン)
- リモートIPの書き換え設定 (Linuxマシン)
- 新規登録できない! フォーラムに投稿できない!!
- 新規ユーザのイベント更新通知メッセージの受取方法をメールに変更する
- 新規ユーザのイベント通知機能をデフォルトでONにする
- デザイン
自動バックアップ
ネットワークトラフィックの監視
ここ( http://fedorasrv.com/mrtg.shtml )を参考にして導入.
アクセス解析
通知メールの件名の文字化け
サーバマシンの移行
最初にWebサイトを立ち上げたサーバマシンは研究用であったため,新たにWebサーバ用にマシンを組み立てた後,Webのデータを全て移動させました.
マシンスペック
新しいWebサーバのスペックは以下の通りです.
- CPU: Intel Celeron-D 326 (2.53GHz, FSB 533MHz, 256KB L2Cache, EM64T, LGA775)
- マザーボード: BIOSTAR i945G-M7 (i945G + ICH7, DDR2 DIMM×4スロット, 10/100Base-T (Realtek), -SATA2×4ポート, MicroATX)
- メモリ: PQI JAPAN QD2533-512 (240pin, DIMM DDR2 SDRAM, 533MHz(PC4300), 512MB, 永久保証) ×2個
- HDD: Seagate ST3120813AS (120GB, 7200rpm, SATA 3Gb/s, 8MB Cache)
- PCケース: Fast Corp. CS-221S300W (300W, MicroATX)
これだけ合わせて,5万円弱で購入してきました.
OSのインストール
Fedora Core 4をインストールしました.(参考:http://fedorasrv.com/fedora4.shtml)
まず,Fedora Coreプロジェクトの公式WebサイトからISOイメージ(FC4-i386-disc1.iso, FC4-i386-disc2.iso, FC4-i386-disc3.iso, FC4-i386-disc4.iso)をダウンロードしてきてCDに焼きます.
BIOSの設定で最初にCD-ROMドライブから起動するようにしておき,1枚目のCDをCD-ROMドライブ(研究室の他のDOS/Vマシンから借用しました)に挿入して,選択肢は次のものを選びます.
- Langage Selection: Japanese (日本語)
- キーボード設定: 日本語
- インストールの種類: カスタム
- ディスクパーティションの設定: 自動パーティション設定
- 自動パーティション設定: システムのすべてのパーティションを削除, 作成された(そして変更された)パーティションを確認
- ディスクの設定: (確認して次へ)
- ブートローダーの設定: (確認して次へ)
- ネットワークの設定: 編集->DHCPを使わない, 手動設定 medinux, ゲートウェイ 192.168.1.4, 1番目のDNS 192.168.1.39
- ファイヤーウォールの設定: ファイアウォールなし, 無効
- タイムゾーンの選択: アジア/東京
- Rootパスワードを設定: hogehoge, hogehoge
- パッケージグループの選択: (httpdやtelnet等を選択.後からyumでインストールできるので,あまりこだわらなくてもいいかも)
- インストール準備完了: (無事にインストールが完了することを願って「次」ボタンをクリック)
(どこかでntpサーバを設定するところがあったはず... ntpサーバに関してはここを参照.)
一般ユーザの作成
初めて起動するとFirst Bootが動いてユーザの作成等ができる.ここで,一般ユーザ(vip)を作っておく.
bashの環境設定
$ vi ~/.bash_profile
最後に以下を追加.
alias mv='mv -i'
alias cp='cp -i'
alias rm='rm -i'
alias jeuc='LANG=ja_JP.eucJP'
alias jutf='LANG=ja_JP.utf8'
alias eng='LANG=C'
sudoユーザの設定
システムの設定をする際にいちいちrootユーザになるのも面倒なときがあるので,sudoを使えるようにする.
$ su -
# vi /etc/sudoers
# %wheel ALL=(ALL) ALL
↓コメントアウトを削除
%wheel ALL=(ALL) ALL
# vi /etc/group
wheel:x:10:root
↓ユーザ名を追加
wheel:x:10:root,vip
yumの設定
http://fedorasrv.com/fedora4-init.shtmlの「(5) パッケージ管理システム設定」を参考にして,yumがrpmをダウンロードしてくるサーバを日本のミラーサイトに限定させる.
ただし,yum -y updateをすると時間がかかるので後回し.
rootメールの転送先設定
root宛てのメールが自分に届くようにする.
# vi /etc/aliases#root
sendmailの設定
# echo "vip.okada-lab.org" >> /etc/mail/local-host-names
# echo "vip.okada-lab.org RELAY" >> /etc/mail/access
# makemap hash /etc/mail/access < /etc/mail/access
Apacheの設定
# vi /etc/httpd/conf/httpd.conf
ServerTokens OS
↓変更
### by tasaki 2006-05-23
###ServerTokens OS
ServerTokens Prod
#ServerNamewww.example.com:80#ServerName
↓変更
### by tasaki 2006-05-23www.example.com:80
ServerName medinux.okada-lab.org:80
Options Indexes FollowSymLinks
↓変更
### by tasaki 2006-05-23
### Options Indexes FollowSymLinks
Options Indexes ExecCGI FollowSymLinks
AllowOverride None
↓変更
### by tasaki 2006-05-23
### AllowOverride None
AllowOverride All
ServerSignature On
↓変更
### by tasaki 2006-05-23
###ServerSignature On
ServerSignature Off
AddDefaultCharset UTF-8
↓変更
### by tasaki 2006-05-23
###AddDefaultCharset UTF-8
#AddHandlercgi-script .cgi
↓変更
### by tasaki 2006-05-23
AddHandler cgi-script .cgi .pl
Apacheのリバースプロクシとバーチャルホストの設定
rpaf_moduleに関しては下記を参照.
# vi /etc/httpd/conf.d/virtualhost.conf
LoadModule rpaf_module /usr/lib/httpd/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 192.168.1.39
NameVirtualHost vip.okada-lab.org:80
NameVirtualHost vip.okada-lab.org:8080
<VirtualHost vip.okada-lab.org:80>
ServerName vip.okada-lab.org
</VirtualHost>
<VirtualHost vip.okada-lab.org:8080>
ServerName vip.okada-lab.org
</VirtualHost>
バーチャルホストを使っているのは,以前8080番ポートで運用していたときの名残です.
PHPをダウングレード
Fedora Core 4には標準でPHP5系がインストールされます.しかし,XOOPSやWikiを動作させる際にPHP5系では不具合がでることがあります.そこで,PHP5系をPHP4系にダウングレードさせます.
yumで自動的にアップデートされないように次の記述を追加する.
# vi /etc/yum.conf
最後に追加.
exclude=kernel* php*
MySQLサーバの設定
まず,http://fedorasrv.com/mysql.shtmlを参考にして,MySQLサーバの初期設定をする.
次に,http://fedorasrv.com/xoops.shtmlを参考にして,MySQLサーバ上にXOOPS用のデータベースとユーザを作成します.このとき,データベース名を「xoops」としておくとセキュリティ的によろしくないので,別の名前にすると良い.
MySQLデータのバックアップとリストア
旧サーバにて次のコマンドを実行してMySQLのデータをバックアップします.
$ mysqldump -u MySQLのユーザ名 -pパスワード XOOPSのデータベース名 > xoops.bak
このxoops.bakをscp等を使って新サーバに移動させた後,次のコマンドを実行してリストアします.
$ mysql -u MySQLのユーザ名 -pパスワード データベース名 < xoops.bak
XOOPSやWikiデータのバックアップとリストア
旧サーバにて次のコマンドを実行してXOOPSやWikiのデータをバックアップします.
# cd /var/www
# tar cvfz ~/html.tar.gz html/
このhtml.tar.gzをscp等を使って新サーバに移動させた後,次のコマンドを実行してリストアします.
# tar xvfz html.tar.gz --same-owner -C /var/www
Apacheの起動
# /etc/rc.d/init.d/httpd start
Wikiの添付ファイルの容量制限
登録ユーザ一覧の表示項目の変更
白扇の機能を使ってユーザ情報に所属大学や所属研究室の項目を追加したけど,登録ユーザ一覧にそれらが反映されてません.
そこで,xoopsmembers_searchresults.htmlのテンプレートを変更しました.
6行目 (以下は見やすくするために改行しておきました)
<th align="center"><{$lang_avatar}></th>
<th align="center"><{$lang_username}></th>
<th align="center"><{$lang_realname}></th>
<th align="center">所属大学</th>
<th align="center">所属研究室</th>
<th align="center">職業</th>
<th align="center"><{$lang_email}></th>
<th align="center"><{$lang_url}></th>
<th align="center"><{$lang_regdate}></th>
<th align="center"><{$lang_lastlogin}></th>
<th align="center"><{$lang_posts}></th>
13行目 (以下は見やすくするために改行しておきました)
<td class="even"><{$users[i].avatar}></td>
<td class="odd"><a href="<{$xoops_url}>/userinfo.php?uid=<{$users[i].id}>"><{$users[i].name}></a></td>
<td class="even"><{$users[i].realname}></td>
<td class="odd"><{$users[i].id|suin_user:"var32"}></td>
<td class="even"><{$users[i].id|suin_user:"var33"}></td>
<td class="odd"><{$users[i].id|suin_user:"var36"}></td>
<td align="center" class="even"><{$users[i].email}></td>
<td class="odd" align="center"><{$users[i].website}></td>
<td class="even" align="center"><{$users[i].registerdate}></td>
<td class="odd" align="center"><{$users[i].lastlogin}></td>
<td class="even" align="center"><{$users[i].posts}></td>
上記でsuin_userとあるのは,白扇モジュール作者が作成したSmartyプラグインです.http://www.suin.jp/modules/mydownloads/singlefile-cid-10-lid-38.asp
ネットワーク構成
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (network.jpg)
合同合宿のWebサイトにはLAMP(Linux + Apache + MySQL + PHP)環境下でXOOPSとWikiを運用したいなぁ (だって,インターネット上にたくさん情報があるんだもん!).でも,岡田研究室にはグローバルIPは1個しかないからなぁ,80番ポートにリクエストがあるとSolarisに構築されたメインWebサーバが応答しちゃう.さぁー どーしよー.
- 方法その1: 81番ポートでアクセスされたらルータの設定で192.168.1.17にIPフォワードしよう!
結果: セキュリティポリシーが厳しいネットワーク環境だと,81番なんていう変なポートはアクセスできない.
- 方法その2: 81番がだめなら8080番ポートを使えばいいんじゃない?
結果: セキュリティポリシーが非常に厳しいネットワーク環境だと,8080番もアクセスできない.
- 方法その3: リバースプロクシでプライベートネットワーク内のWebサーバからコンテンツを呼び出す.
結果: 今のとこいい感じ♪
リバースプロクシ(Reverse Proxy)の設定 (Solarisマシン)
Solarisマシンの/etc/apache/httpd.confの最後に次の記述を追加する.
# for VIP Camp added by Tasaki 2006-04-05
<VirtualHost 192.168.1.39>
ServerAdmin [email protected]
ServerName vip.okada-lab.org
ProxyRequests off
ProxyPass / http://192.168.1.17:80/
ErrorLog /usr/local/apache/logs/vip-error_log
CustomLog /usr/local/apache/logs/vip-access_log combined
</VirtualHost>
設定を保存したら次のコマンドでApacheを再起動する.
# /usr/apache/bin/apachectl restart
リモートIPの書き換え設定 (Linuxマシン)
上の設定でリバースプロクシはできるのですが,Linuxマシン上のApacheのログを見ると全てSolarisマシン(192.168.1.39)からのアクセスとして記録されます.これだと,リモートIPによるアクセス解析や(もし荒らされた場合に)アクセス制限とかができなくなっちゃいます.
そこで導入したのが,mod_rpafというApacheの追加モジュールです. http://stderr.net/apache/rpaf/
リバースプロクシはユーザからのリクエスト受けて,別のマシンに代理でリエストするときに,リモートIP(ユーザのIP)情報をX-Forwarded-Forというリクエストヘッダーに保存しています.mod_rpafモジュールは特定の信頼できるホストからリクエストがあった場合,リモートIP情報をX-Forwarded-Forの値で上書きします.これにより,Linuxマシンのログには正しくユーザのIPが記録されるようになります.
公式サイトよりmod_rpafの最新版(2006-04現在ver. 0.5)をダウンロードしてきて,次のようにしてコンパイル&インストールする(ただし,コンパイルするためにはhttpd-develパッケージが必要です).
$ tar xvfz mod_rpaf-0.5.tar.gz
$ cd mod_rpaf-0.5
$ vi Makefile
APXS=/home/thomas/build/apache-dev/bin/apxs
↓書き換え
APXS=/usr/sbin/apxs
$ make rpaf-2.0
# make install-2.0
Linuxマシンの/etc/httpd/conf/httpd.confの最後に次の記述を追加する.
# for VIP Camp added by Tasaki 2006-04-05
LoadModule rpaf_module /usr/lib/httpd/modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 192.168.1.39
最後のRPAFproxy_ipsでリバースプロクシを設定しているホスト(Soralisマシン)のIPを指定します.
設定を保存したら次のコマンドでApacheを再起動する.
# /etc/rc.d/init.d/httpd restart
Linuxマシンに記録されるログは次のように改善されました.
mod_rpad適用前
192.168.1.39 - - [05/Apr/2006:17:15:28 +0900] "GET / HTTP/1.1" ...
mod_rpad適用後
xx.22.95.202 - - [06/Apr/2006:17:54:37 +0900] "GET / HTTP/1.1" ...
新規登録できない! フォーラムに投稿できない!!
XOOPSのデフォルトの設定では,CSRF攻撃対策のためにブラウザから送信されるHTTP_REFERER情報をチェックしています.しかし,Norton等を利用している場合,HTTP_REFERER情報が送信されないことがあります.そのために,新規登録できなかったり,フォーラムに投稿できなかったりします.
これを改善するためには,ユーザに対してNortonの設定でHTTP_REFERERを送信するように変更してもらうと良い.
Nortonの設定方法:http://snow-drop.or.tv/norton/
Nortonの設定方法:http://snow-drop.or.tv/norton/
しかし,一般ユーザにRefererうんぬんの話をするのはとても大変です. そこで考えられるもう一つの手段は,XOOPSのコアをハックしてHTTP_REFERERをチェックしている部分を機能しなくさせる方法です.
XOOPS_ROOT/include/functions.php 155行目~
function xoops_refcheck($docheck=1)
{
$ref = xoops_getenv(?'HTTP_REFERER?');
if ($docheck == 0) {
return true;
}
if ($ref == ?'?') {
### 2006-03-07 by tasaki
### return false;
return true;
}
if (strpos($ref, XOOPS_URL) !== 0 ) {
return false;
}
return true;
}
ただし,これは?'?'改悪手法?'?'でもあります.明示的にセキュリティの穴を作るわけですから,当然悪意あるユーザによって大量のユーザを登録されたりフォーラムを荒らされたりする可能性が生じます.
※ご存知の方もいらっしゃると思いますが,ソーシャルネットワーキングサイトのmixiで「ぼくはまちちゃん!」という書き込みが連鎖的に広がっていったのも,このCSRF攻撃によるものです.
参考:
http://xoops.s22.xrea.com:8080/modules/newbb/viewtopic.php?topic_id=202&forum=3&post_id=896
http://www.itmedia.co.jp/news/articles/0504/23/news005.html
http://bakera.jp/hatomaru.aspx/glossary/0043005300520046
http://www.tdiary.org/20050721.html
http://xoops.s22.xrea.com:8080/modules/newbb/viewtopic.php?topic_id=202&forum=3&post_id=896
http://www.itmedia.co.jp/news/articles/0504/23/news005.html
http://bakera.jp/hatomaru.aspx/glossary/0043005300520046
http://www.tdiary.org/20050721.html
新規ユーザのイベント更新通知メッセージの受取方法をメールに変更する
XOOPS_ROOT/kernel/user.phpの98行目を次のように変更する.
$this->initVar(?'notify_method?', XOBJ_DTYPE_OTHER, 1, false);
↓
$this->initVar(?'notify_method?', XOBJ_DTYPE_OTHER, 2, false);
新規ユーザのイベント通知機能をデフォルトでONにする
参考: URL
フォーラムの新着情報イベントをユーザに送信させたいが,デフォルトでは全てのイベントを通知しないようになっている.
フォーラムの新着情報イベントをユーザに送信させたいが,デフォルトでは全てのイベントを通知しないようになっている.
SQL文を発行してxoopsnotificationsテーブルにフィールドを直接追加する.
例: ユーザID 50~100番の(未登録)ユーザに「新規トピックまたは返信の投稿があった場合に通知する」のイベントを通知させる.
% vi not.pl
#!/usr/bin/perl -w
for ($i = 50; $i <= 100; $i++) {
print ?"INSERT INTO XOOPSデータベース名.XOOPSデータベース接頭辞_xoopsnotifications?" .
?" (not_id, not_modid, not_itemid, not_category,?" .
?" not_event, not_uid, not_mode)?" .
?" VALUES ( NULL, モジュールID, アイテムID, ?'global?', ?'new_post?', $i, 0);??n?";
}
% perl not.pl > not.sql
% mysql -u データベースユーザ名 -p < not.sql
Enter password: パスワード入力
ただし,?'?'XOOPSデータベース名?'?',?'?'XOOPSデータベース接頭辞?'?',?'?'モジュールID?'?',?'?'アイテムID?'?'は環境に合わせて適宜変更してください.モジュールIDやカテゴリ名等は実際にそのイベントをOn/Offしてみたときにデータベース内の値がどう変わるかをphpmyadminで確認するとわかると思います (もっと簡単にわかる方法ないのかなぁ~).
デザイン
Special Thanks ☆ to-biさん