2005/03/19(土)qmail-scannerインストール時に遭遇した問題
2005/03/18 25:00
なんか色々あり過ぎて、整理し切れていない。引っかかったところを中心に覚えている限りでメモしておく。作業ログ流れで、通常インストール手順とかぶるところもあり、いい加減なところもあり。
qmail-scannerインストールに関する多くのドキュメントでは、suidperlのパーミッションを変更するように書いているが、debianの場合suidperlはperlへのシンボリックリンクに過ぎない。よってパーミッション設定は不要。弄ると多分perlが動かなくなる。
(×:動かなくなった悪例)
# chmod 4711 /usr/bin/suidperlPerl CGIが全滅した。
# chmod 755 /usr/bin/suidperlで書き戻し。
<qmail-scanner.plの設置等はすでに終わっているとして>
qmail-scannerのsrcフォルダから、
# contrib/test_installation.sh -doit4通のテストメールのうち1通目(通常メール)だけは送られてくるが、2通目でエラーを出して止まってしまう。エラーは以下の通り。
Sending eicar test virus - should be caught by perlscanner module... qmail-inject: fatal: qq temporary problem (#4.3.0) Bad error. qmail-inject diedチェックすべきログは、/var/spool/qmailscan/qmail-queue.logと/var/log/mail.err。
原因としてはclamavが動いていないか、メールデータにアクセス失敗している可能性が高い。
/var/spool/qmailscan/qmail-queue.logを覗くと、
/var/spool/qmailscan/tmp/debian111060900649323497: Access denied. ERRORがたくさん出ている。アクセス権問題であるので、
/etc/clamav/clamd.conf
User clamavを
User qscandに変更。
clamavを再起動しようとすると、
# /etc/init.d/clamav-daemon restartpsで確認しても存在していない。立ち上がっていないようである。
/var/log/clamav/clamav.logを見ると、
Sat Mar 12 18:05:27 2005 -> ERROR: Socket file /var/run/clamav/clamd.ctl could n ot be bound: Permission denied今度はclamavの一時ファイルにアクセスできなくなってしまったようだ。これはパーミッションを弄ってやれば良い。
# chgrp qscand /var/run/clamav # chmod 775 /var/run/clamavclamavの実行ディレクトリグループのみをqscandに変えてパーミッションを775にしてやる。若干荒技になるが、でも777よりはましだろう。
再び再起動
# /etc/init.d/clamav-daemon restart立ち上がった。
# contrib/test_installation.sh -doit4通送信中、2と3(ウイルス入り)が配信されなくなった(1はノーマル、4はスパム。recipsオプションが無かったので配信されなくなった)。しかしこの状態では外部からの通常メールが配信されないことが発覚。以下次項に続く。
(注:この問題はswap再設定によって再現性が無くなった可能性があります)
qmail-scannerインストールの過程で、テスト時に躓いた問題。結論はメモリ問題だが、エラーメッセージが特殊なのでメモ。
<qmail-scanner.plの設置等はすでに終わっているとして>
外部からウイルスなどが含まれない通常のメールを送っても配信されない。QMAILQUEUEの設定を切り替えて、qmail-scanner.plを介さずqmail-queueに渡すように設定する。
QMAILQUEUE="/var/qmail/bin/qmail-queue" export QMAILQUEUEと、きちんと動く(QMAILQUEUEを使っている以外は基本のqmailの挙動と同じ、もちろんウイルスはそのまま)ので、QMAILQUEUEがいけないわけではないらしい。うーん、qmail-scanner-queue.plのどっかで躓いている。
/var/log/mail.errを見ると、
Mar 14 01:38:51 debian X-Qmail-Scanner-1.25: [debian11107319314933436] cannot open /var/spool/qmailscan/quarantine-attachments.db - No such file or directoryもちろん、ファイルは存在している。最初はパーミッション問題かと思ったが、実はメモリ確保が不足している問題。つまずいたところでたまたま出たエラーがNo such~ということのようだ。下記サイトなどを眺めていてやっと分かった。
http://slashdot.jp/journal.pl?op=display&uid=779&id=150799
http://sourceforge.net/mailarchive/message.php?msg_id=6806272
http://qmail-scanner.sourceforge.net/FAQ.php
メモリ確保にはqmailの起動スクリプトのulimit値を上げてやる。
/etc/init.d/qmail
53c53 < ulimit -v 8192 --- > ulimit -v 10240いくつが最適値なのかはちょっと分からない。
#swapが原因だったのか再現性が無くなったようなので、現在ulimitを8192に戻して運用中。
2005/03/15(火)qmail-scanner(qmail-scanner インストール編)
2005/03/15 11:00
~Qmail Scannerインストール編~
Qmail Scannerをインストールしてウイルスチェックが出来るところまで。
●Qmail Scannerには以下のパッケージが必要。
・unzip
zip添付を開くのに必要
・Perl 5.005_03+以上
-PerlのTime::HiResモジュール
ナノセカンド精度のタイマーモジュール
-PerlのDB_Fileモジュール
Berkeley DB によって提供されている機能をPerlプログラムで使えるようにする
-suidperl
ディストリビューションによってパッケージ名が違う。debianではperl-suid
・MailDropのreformime
MIMEの展開・再構成に使うっぽい
・TNEF
MS OEやExchangeがリッチテキスト形式のメールを送る際に添付する、application/ms-tnefタイプの情報を読めるようにする。この時普通の添付もこれに吸収されてしまう?
・qmailqueue-patch
環境変数QMAILQUEUEを使えるようにする。qmailはQMAILQUEUEで設定されたキューにメールを渡すようになる。
[1]unzip確認
$ which unzip /usr/bin/unzip[2]perlバージョン+モジュール確認+perl-suidインストール
(1)Perlバージョンの確認
$ perl -v This is perl, v5.8.3 built for i386-linux-thread-multi(2)モジュールの確認
$ perl -mTime::HiRes $ perl -mDB_File $ perl -mSys::SyslogCan't locateで怒られないのでインストール済み。
(3)suidperlのインストール
aptをtestingにして、
# apt-get install perl-suidチェックしたのに、依存関係でperlのバージョンが5.8.4-7に上がってしまいました。
インストール確認
$ which suidperl /usr/bin/suidperl[3]MailDropのreformimeインストール
reformineだけで良いようだが、素直に全部ぶち込むことにする。
# apt-get install maildropインストール確認
$ which reformime /usr/bin/reformimecourier-maildropはメルサバCourier専用だろうか。普通のmaildropで良いと思う。
[4]TNEFインストール
# apt-get install tnefインストール確認
$ which tnef /usr/bin/tnef[5]qmailqueue-patchインストール
debianパッチにQMAILQUEUEパッチが含まれていたためこの作業は必要無し。
以下、気づかずに進めたときの作業ログ
# cd /usr/src/qmail-src/ # wget <a HREF="http://www.qmail.org/qmailqueue-patch" TARGET=_top>http://www.qmail.org/qmailqueue-patch</a> # tar -xvzf qmail_1.03.orig.tar.gz # cd qmail-1.03/ # patch -p1 <../qmail-date-localtime.patch # patch -p1 <../qmailqueue-patch # zcat ../qmail_1.03-36.diff.gz | patch -p1としたところで、
Reversed (or previously applied) patch detected! Assume -R? [n]と2回ほど注意される。conflictというより、単にdebianのpatchに含まれてるのではないかと思い、grepしたところ、
# zcat ../qmail_1.03-36.diff.gz | grep MAILQUEUE ++ binqqargs[0] = env_get("QMAILQUEUE"); ++ variable QMAILQUEUE. Also known as qmailqueue patch. ++QMAILQUEUE ++ if (env_get("QMAILQUEUE")) { ++ logstring(2,env_get("QMAILQUEUE")); + binqqargs[0] = env_get("QMAILQUEUE");これは含まれているっぽい。debian本家に調べに行くと、 http://packages.debian.org/changelogs/pool/non-free/q/qmail/qmail_1.03-36/changelogに、
qmail (1.03-21) testing unstable; urgency=low * Added QMAIL-QUEUE patchとなっているので、追加済み確定。
[6]qmail-scannerインストール
(1)qscandユーザー追加
# groupadd qscand # useradd -g qscand -s /bin/false qscand(2)ソースダウンロード
最新版は1.25
http://prdownloads.sourceforge.net/qmail-scanner/qmail-scanner-1.25.tgz
からソースをダウンロード(sourceforgeだからwgetじゃダメ)。
(3)インストール
$ tar -xvzf qmail-scanner-1.25.tgz $ cd qmail-scanner-1.25 # ./configure /usr/bin/reformime contains bugs. Please upgrade to a release that post-dates Mar 22 2002 (e.g. 1.3.8)reformimeが古いと怒られた。
# apt-show-versions -a -p maildrop maildrop 1.3.7-2 install ok installed maildrop 1.3.7-2 stable maildrop 1.5.3-1.1 testing maildrop 1.5.3-1.1 unstable maildrop/stable uptodate 1.3.7-2なので、testingを入れることにする。
# apt-get install maildrop/testing # ./configureスクリプト生成プログラムのテストが通ったので、ちゃんと生成し直す。
# ./configure --lang ja_JP.EUC --admin root --notify recips,admin --domain dt8.jp --install
- langは通知メールの言語、--adminと--domainは合わせて管理者メルアドだと思ってよい。--notifyは通知のポリシー決めで、recipsは受信者、adminは管理者へそれぞれ通知する。ウイルスメールの場合詐称があるので、送信元アドレスは当てにならずsenderは使いづらい。Stray Penguinにlsndr(ローカルの送信者)に通知するパッチがあるが、きちんと動くなら不用意にウイルスに感染した自ドメインのユーザへの自動通知が出来る? 今後の課題だろうか。adminの代わりにml宛先を除いたnmladmが使われることも多い。自分にはml宛先ウイルスを通知することによる不利益が今ひとつぴんと来ないので、当面adminで使う。その他の通知先は[参考サイト]を参照。
(4)QMAILQUEUE設定
/etc/init.d/qmail
に以下のdiff2行分を追加。
35a36,38 > QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl" > export QMAILQUEUE >qmailの起動スクリプトにQMAILQUEUEの設定をしておく。起動スクリプトは環境によって違うがtcpserver起動の前に設定されるようにしておけば大丈夫だろう。
(5)ulimit修正
同じく、
/etc/init.d/qmail
のulimitの値を変更。
53c53 < ulimit -v 8192 --- > ulimit -v 10240メモリ制限はQMAIL-SCANNERの頻出問題だ。私はこう理解している。デフォルトでqmailは自身の起動にギリギリ程度のメモリ値を設定ファイルに記述する。qmail-scannerを介し使うようにした時に、その設定値を超えてスクリプトがストップすることがある。想定外のストップにスクリプトは止まった箇所によって様々なエラーを吐く。ファイルがないといわれたり、パーミッションが違うと言われることもある。それで数多の管理者を混乱させるのだ。qmail-scannerインストール時には、このメモリ制限問題とパーミッション問題がよく起こる。発生したら適切に切り分ける必要がある。daemontools使用時?はulimitではなく、softlimitの設定値かもしれない。
(6)日本語euc->JIS修正
ウィルス告知メールがeucで飛んでくる。文字化けするメーラーも結構あるのでJISに修正してやる。
1876c1876 < open(SM,"|$qmailinject -h -f ''")||&error_condition("cannot open $qmailinject for sending quarantine report - $!"); --- > open(SM,"|/usb/bin/nkf -j|$qmailinject -h -f ''")||&error_condition("cannot open $qmailinject for sending quarantine report - $!"); 2003c2003 < open(SM,"|$qmailinject -h -f ''")||&error_condition("cannot open $qmailinject for sending quarantine report - $!"); --- > open(SM,"|/usr/bin/nkf -j|$qmailinject -h -f ''")||&error_condition("cannot open $qmailinject for sending quarantine report - $!");要するに、qmailinjectの前にパイプでnkfを挟んでやるだけだ。2箇所修正が必要。
(7)起動とテスト
qmailを再起動
# /etc/init.d/qmail restartテスト
# contrib/test_installation.sh -doit4通のメールのうち2通目と3通目がウィルス告知メールになっていれば成功だ。1通目は通常メールで、4通目はスパムテスト用なので、この段階では配信されるはず。
http://www.eicar.org/anti_virus_test_file.htm
からテストウィルスを落としてプロバイダ経由で送信(注:怒られる危険性があるのであんまりやってはいけません)すると、管理者宛と受信者宛に2通通知が届くことを確認する。
プロバイダ経由で普通のメールの送受信も確認しておく(メモリ制限問題でqmail-scannerが止まる場合、届かないことがある)。
あとは多量のウイルスで検査するも、放っておくも良し。
[参考サイト]
ここがわかりやすい。
http://www.asahi-net.or.jp/~aa4t-nngk/qmail6.html
以下はそれぞれ微妙に情報か解説が不足している。
http://www.atmarkit.co.jp/flinux/rensai/qmail08/qmail08c.html
http://www.itmedia.co.jp/help/howto/security/special6/02.html
http://www.tom.sfc.keio.ac.jp/~torry/ldap/ldap.html#doc10_1122
http://www.unix-power.jp/linux/qmail-scanner.html
http://www.fkimura.com/qmail0.html
関係する情報
http://www.i-ml.jp/cgi-bin/bbs/memo.cgi?m=e
http://moin.qmail.jp/
http://www.planet-green.com/linux/qmail.html
2005/03/15(火)qmail-scanner (clamav インストール編)
2005/03/15 11:00
~clamavインストール編~
今回長いのとトラブル頻出したので、インストール記事3ステップとトラブル記事に分けて書く。
[1]インストール
debianのtestingでも問題が出たので、unstableを入れた。Versionは0.83-3
# apt-get clamav/unstable動作確認。
# ps -e | grep clam 19213 ? 00:00:00 freshclam 24801 ? 00:00:03 clamdウイルス定義ファイル更新daemonのfreshclamとスキャン用のclamdが動いている。clamdはdaemonで動いているが、別にリアルタイムブロックしてくれるわけではない(はず)。daemonで動いているのは単に定義ファイルの読み込みが1回ですむからという理由のようだ。詳しくは[参考サイト]を見るといい。
[2]user権限変更
必ず必要なのが以下2点。他は設定しなくても大丈夫そうだ。
(1)clamdはqmail-scanner用のユーザqscandで動かす。
/etc/clamav/clamd.conf
User clamavを
User qscandに変更。
再起動
# /etc/init.d/clamav-daemon restart(2)clamdがtmpやソケットを作れなくなってしまうので、パーミッションを弄る。
# chgrp qscand /var/run/clamav # chmod 775 /var/run/clamavこのディレクトリ構造はdebianパッケージに強く依存するようなので、ソースからインストールした場合は[参考サイト]を参照した方がよい。
[3]clamのdaemon動作をチェックする
daemontoolsを使えば他のdaemonも含めて管理できるようだが、今回はシェルスクリプトとcronで定期的にプロセスが動いているかどうかを監視することにする。
/etc/cron.daily/check_clamを作成し、以下の内容とする。
#!/bin/sh if [ `ps -ef| grep /usr/bin/freshclam| grep -v grep| wc -l` != 1 ]; then message="freshclam stopped!" echo $message | mail -s "daemon Caution! : freshclam" urara@dt8.jp fi if [ `ps -ef| grep /usr/sbin/clamd| grep -v grep| wc -l` != 1 ]; then message="clamd stopped!" echo $message | mail -s "daemon Caution! : clamd" urara@dt8.jp fi1日おきにclamdとfreshclamが動いているかどうかを調べ、動いていなかったらメールを投げる。
ps -ef でフルパス指定しないと命名によってはこのスクリプト自体がgrepに引っかかる。grep -v grepは出力結果にgrep自体が含まれるので、"grep"が含まれているものを取り除く(反転する)。最初これを忘れていて混乱した。
なんでこんなことをするかというと、止まってすぐ分かるサービスと違って、freshclamは気づきにくくかつセキュリティへの影響が大きいから。ぶっちゃけ、一時サービスが止まってたことがあって心配なのでしばらくチェックさせたいのだ。本当はcronで書いちゃえばすむ話。
[参考サイト]
ここがわかりやすい。
http://www.asahi-net.or.jp/~aa4t-nngk/qmail5.html
clamav本家
http://clamav-jp.sourceforge.jp/jdoc/clamav.html