qmailとは
MTA(メール転送エージェント)にはsendmail、qmail、postfixなどがあります。もっともシェアがあるのはsendmailですが、
sendmailにはいくつものセキュリティーの脆弱性が発見されバージョンアップされています。その反面、
qmailは最新バージョンである1.03を維持し続けています。これはqmailがそれぞれの機能で、デーモンが分かれておりほとんどが個別の一般ユーザ
権限で動作しているためである。SUIDプログラムも一つのみである。ここからも高いセキュリティーが見て取れます。
またqmailは高速なメール配送が実現できます。
まず最初にsendmailが自動起動されていないか確認し、されている場合は停止します。
#/etc/rc.d/init.d/sendmail stop
#chkconfig --level 123456 sendmail off
chkconfigが使用できない場合は、起動ランレベルのディレクトリ内のファイル名を直接変更することで停止させます。
#cd /etc/rc.d/rc4.d
#mv S80sendmail _S80sendmail
次に専用のディレクトリおよびユーザ、グループを作成します。
#mkdir /var/qmail
#groupadd nofiles
#groupadd qmail
#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
#useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
#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
これらのユーザでログインする必要はないので"-s /bin/false"を指定します。
qmailのインストール
次にqmailおよび各種パッチをダウンロードし、解凍します。(パッチは必ず必要ではありません。)
#tar xvfz qmail-1.03.tar.gz
#cd qmail-1.03
#patch -s -p1 <../qmail-date-localtime.patch
#patch -s -p1 <../qmail-103.patch
#patch -s -p1 <../qmail-smtpd-relay-reject
#patch -s -p1 <../qmail-0.0.0.0.patch
また、glibcのバージョンが2.3.1以降の場合は次のパッチもあてます。
qmail-1.03.errno.patch
qmail-1.03.qmail_local.patch
#patch -s -p1 <../qmail-1.03.errno.patch
#patch -s -p1 <../qmail-1.03.qmail_local.patch
インストールします。
#make
#make setup check
tcpserverのインストール
次に./config-fastを実行します。(自ドメイン名を指定します。)
#cd qmail-1.03
#./config-fast cyberam.dip.jp
以下の5つのファイルが存在するか確認します。
| ファイル名 | 説明 |
| defaultdomain |
ヘッダなどにドメイン名が省略された場合に補完されるドメイン名を指定する |
| locals |
ローカル扱いされるドメイン名を指定する |
| me |
自ドメイン名(FQDN)を指定する |
| plusdomain |
ドメイン部の末尾が+の場合に補完されるドメイン名を指定する |
| rcpthosts |
メールの転送を許可するドメイン名を指定する |
管理者アカウント(MAILER-DAEMON、postmaster、root)のメールアドレスにエイリアスを付けて、
実際に管理しているアカウントにこれら管理者アカウント宛のメールが届くように設定します。
#cd /var/qmail/alias
#echo '&webmaster@cyberam.dip.jp' > .qmail-mailer-daemon
#echo '&webmaster@cyberam.dip.jp' > .qmail-postmaster
#echo '&webmaster@cyberam.dip.jp' > .qmail-root
#chmod 644 .qmail-*
以上でMAILER-DAEMON、postmaster、root宛(root@cyberam.dip.jp等)のメールはwebmaster@cyberam.dip.jp
に送られます。
次にメールボックスをmbox形式からmaildir形式に変更します。
まず、既存ユーザをmaildir形式に対応させるには
#/var/qmail/bin/maildirmake /home/ユーザ名/Maildir
#echo './Maildir/' > /home/ユーザ名/.qmail
を実行します。
また、新規にユーザを作成したときに自動でmaildir形式に対応するように
#/var/qmail/bin/maildirmake /etc/skel/Maildir
#echo './Maildir/' > /etc/skel/.qmail
を実行します。これでユーザ作成時にそのユーザのホームディレクトリにMaildirディレクトリ
が作成されます。
最後にqmail起動スクリプトをコピーし、編集します。
#cp /var/qmail/boot/home /var/qmail/rc
#vi /var/qmail/rc
下線部のように、./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
次にtcpserverを使用してqmailを起動する設定をします。
tcpserverを使用するとIPアドレスやホスト名によるアクセス制限を行うことができセキュリティが向上します。
最初にアクセス制御ファイル(cdb)を生成するためのアクセス制御情報が記述されたファイルを作成します。
ここではIPアドレスが192.168.0.1から192.168.0.10までの範囲にあるものを許可する設定とします。
#vi /etc/tcpserver
192.168.0.1-10:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
そしてアクセス制御ファイルを生成します。
# /usr/local/bin/tcprules /etc/tcpserver.cdb /etc/tcpserver.tmp < /etc/tcpserver
最後に自動起動できるようにqmailの起動スクリプトを作成します。(ファイル名はqmail)
#vi /etc/rc.d/init.d/qmail
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
start)
echo 'Starting qmail: '
csh -cf '/var/qmail/rc &'
#SMTP
tcpserver -v -u qmaild -g nofiles -x /etc/tcpserver.cdb \
0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
echo
touch /var/lock/qmail
;;
stop)
echo "Stoping 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
この起動スクリプトのパーミッションを変更します。
#chmod 755 /etc/rc.d/init.d/qmail
そして起動するランレベルにシンボリックリンクを張ります。
#cd /etc/rc.d/rc3.d/
#ln -s ../init.d/qmail ./S25qmail
そして起動確認をします。
#./S25qmail start
qmailのPOPデーモンに認証機能を付けるにはcheckpasswordをインストールします。checkpassword
は平文でパスワードをやり取りします。
checkpasswordのインストール
以上で完了です。後は先ほど作成したqmailの起動スクリプトに下線部を追加します。
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
start)
echo 'Starting qmail: '
csh -cf '/var/qmail/rc &'
#SMTP
tcpserver -v -u qmaild -g nofiles -x /etc/tcpserver.cdb \
0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
#POP
tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup サーバのドメイン名 /bin/checkpassword \
/var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &
echo
touch /var/lock/qmail
;;
stop)
echo "Stoping 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
SPAM対策としてtcpserverの送信元ドメイン名やIPアドレスによるアクセス制御は効果的だが利便性では劣る面がいくつもある。
例えばIPアドレスがDHCPで動的に割り当てられるクライアントの制御は現実的に無理である。
POP before SMTPとはその名のとおりPOP(受信処理)で認証を行った後にSMTP(送信処理)を行うことであり、
POPでユーザを認証し、そのユーザのIPアドレスをサーバ側に一定時間保持することでそのIPアドレスからのメール送信を許可します。
一定時間過ぎれば保持していたIPアドレスを消去するので、またPOPで認証するまではメール送信できません。
しかしながらPOP before SMTPにも問題点はいくつかあります。
IPマスカレードなどのアドレス変換機能によりインターネットに接続しているLANのクライアントが認証されると
そのLANのほかの認証されていないクライアントがメール送信できてしまう。(グローバルIPアドレスが同じであるため)
DHCPなどでIPアドレスが動的に割り振られている場合、POP認証された後にユーザが接続を切断し、そのユーザが使用していた
IPアドレスが別のユーザに割り振られた場合も認証されていないクライアントがメール送信できてしまう。などなど。
まずqmailでPOP before SMTPを実現するにはrelay-ctrlとdaemontoolsをインストールします。
relay-ctrlのインストール
まずrelay-ctrlをダウンロードし、解凍します。
relay-ctrl-3.1.1.tar.gz
#tar xvfz relay-ctrl-3.1.1.tar.gz
インストールします。
#cd relay-ctrl-3.1.1
#make
#./installer
daemontoolsのインストール
まず/ディレクトリに作業ディレクトリを作成する必要があります。
#mkdir -p /package
そして作成したpackageディレクトリのパーミッションを変更します。(
スティッキービットをセットします)
#chmod 1755 /package
次にdaemontoolsをダウンロードし、解凍します。
daemontools-0.76.tar.gz
#cd /package
#tar xvpfz daemontools-0.76.tar.gz
#cd admin/daemontools-0.76
また、glibcのバージョンが2.3.1以降の場合は次のパッチもあてます。
daemontools-0.76.errno.patch
#patch -s -p1 <./daemontools-0.76.errno.patch
インストールします。
#./package/install
インストールが完了したら次のことを確認してください。
1. /ディレクトリにcommand、serviceディレクトリが作成される。
commandディレクトリにはコマンドのシンボリックリンクが保存されている。
#ls -l /command
lrwxrwxrwx 1 root root 41 7月 19 18:57 envdir -> /package/admin/daemontools/command/envdir
lrwxrwxrwx 1 root root 44 7月 19 18:57 envuidgid -> /package/admin/daemontools/command/envuidgid
lrwxrwxrwx 1 root root 41 7月 19 18:57 fghack -> /package/admin/daemontools/command/fghack
lrwxrwxrwx 1 root root 43 7月 19 18:57 multilog -> /package/admin/daemontools/command/multilog
lrwxrwxrwx 1 root root 43 7月 19 18:57 pgrphack -> /package/admin/daemontools/command/pgrphack
lrwxrwxrwx 1 root root 48 7月 19 18:57 readproctitle -> /package/admin/daemontools/command/readproctitle
lrwxrwxrwx 1 root root 42 7月 19 18:57 setlock -> /package/admin/daemontools/command/setlock
lrwxrwxrwx 1 root root 44 7月 19 18:57 setuidgid -> /package/admin/daemontools/command/setuidgid
lrwxrwxrwx 1 root root 44 7月 19 18:57 softlimit -> /package/admin/daemontools/command/softlimit
lrwxrwxrwx 1 root root 44 7月 19 18:57 supervise -> /package/admin/daemontools/command/supervise
lrwxrwxrwx 1 root root 38 7月 19 18:57 svc -> /package/admin/daemontools/command/svc
lrwxrwxrwx 1 root root 39 7月 19 18:57 svok -> /package/admin/daemontools/command/svok
lrwxrwxrwx 1 root root 41 7月 19 18:57 svscan -> /package/admin/daemontools/command/svscan
lrwxrwxrwx 1 root root 45 7月 19 18:57 svscanboot -> /package/admin/daemontools/command/svscanboot
lrwxrwxrwx 1 root root 41 7月 19 18:57 svstat -> /package/admin/daemontools/command/svstat
lrwxrwxrwx 1 root root 41 7月 19 18:57 tai64n -> /package/admin/daemontools/command/tai64n
lrwxrwxrwx 1 root root 46 7月 19 18:57 tai64nlocal -> /package/admin/daemontools/command/tai64nlocal
2. /etc/inittabの最終行に下線部の一行が追加される。
#cat /etc/inittab
----------------省略----------------
SV:123456:respawn:/command/svscanboot
次に各種ディレクトリを作成します。
#mkdir -p /var/spool/relay-ctrl/allow ←IPアドレスファイルを保存するディレクトリ
#mkdir /etc/relay-ctrl ←設定ファイルを保存するディレクトリ
#chmod 700 /var/spool/relay-ctrl
#chmod 777 /var/spool/relay-ctrl/allow
設定ファイルを作成します。
RELAY_CTRL_DIRはIPアドレスが記録されたファイルが保存されるディレクトリを指定し、
RELAY_CTRL_EXPIRYではIPアドレスが記録されたファイルの保持時間(秒)を指定します。
#cd /etc/relay-ctrl
#echo '/var/spool/relay-ctrl/allow' > RELAY_CTRL_DIR
#echo '120' > RELAY_CTRL_EXPIRY
そしてRELAY_CTRL_EXPIRYで指定した保持時間を超えている場合に、
RELAY_CTRL_DIRで指定したディレクトリ内のIPアドレスが記録されたファイルを削除するコマンドをcronに登録します。
#crontab -e
*/2 * * * * /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
以上で完了です。起動スクリプトの引数startの処理を下記のように編集します。
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
start)
echo "Starting qmail: "
csh -cf '/var/qmail/rc &'
#SMTP
envdir /etc/relay-ctrl relay-ctrl-chdir \
tcpserver -v -u qmaild -g nofiles 0 smtp \
relay-ctrl-check /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
#POP3
envdir /etc/relay-ctrl relay-ctrl-chdir \
tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup サーバのドメイン名 /bin/checkpassword \
relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &
echo
touch /var/lock/qmail
;;
stop)
echo "Stoping 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