このエントリーをはてなブックマークに追加

qmailとは

sendmailは頻繁にセキュリティーホールが発見され、都度パッチが公開されて・・の繰り返しであったため、それとは全く別の、シンプルで安全なメールサーバーが開発されました。それがqmailです。

qmailとsendmailどっちを使うか?

qmailはsendmailの使うSMTPポートを使います。SMTPはサーバー同士でメールをやりとりするのに25番ポートを使うという決まりがあります。(※端末からサーバーへはsubmissionポートを使う場合もありますが)

なので、qmailで25番ポートを待ち受けるのであれば、sendmailは止めなければなりません。ここでsendmailを使うかqmailを使うかの選択に迫られる事になります。

もともとqmailはsendmailの脆弱性が多く発見されているために、安全なメールサーバーとして開発されたものです。従って、sendmailよりも脆弱性パッチを当てる頻度は少ないと思います。qmailを選択する理由としてそれが大きな要因になっていると思います。また、sendmailの項で説明した通り、sendmailには任意のコマンドを実行されてしまう重大な脆弱性が発見されており、少なくともRedHat9~Enterprise4のCDに最初からついてくるsendmailをそのまま使うのは危険です。

しかし、qmailのバイナリを配布する際にはオリジナルと同じ配置にしなければならないという制約がありします。なので、rpm化する際に設定ファイルを/etc、ログを/var、コマンドを/usr/binというようなRedHat系標準の配置にする事ができず、RedHat9~Enterprise4にrpmとしてバイナリパッケージを収録する事ができませんでした。

なので、qmailをインストールする場合、ソースをコンパイルしてインストールする形態をとります。それらの作業は下記の通りかなり長い手作業を要します。また、sendmailも現時点の最新バージョンでは重大な脆弱性への対応はなされており、rpm -ivh --force コマンドで簡単に差し替えも可能である事から、そこまで手間をかけてqmailを入れなくても良いという声もあります。

それらをふまえた上でqmailを選択されるのであれば、以下の節へ進んでください。

sendmailとqpopperを止める

qmailを選択した方は、sendmailとの併用はできませんので停止させます。

・sendmailの停止
/etc/rc.d/init.d/sendmail stop
chkconfig sendmail off

・qpopperの停止
pop3もqmail-popup+checkpasswordを使いますので、qpopperは停止させます。(qpopperを使う事もできますが、ここではその方法は説明しません)
vi /etc/xinetd.d/popper
service pop3 { disable = yes ←yesに変更 socket_type = stream wait = no user = root server = /usr/local/etc/popper server_args = -t /var/log/pop3.log }
/etc/rc.d/init.d/xinetd restart

ソースコードの用意

ソースコード一式と必要なパッチを入手します。ファイル名でググると見つかると思いますので、それをサーバーにアップロードします。

qmail-1.03.tar.gz
qmail-date-localtime.patch
qmail-glibc.patch
checkpassword-0.90.tar.gz
checkpassword-glibc.patch
ucspi-tcp-0.88.tar.gz
ucspi-tcp-glibc.patch

***-glibc.patchは、新しいglibcを使うためのパッチです。

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

・qmailの格納ディレクトリを作ります。
mkdir /var/qmail

・qmailの動作に必要なユーザーとグループを追加
groupadd nofiles
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
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

・コンパイル&インストール
tar xvzf qmail-1.03.tar.gz
cd qmail-1.03
patch -s -p1 < ../qmail-date-localtime.patch  (メール受信時間をローカルタイムにする)
patch -s < ../qmail-glibc.patch (glibc用のパッチを当てる)
make
make man
make setup check

ドメインの設定
./config-fast フルドメイン名
cp /var/qmail/boot/home /var/qmail/rc

・ユーザーを追加した時にqmail方式のメールボックスを作る
/var/qmail/bin/maildirmake /etc/skel/Maildir
echo ./Maildir/ > /etc/skel/.qmail

・既存のユーザーがqmail方式のメールボックスを使う
/var/qmail/bin/maildirmake /home/アカウント/Maildir
echo ./Maildir/ >> /home/アカウント/.qmail
この後、chownコマンドでMaildirと.qmailのオーナーを該当アカウントに変更しておきます。

・管理者宛メールアドレス
sendmailでいうところの/etc/aliasesです。/var/qmail/alias/.qmail-(アカウント)このファイルの中身を、&(アドレス)とすると、(アカウント)@ドメイン宛のメールが(アドレス)に配信されます。例えば、postmaster宛のメールを転送させたい時は、

vi /var/qmail/alias/.qmail-postmaster
&(postmaster宛のメールを転送するアドレス)
のようにします。同様に、ルート宛メールの転送先は/var/qmail/alias/.qmail-rootで設定します。

・ucspi-tcpのインストール
tar xvzf ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88
patch -s <../ucspi-tcp-glibc.patch (glibc用のパッチを当てる)
make
make setup check

・tcprules.txtを編集
sendmailでいうところの/etc/mail/accessです。Windows端末側のIPが固定IPであれば、メールの送信を許可するIPに記述しておけば、そこからのメールの転送は受付るようになります。
vi /var/qmail/control/tcprules.txt
127.0.0.1:allow,RELAYCLIENT="" (メールの送信を許可するIP):allow,RELAYCLIENT="" :allow
cd /var/qmail/control
tcprules tcprules.dat tcprules.tmp < tcprules.txt

・checkpasswordをインストール
qmail方式のメールボックスからメールを取り出すためのPOPサーバーをインストールします。
tar xvfz checkpassword-0.90.tar.gz
cd checkpassword-0.90
patch -s < ../checkpassword-glibc.patch (glibc用のパッチを当てる)
make
make setup check

・/usr/sbin/sendmailが呼ばれた時にqmailを起動する
メール送信に使うCGIは、大抵は/usr/sbin/sendmailコマンドを直接呼ぶと思います。標準ではsendmailのsendmail(sendmail.sendmail)へのシンボリックリンクになっていると思います。そこで、/usr/sbin/sendmailコマンドが呼ばれた場合に、qmailのsendmailコマンドが呼ばれるようにシンボリックリンクを張り替えます。
mv /usr/sbin/sendmail /usr/sbin/sendmail-old
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
この後、「やっぱりqmailをやめたい」という場合は、/var/qmail/bin/sendmailへのシンボリックリンクを削除した後、sendmail-oldをsendmailに戻します。

・起動スクリプト
vi /var/qmail/bin/qmailstart
#!/usr/bin/perl system("csh -cf '/var/qmail/rc &'"); system("/usr/local/bin/tcpserver -u qmaild -g nofiles -x /var/qmail/control/tcprules.dat0 25 /var/qmail/bin/qmail-smtpd &"); system("/usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup ドメイン名 /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir& ");
chmod 755 /var/qmail/bin/qmailstart
・停止スクリプト
vi /var/qmail/bin/qmailstop
#!/usr/bin/perl

open(IN, "ps ax|");
@process=();
$cnt=0;
while (<IN>) {
    	if (/\s*(\d+)\s.*(qmail-send)/) {
        			$process[$cnt++]=$1;
    	}
    	if (/\s*(\d+)\s.*(splogger)/) {
        			$process[$cnt++]=$1;
    	}
    	if (/\s*(\d+)\s.*(qmail-lspawn)/) {
        			$process[$cnt++]=$1;
    	}
    	if (/\s*(\d+)\s.*(qmail-rspawn)/) {
        			$process[$cnt++]=$1;
    	}
    	if (/\s*(\d+)\s.*(qmail-clean)/) {
        			$process[$cnt++]=$1;
    	}
    	if (/\s*(\d+)\s.*(tcpserver -u qmaild)/) {
        			$process[$cnt++]=$1;
    	}
    	if (/\s*(\d+)\s.*(tcpserver 0 110)/) {
        			$process[$cnt++]=$1;
    	}
}
close(IN);
$cntmax = $cnt;

for ($cnt=0;$cnt<$cntmax;$cnt++){
    	system("kill -KILL $process[$cnt] > /dev/null 2>&1 ");
}
chmod 755 /var/qmail/bin/qmailstop

設定ファイル

・/var/qmail/control/locals
メールが自分宛であると認識するドメインを入れます。sendmailでいうところの/etc/mail/local-host-namesです。ここに書いてあるドメイン宛のメールは、他方へのリレーではなく自分が受け取る事になります。

・/var/qmail/control/rcpthosts
メールのリレーを許可するドメインを書きます。sendmailでいうところの/etc/mail/accessです。リレーを許可するだけでなく、自サーバーで受け取るドメインは、rcphostsに書いておかないと、送信者に拒絶した旨のエラーメール(553 sorry, that domain isn't in my list of allowed rcpthosts )が返ります。

・/var/qmail/control/virtualdomains
バーチャルドメインを記述します。以下、testuser1は適切に読み替えてください。

例)
www2.aufheben.net:testuser1

ここに記載されたドメイン宛のメールはバーチャルドメインとして指定のユーザー(ここではtestuser1)に振り分けられます。このドメイン宛のメールを処理するユーザーのホームディレクトリ内の.qmailファイルで振り分け先を指定します。

/home/testuser1/.qmail-(ユーザー名)
というファイルを作り、中身に&に続いて転送先を指定します。
&(転送先アドレス)
・qmailの起動
設定が終わったら、qmailをスタートします。
/etc/rc.d/init.d/qmail start
・サーバー起動時に起動させる
vi /etc/rc.d/init.d/qmail
chmod 755 qmail
chkconfig qmail on

チューニング

・メッセージがキューにとどまる期間を変更
vi /var/qmail/control/queuelifetime
259200
3日の場合
・POP before SMTP機能の追加
pbs4q-0.2.1.tar.gzをサーバーにアップします。
tar xvzf pbs4q-0.2.1.tar.gz
cd pbs4q-0.2.1
make
make install
chown -R qmaild.nofiles /var/pbs4q

起動時に pbs4qが動作するように、起動スクリプトを修正します。
vi /var/qmail/bin/qmailstart
#!/usr/bin/perl system("csh -cf '/var/qmail/rc &'"); system("/usr/local/bin/tcpserver -RH -u qmaild -g nofiles -x /var/qmail/control/tcprules.dat 0 25 /usr/local/bin/pbs4q2_smtp /var/qmail/bin/qmail-smtpd &"); system("/usr/local/bin/tcpserver -RH 0 110 /var/qmail/bin/qmail-popup ドメイン名 /bin/checkpassword /usr/local/bin/pbs4q1 /var/qmail/bin/qmail-pop3d Maildir &");
停止スクリプトも修正します。
#!/usr/bin/perl

open(IN, "ps ax|");
@process=();
$cnt=0;
while (<IN>) {
        if (/\s*(\d+)\s.*(qmail-send)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(splogger)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(qmail-lspawn)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(qmail-rspawn)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(qmail-clean)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(tcpserver -RH -u qmaild -g nofiles -x)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(tcpserver -RH 0 110)/) {
                        $process[$cnt++]=$1;
        }
}
close(IN);
$cntmax = $cnt;

for ($cnt=0;$cnt<$cntmax;$cnt++){
        system("kill -KILL $process[$cnt] > /dev/null 2>&1 ");
}
・クロンで、1時間毎にPOP BEFOREの履歴を初期化します
vi /etc/cron.hourly/pbs4qclean_su
/usr/local/bin/pbs4qclean_su
※/usr/local/bin/pbs4qclean_suへのシンボリックリンクを張るだけでも良いです。

vpopmail qmailadmin

・ソースの入手
http://sourceforge.net/project/showfiles.php?group_id=85937
から、vpopmail-5.4.17.tar.gzを入手して、サーバーにアップします。

・コンパイル&インストール
useradd vpopmail
tar cvzf vpopmail-5.4.17.tar.gz
./configure \
--enable-roaming-users=y \
--enable-clear-passwd=n \
--enable-tcpserver-file=~vpopmail/etc/tcp.smtp \
--enable-relay-clear-minuts=20 \
--enable-default-domain=ドメイン
make
make install

ここで、--enable-tcpserver-file=~vpopmail/etc/tcp.smtp は、もともとの送信を許可するルールです。ここからコピーされ、tcp.smtp.cdbというPOPbeforeSMTPに対応したルールファイルが作成されます。

・crontabの設定
POP before SMTPのクリアを定期的に行います。
0 * * * * /usr/local/vpopmail/bin/clearopensmtp 2>&1 1>/dev/null

また、vpopmailを使う場合、pbs4qは併用しないのでCRONのタスクを削除します。
rm /etc/cron.hourly/pbs4qclean_su

・起動スクリプト、終了スクリプトの修正
起動時にvpopmailが起動するように修正します。また、587番ポートからも送れるようにします。

vi /var/qmail/bin/qmailstart.pl
#!/usr/bin/perl
system("csh -cf '/var/qmail/rc &'");
system("/usr/local/bin/tcpserver -RH -l ドメイン名 -u qmaild -g nofiles -x /usr/local/vpopmail/etc/tcp.smtp.cdb 0 25 /var/qmail/bin/qmail-smtpd &");
system("/usr/local/bin/tcpserver -RH -l ドメイン名 -u qmaild -g nofiles -x /usr/local/vpopmail/etc/tcp.smtp.cdb 0 587 /var/qmail/bin/qmail-smtpd &");
system("/usr/local/bin/tcpserver -RH -l ドメイン名 -x /usr/local/vpopmail/etc/tcp.pop3.cdb 0 110 /var/qmail/bin/qmail-popup (ドメイン名) /usr/local/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir &");
vi /var/qmail/bin/qmailstop.pl
#!/usr/bin/perl

open(IN, "ps ax|");
@process=();
$cnt=0;
while (<IN>) {
        if (/\s*(\d+)\s.*(qmail-send)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(splogger)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(qmail-lspawn)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(qmail-rspawn)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(qmail-clean)/) {
                        $process[$cnt++]=$1;
        }
        if (/\s*(\d+)\s.*(tcpserver -RH -l ドメイン名)/) {
                        $process[$cnt++]=$1;
        }
}
close(IN);
$cntmax = $cnt;

for ($cnt=0;$cnt<$cntmax;$cnt++){
        system("kill -KILL $process[$cnt] > /dev/null 2>&1 ");
}
・デフォルトでリレーを許可するIPの設定
管理者やサーバー所有者の端末が固定IPの場合、POP before制約なしにリレーを許可できるようにします。ここで(許可IP)は、端末のIPと読み替えてください。
vi /usr/local/vpopmail/etc/tcp.smtp
(許可IP):allow,RELAYCLIENT="" 127.:allow,RELAYCLIENT="" :allow
DBを再構築
cd /usr/local/vpopmail/etc
/usr/local/bin/tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp

・POPを許可するIPを設定
POPはIPに関係なくできるようにします。
:allow,ALLOWPLAIN=""
DBを再構築
/usr/local/bin/tcprules tcp.pop3.cdb tcp.pop3.tmp < tcp.pop3

・宛先不明メールを削除する
最近多いのが、英単語総当り@ドメイン名でメールをバラまいてくるSPAMメールです。そうやって存在するアドレスを探っているようですが、qmailではいったんキューにためてから送信者に返信しようとしますので、キューがパンクしてしまいます。なので、宛先不明メールはキューにためずに削除するようにします。

vi /home/vpopmail/domains/ドメイン名/.qmail-default
| /home/vpopmail/bin/vdelivermail '' delete
・オートレスポンダーのインストール
autorespond-2.0.5.tar.gzをGoogle等で探してきて、サーバーにアップします。
tar zxvf autorespond-2.0.5.tar.gz
cd autorespond-2.0.5
make
install -o root -g wheel -m 0555 -s autorespond /usr/local/bin

・メーリングリスト(ezmlm)のインストール
ezmlm-0.53.tar.gzをGoogle等で探してきて、サーバーにアップします。
tar zxvf ezmlm-0.53.tar.gz
cd ezmlm-0.53
echo /usr/local/bin > conf-home
make
make man
make install

・qmailadminのインストール
qmailadmin-1.2.9.tar.gzをGoogle等で探してきて、サーバーにアップします。
tar zxvf qmailadmin-1.2.29.tar.gz
./configure \
--enable-htmldir=(コントロールパネルのホームディレクトリの絶対パス)
--enable-imagedir=(画像ファイル置き場の、絶対パス)
--enable-imageurl=(画像ファイル置き場の、ブラウザから見た絶対パス)
--with-htmllibdir=/usr/local/share \
--enable-cgibindir=(cgi-binへの絶対パス)
--enable-cgipath=/(ブラウザから見た絶対パス)/qmailadmin \
--enable-ezmlm-mysql=n(メーリングリストにmysqlを使うかどうか)

make
su
make install

コントロールパネルにアクセスしてみます。
http://(ドメイン)/(enable-htmldirで指定したパスへのURL場所)/

・ドメインの作成
/usr/local/vpopmail/bin/vadddomain ドメイン名
ここでpostmasterのパスワードを聞いてくるので2回入力します。
postmasterのパスワードを変更する時は、
/usr/local/vpopmail/bin/vpasswd postmaster@ドメイン名
で変更できます。

・qmailの再起動
設定が終わったら再起動します。
/etc/rc.d/init.d/qmail restart

qmHandleのインストール

sendmailのキューは、/var/spool/mqueueにたまりますので、ここにたまりすぎたメールは、rmコマンドや、xargs とrmコマンドで削除することと思います。qmailのキューは専用のqmHandleというソフトで削除する事ができます。

qmhandle-1.2.0.tar.gzをGoogle等で探してきて、サーバーにアップします。
tar xvzf qmhandle-1.2.0.tar.gz
で解凍するだけです。

キューの削除は、/解凍したディレクトリ/qmHandle -Dでできます。
このページの先頭へ
  広告