qmailでPOP before SMTP + ウイルスチェック

#このエントリーは最新のqmail等には対応していません。2007.02.12

前にabsoluterightでも書いたことがあるんだけど、最新の状況を踏まえた上で手順をまとめなおしました。qmailでPOP before SMTPとH+BEDV社のAntiVir for Linuxを使ってウイルスチェックをするメールサーバの構築手順です。

なお以下の説明の前提として、Red Hat Linux Professional Workstation 3とFedora Core 1のつぎはぎシステム(笑)がインストールされているものとします。

qmailのインストール

qmail本体とqmail-date-localtime.patch、及びqmailqueue-patchをダウンロードします。

$ wget ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz
$ wget ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
$ wget http://www.qmail.org/qmailqueue-patch

展開してパッチを適用後、ソースを修正

$ tar zxvf qmail-1.03.tar.gz
$ cd qmail-1.03
$ patch -p1 < ../qmail-date-localtime.patch
$ patch < ../qmailqueue-patch

error.hの4行目”extern int errno;”を”#include <errno.h>”に修正

#ifndef ERROR_H
#define ERROR_H

extern int errno;

extern int error_intr;
extern int error_nomem;

error.hの4行目”extern int errno;”を”#include <errno.h>”に修正

#ifndef ERROR_H
#define ERROR_H

#include <errno.h>

extern int error_intr;
extern int error_nomem;

インストール先・ユーザ・グループを作成します。qmailはいくつかのプログラムの集まりなので、それぞれの実行ユーザを作ります。

$ mkdir /var/qmail
$ groupadd nofiles
$ useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
$ useradd -g nofiles -d /var/qmail -s /bin/false qmaild
$ useradd -g nofiles -d /var/qmail -s /bin/false qmaill
$ useradd -g nofiles -d /var/qmail -s /bin/false qmailp
$ groupadd qmail
$ useradd -g qmail -d /var/qmail -s /bin/false qmailq
$ useradd -g qmail -d /var/qmail -s /bin/false qmailr
$ useradd -g qmail -d /var/qmail -s /bin/false qmails

インストール

$ make setup
$ make check
$ ./config

コントロールファイルを編集します。/var/qmail/control/以下に作られる以下のファイルを編集します。
defaultdomain:自動的に補完されるドメイン名
locals:受信するホスト名・ドメイン名、qmail-sendが利用
rcpthosts:受信するホスト名・ドメイン名、qmail-smtpdが利用
me:ホストのFQDN
plusdomain:ドメイン部が+で終わっている場合に補完されるドメイン、qmail-injectが利用

postmasterなどのアカウントに対する配信設定をします。

$ cd /var/qmail/alias/
$ touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
$ chmod 644 .qmail*

動作確認をします。

$ cp /var/qmail/boot/home /var/qmail/rc
$ /var/qmail/rc &

ps -def | grep qmailすると

qmails   20318 21602  0 16:18 pts/0    00:00:00 qmail-send
qmaill   20319 20318  0 16:18 pts/0    00:00:00 splogger qmail
root     20320 20318  0 16:18 pts/0    00:00:00 qmail-lspawn ./Mailbox
qmailr   20321 20318  0 16:18 pts/0    00:00:00 qmail-rspawn
qmailq   20322 20318  0 16:18 pts/0    00:00:00 qmail-clean
root     20330 21602  0 16:21 pts/0    00:00:00 grep qmail

qmailが起動していることが確認できる。

$ echo to: root | /var/qmail/bin/qmail-inject
$ cat /var/qmail/alias/Mailbox

で届いていることを確認。

Maildir形式に移行します。/var/qmail/rcを開いて、

#!/bin/sh

# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Mailbox splogger qmail

MailboxをMaildirに直す。

#!/bin/sh

# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/ splogger qmail

Maildirディレクトリを手動で作るには

$ /var/qmail/bin/maildirmake ~alias/Maildir
$ chown -R alias /var/qmail/alias/Maildir

新規ユーザのhomeディレクトリに追加されるようにするには、

/var/qmail/bin/maildirmake /etc/skel/Maildir

しておけば、useraddコマンドで自動的に作成される。
qmailを一度停止して再起動後、psコマンドで停止していることを確認し、再起動。

$ ps -def | grep qmail-lspawn
root     20575 20573  0 00:04 ?        00:00:00 qmail-lspawn ./Maildir/
root      9212  8906  0 16:20 pts/1    00:00:00 grep qmail-lspawn
$ echo to: root | /var/qmail/bin/qmail-inject

Maildirになっていることを確認して、配送テスト。/var/qmail/alias/Maildir/newに配送されていればオッケー。

tcpserverのインストール

ソースをダウンロード、展開

$ wget ftp://ftp.jp.qmail.org/qmail/ucspi-tcp-0.88.tar.gz
$ tar zxvf ucspi-tcp-0.88.tar.gz 
$ cd ucspi-tcp-0.88

qmailと同様、error.hの4行目”extern int errno;”を”#include <errno.h>”に修正

コンパイル、インストール

# sudo make setup check

tcpserverを設定します。cdbの元になるファイルを作る。/etc/tcp.smtpをviで新規に作り、

192.168.0.0-255:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

とする。次にtcprulesコマンドでcdbファイルを作成する。

$ tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

checkpasswordのインストール

ソースをダウンロード、展開

$ wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
$ tar zxvf checkpassword-0.90.tar.gz
$ cd checkpassword-0.90

qmailと同様、error.hの4行目”extern int errno;”を”#include <errno.h>”に修正

インストール先を変更します。conf-homeの1行目を”/usr/local”に修正。

/usr/local

This is the checkpassword home directory. The checkpassword program will
be installed in the bin subdirectory.

コンパイル、インストール

$ make
$ sudo make setup check

daemontoolsのインストール

インストール前の準備をします。流量がそれほど多くないことを考慮してロギングはsyslogを用いたままとします。relay-ctrlがdaemontoolに含まれるreformimeを用いるためのインストールです。

$ mkdir -p /package
$ chmod 1755 /package
$ cd /package

ソースをダウンロード、展開

$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
$ tar zxvf daemontools-0.76.tar.gz
$ cd admin/daemontools-0.76/src

qmailと同様、error.hの6行目”extern int errno;”を”#include <errno.h>”に修正

コンパイル、インストール

$ cd ../
$ sudo ./package/install

動作確認

$ ps -def | grep svscan
root     22755     1  0 17:37 ?        00:00:00 /bin/sh /command/svscanboot
root     22757 22755  0 17:37 ?        00:00:00 svscan /service
root     22763 21150  0 17:38 pts/1    00:00:00 grep svscan

daemontoolsの日付処理を確認

$ cd /command/
$ date | ./tai64n | ./tai64nlocal
2003-11-09 17:39:31.115209500 2003年 11月  9日 日曜日 17:39:31 JST
$ date | sh -c './multilog t e 2>&1' | ./tai64nlocal
2003-11-09 17:40:56.122149500 2003年 11月  9日 日曜日 17:40:56 JST

実行結果の日付が左右(UnixTime表記と日本語表記)が一緒になっていればオッケー。

relay-ctrlのインストール

rpmパッケージを取得、インストール

$ wget http://untroubled.org/relay-ctrl/rh7/relay-ctrl-3.1.1-1.i386.rpm
$ sudo rpm -Uvh relay-ctrl-3.1.1-1.i386.rpm

AntiVirのインストール

AntiVirのダウンロード、展開

$ wget http://www.antivir.de/dateien/antivir/release/avlxsrv.tgz
$ tar zxvf avlxsrv.tgz 
$ cd antivir-server-2.0.8/

インストール

$ sudo ./install
Starting AntiVir for UNIX Server 2.0.8 installation...
 
1) installing command line scanner
creating install directory /usr/lib/AntiVir ... done
checking for existing /etc/antivir.conf ... not found
copying bin/antivir to /usr/lib/AntiVir ... done
copying bin/antivir-fc to /usr/lib/AntiVir ... done
copying vdf/antivir.vdf to /usr/lib/AntiVir ... done
copying conf/antivir.conf to /etc ... done
copying sh/configantivir to /usr/lib/AntiVir ... done
 
Would you like to create a link in /usr/bin ? [y] リンクを作るか、yesなので[Enter]
linking /usr/bin/antivir to /usr/lib/AntiVir/antivir ... done
installation of command line scanner complete
 
 
2) installing automatic internet updater
An automatic internet updater is available with version 2.0.8 of
AntiVir for UNIX. This is a daemon that will run in the background
and automatically check for updates (internet access is required).
You may also manually check for updates using:
 
     antivir --update
 
You do not need to install the automatic internet updater in order
to manually check for updates. Please read the README file for more
information on updates and how they can best suit you.
 
Would you like to install the automatic internet updater? [n] ネット経由でアップデートする、[y]
copying sh/avupdater to /usr/lib/AntiVir ... done
 
Would you like the automatic updater to start automatically? [y] 更新プログラムを自動起動する、yesなので[Enter]
identifying startup script location ... found (/etc/)
linking /etc/rc(LEVEL).d/(S/K)20avupdater to /usr/lib/AntiVir/avupdater ... 
runlevel 0 ... done
runlevel 1 ... done
runlevel 2 ... done
runlevel 3 ... done
runlevel 4 ... done
runlevel 5 ... done
runlevel 6 ... done
installation of automatic internet updater complete
 
 
3) installing AvGuard
Version 2.0.8 of AntiVir for UNIX is capable of on-access,
real-time scanning of files. This provides the ultimate protection
against viruses and other unwanted software. The on-access scanner
(called AvGuard) is based on Dazuko, a free software project providing
access control. In order to use AvGuard you will need to compile Dazuko
for your kernel. Please refer to src/HOWTO-Dazuko for information on how
to do this. There are several ways in which you can install AvGuard.
 
        module     - Dazuko has been compiled as a kernel module
 
        kernel     - Dazuko has been compiled into the Linux kernel
 
        no install - do not install AvGuard at this time
 
Note: Dazuko currently only works with GNU/Linux systems. If you are
      interested in helping us port Dazuko to FreeBSD and OpenBSD,
      feel free to check out the Dazuko Project at: http://dazuko.org
 
available options: m k n
 
How should AvGuard be installed? [n] AvGuardをインストールするかどうか、noなので[Enter]
AvGuard will NOT be installed. See src/HOWTO-Dazuko for more
information about Dazuko.
 
 
4) configuring AntiVir
Would you like to configure AntiVir now? [y] AntiVirを設定する、yesなので[Enter]
AutoUpdateEvery2Hours/AutoUpdateDaily                           (1 of 5)
=====================================
AntiVir is equipped with an Automatic Internet Updater. At specified
intervals, AntiVir will connect to an updater server to check for newer
versions of the AntiVir engine or the data files. If a newer
version is available, AntiVir will automatically download and install
the updates without requiring any special attention. This allows AntiVir
to be kept current against attacks and problems.
 
AntiVir can be configured to check for updates every 2 hours (2) or
once a day (d). You can also choose to have the Automatic Internet
Updater never check (n).
 
available options: 2 d n
 
How often should AntiVir check for updates? [n] 2時間毎に更新する、[2]
EmailTo                                                         (2 of 5)
=======
You may set AntiVir to send out an email message every time a concerning
file is accessed. The message will also list the action that was taken
to handle the file.
 
available options: y n
 
Would you like email notification of alerts? [n] ファイルがアクセスされた時に通知する、noなので[Enter]
LogTo                                                           (3 of 5)
=====
In addition to logging concerning activity through syslog, you may
als specify your own log file. This can make it simpler to review
past concerning activity without having to sift through syslog files.
 
available options: y n
 
Would you like AntiVir to log to a custom file? [n] syslog以外のロギング、noなので[Enter]
HTTPProxyServer/HTTPProxyPort                                 (4 of 5)
=============================
If this machine is sitting behind an HTTP proxy server, you will need to
configure AntiVir with the appropriate proxy settings.  Internet access
is required in order to make updates.
 
available options: y n
 
Does this machine use an HTTP proxy server? [n] httpプロキシの有無、noなので[Enter]
SyslogFacility/SyslogPriority                                 (5 of 5)
=============================
Regardless of the other configuration options, AntiVir will always log
important information using syslog. Syslog uses two values to classify
the information to log: facility and priority. Facility specifies the
type of program making the log entry. Priority specifies the importance
of the log entry.
 
If you are unfamiliar with syslog then you may simply accept the default
values. However, it is encouraged that you learn about syslog since it
is used by many services to log important events.
 
available FACILITIES: authpriv cron daemon kern lpr mail news syslog user uucp
                      local0 local1 local2 local3 local4 local5 local6 local7
 
Which syslog FACILITY should AntiVir use? [user] syslogファシリティ、userなので[Enter]
 
 
available PRIORITIES: emerg alert crit err warning notice info debug
 
Which syslog PRIORITY should AntiVir use? [notice] syslogプライオリティ、noticeなので[Enter]
AntiVir Configuration
=====================
Here are the configuration settings you have specified. Look them over
to make sure they are correct.
 
email notification:           no
specific logfile:             no
update frequency:             every 2 hours (if avupdater is running)
syslog output:                user.notice
 
available options: y n
 
Save configuration settings? [y] 設定が問題なければ、[Enter]
 
saving configuration to /etc/antivir.conf ... done
Configuration Complete
======================
 
email notification:           no
specific logfile:             no
update frequency:             every 2 hours (if avupdater is running)
syslog output:                user.notice
 
 
Press <ENTER> to continue.[Enter]
AntiVir Status: avupdater (not running).
 
Here are some commands that you should remember...
 
AntiVir
=======
configure:  /usr/lib/AntiVir/configantivir
 
Automatic Internet Updater
==========================
start:      /usr/lib/AntiVir/avupdater start
stop:       /usr/lib/AntiVir/avupdater stop
check:      /usr/lib/AntiVir/avupdater status
 
Press <ENTER> to continue.[Enter]
 
 
Installation of the following features complete:
     AntiVir command line scanner 
     AntiVir Automatic Internet Updater 
 
 
If you have any license key files, please copy them to /usr/lib/AntiVir
before running the software. Without a valid license key, it will
run in DEMO mode.
 
Be sure to read the README file for additional information.
Thank you for your interest in AntiVir for UNIX.

フォームに必要事項を記入すると、メールでライセンスファイル(hbedv.key)が送られてくるので、そのファイルを/usr/lib/AntiVir/にコピーする。

maildropのインストール

ソースのダウンロード、展開、コンパイル、インストール

$ wget http://download.sourceforge.net/courier/maildrop-1.6.3.tar.bz2
$ tar jxvf maildrop-1.6.3.tar.bz2
$ cd maildrop-1.6.3
$ ./configure
$ make
$ sudo make install

Time::HiResモジュールのインストール

Enterprise Linux 3にperl-Time-HiResパッケージが含まれているので、それをインストールする。

$ sudo rpm -Uvh perl-Time-HiRes-1.38-3.i386.rpm

perl-suidperlのインストール

パッケージの取得、インストール

$ wget ftp://jpix.ftp.ne.jp/00/redhat/linux/updates/9/en/os/i386/perl-suidperl-5.8.0-88.3.i386.rpm
$ sudo rpm -Uvh perl-suidperl-5.8.0-88.3.i386.rpm

qmail-scannerのインストール

ソースを取得、展開します。sourceforgeのサーバから一番手近なホストを選択することになります。

$ wget http://keihanna.dl.sourceforge.net/sourceforge/qmail-scanner/qmail-scanner-1.20rc4.tgz
$ tar zxvf qmail-scanner-1.20rc4.tgz 
$ cd qmail-scanner-1.20rc4

ユーザアカウントを作成

$ groupadd qscand
$ useradd -c "Qmail-Scanner Account" -g qscand  -s /bin/false qscand

インストール

./configure --install
Building Qmail-Scanner 1.20rc4...


                ***** NOTE ******

Qmail-Scanner doesn't have language translations for ja_JP.eucJP, 
- so defaulting to english...

[Hit <RETURN> to continue][Enter]



This script will search your system for the virus scanners it knows
about, and will ensure that all external programs
qmail-scanner-queue.pl uses are explicitly pathed for performance
reasons.

Continue? ([Y]/N)[Enter]



/usr/bin/uudecode works as expected on system...



The following binaries and scanners were found on your system:

mimeunpacker=/usr/local/bin/reformime
uudecode=/usr/bin/uudecode
unzip=/usr/bin/unzip

Content/Virus Scanners installed on your System

hbedv_antivir=/usr/bin/antivir 

Qmail-Scanner details.

log-details=0
fix-mime=1
debug=1
notify=sender,admin
redundant-scanning=no
virus-admin=root@localhost.localdomainホスト名が入る
local-domains='localhost.localdomain'ホスト名が入る
silent-viruses='klez','bugbear','hybris','yaha','braid','nimda','tanatos','sobig','winevar','palyh','fizzer','gibe','cailont','lovelorn'
scanners="hbedv_scanner"

If that looks correct, I will now generate qmail-scanner-queue.pl
for your system...
Continue? ([Y]/N) [Enter]

Testing suid nature of /usr/bin/suidperl...
Looks OK...
Hit RETURN to create initial directory structure under /var/spool/qmailscan,
and install qmail-scanner-queue.pl under /var/qmail/bin: 
perlscanner: generate new DB file from /var/spool/qmailscan/quarantine-attachments.txt
perlscanner: total of 9 entries.

Finished installation of initial directory structure for Qmail-Scanner
under /var/spool/qmailscan and qmail-scanner-queue.pl under /var/qmail/bin.

Finished. Please read README(.html) and then go over the script
(/var/qmail/bin/qmail-scanner-queue.pl) to check paths/etc. 

"/var/qmail/bin/qmail-scanner-queue.pl -r" should return some well-known virus
definitions to show that the internal perlscanner component is working.

That's it!



              ****** FINAL TEST ******

Please log into an unpriviledged account and run 
/var/qmail/bin/qmail-scanner-queue.pl -g

If you see the error "Can't do setuid", or "Permission denied", then  
refer to the FAQ.

(e.g.  "setuidgid qmaild /var/qmail/bin/qmail-scanner-queue.pl -g")


That's it! To report success:

   % (echo 'First M. Last'; cat SYSDEF)|mail jhaar-s4vstats@crom.trimble.co.nz
Replace First M. Last with your name.

起動スクリプトの作成

viで/etc/rc.d/init.d/qmailを新規に作り、

#!/bin/sh
#
# qmail     This shell script takes care of starting and stopping qmail
#
# chkconfig: 2345 99 30
# description: qmail is a Mail Transfer Agent.
# processname: qmail
#
# qmail: /var/qmail

PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
export QMAILQUEUE

[ -f /var/qmail/rc ] || exit 0

case "$1" in
  start)
        # Start daemons.
        echo "Starting qmail."
        csh -cf '/var/qmail/rc &'
        #For SMTP
        envdir /etc/relay-ctrl relay-ctrl-chdir \
        tcpserver -R -v -u [QMAILUID] -g [NOFILESGID] 0 smtp \
        /usr/bin/relay-ctrl-check \
        /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
        #For POP3
        envdir /etc/relay-ctrl relay-ctrl-chdir \
        tcpserver -R -v 0 pop3 /var/qmail/bin/qmail-popup [mail.hoge.com] /usr/local/bin/checkpassword \
        /usr/bin/relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &
        echo
        touch /var/lock/qmail
        ;;
  stop)
        # Stop daemons.
        echo "Shutting down qmail."
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ;  then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        echo
        rm -f /var/lock/qmail
        ;;
  *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac

exit 0

[QMAILUID]と[NOFILESGID]は、id qmaildすれば分かる。[mail.hoge.com]はメールサーバのFQDN。このファイルに実行権限を付け、シンボリックリンクをはる。

$ chmod 755 /etc/rc.d/init.d/qmail
$ ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc2.d/S99qmail
$ ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc3.d/S99qmail
$ ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc4.d/S99qmail
$ ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc5.d/S99qmail

まとめ

これでサーバを再起動すれば、きちんと動くはず。うまくいかない場合は、あちこち探してみる(笑)。

タイトルとURLをコピーしました