qmail-vida の インストール

最終更新日 2004年11月14日

# ここでの記述はすべて私のインストールメモであって動作を保証するものではありません
# 各自の責任のもと、挑戦してみてください(^^

qmailに脆弱性な穴が見つかりました。
/var/qmail/control/databytesに2Gbytes未満の数値を設定しておきましょう。
例 echo 1073741824 > /var/qmail/control/databytes (1Gbytes)
これではダメらしいです。パッチを待ちましょう・・・・
第3者によるパッチは出ているようですがqmailの構造上root権限をとられる危険は無いようです。

これは私がslackwareにqmail と qmail-vida をインストールしたときのめもです
debianにもインストールしてますが、パッケージを使わずにこの方法でやってます。

qmailが設定も簡単で早いしセキュリティーホールもないしとてもよいMTAだと言われていますが、結構インストールは大変なものがあります。
qmail-vidaは滝沢さんが作成した、 D. J. Bernstein氏が作成したqmailパッケージとcheckpasswordパッケージにSMTP認証とAPOP対応のPOP認証を追加し、バー チャルドメインと仮想ユーザを管理するためのプログラムを提供するパッケージです。

qmailはspam踏み台対策が良く出来ていて、そのままでは決して外部から外部への送信にsmtpが使われることがありません でも外からsmtpサーバーを使いたいときってありますよね qmail-vidaでSMTP認証ができるようになったので早速インストールしてみました。

参考サイト

http://www.jp.qmail.org/
http://qmail-vida.sourceforge.jp/
http://w3.itoh.net/
http://seclan.dll.jp/dlunix.htm

必要なソース

ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz
http://sourceforge.jp/frs/index.php?group_id=396
http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz
ftp://ftp.jp.qmail.org/qmail/ucspi-tcp-0.88.tar.gz

あると便利なパッチ

ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
http://seclan.dll.jp/msgdate.tgz
http://seclan.dll.jp/msgdom.tgz

下準備

# 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
# groupadd vida
# useradd -g vida -d /var/qmail/ -s /bin/false qmailu
# useradd -g vida -d /var/qmail/ -s /bin/false authdb
# useradd -g vida -d /home/pop/ -s /bin/bash pop

user pop は仮想メールボックスを使用するために必要です。
仮想メールボックスは pop の home directory に作成されます。

# mkdir /home/pop
# chown pop.vida /home/pop

まずは 適当な場所でソースを展開

# tar xzvf qmail-1.03.tar.gz
# tar xzvf qmail-vida-0.53.tar.gz
# tar xzvf ucspi-tcp-0.88.tar.gz
# tar xzvf checkpassword-0.90.tar.gz
# tar xzvf msgdate.tgz
# tar xzvf msgdom.tgz

qmail-vidaのパッチをあてます。

# cd qmail-vida-0.53
# make patch
# make copy

ローカルタイム表示にするパッチとMessage-IDを付加するパッチをあてました。

# patch -d qmail-1.03 < qmail-date-localtime.patch
# patch -d qmail-1.03 < qmail-1.03.msg-date.diff
# patch -d qmail-1.03 < qmail-1.03.orgdomain.diff

msg-date.diffとqmail-vidaのpatchをあてる過程でMakefileの同じ所にpatchがあたるためエラーになります。忘れず、手で直してください。

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

# cd qmail-1.03
# make setup check

# ./config
これで /var/qmail/control/****** が設定されます。

/var/qmail/control/ の locals と rcpthosts に 自分の domain を加えておきます。

DNSが設定されていない場合は
# ./config-fast domain.name とします

実在ユーザーのpasswd認証が0.50から簡単にできるようになりました。これで、既存サーバーからの移行が簡単になったと思います。
authdb/pwdusers/cdb にエントリーがあればそちらを優先し、ないときは/etc/shadow のパスワードが使われます。(平分認証のみ)
checkpasswordのコンパイルのとき、conf-withpasswd に 1 を、conf-blockuid に認証したくないUIDの上限値を書きます。
私は 100 を入れました。(デフォルトは10) あとで環境変数ALLOWPLAINを設定する必要があります。

# cd ../checkpassword-0.90
# make setup check
# cd ../ucspi-tcp-0.88
# make setup check
# cd ../qmail-vida-0.53/src/vida/
# make setup check

エリアスファイルを作ります

# cd /var/qmail/alias
# echo '&root' > .qmail-postmaster
# echo '&root' > .qmail-mailer-daemon
# echo '&root' > .qmail-www-admin
# echo '&root' > .qmail-webmaster
# echo '&root' > .qmail-admin
# echo '&root' > .qmail-info

上記すべてのメールは自分のところに送ります

# echo '&tom' > .qmail-root

起動ファイルを作ります

/var/qmail/boot/home にサンプルがあります
Mailbox形式が標準ですが、せっかくqmailを使うのですからMaildir形式にします
通常のqmail-smtpdの起動ではtcpserverで uid gid を指定しますがここでは指定してはいけません(qmail-smtpupが設定するため)。

---------/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 ./Maildir/ splogger qmail &

exec env - ALLOWPLAIN='' DOMAINOWNER='' \
/usr/local/bin/tcpserver -vHR 0 pop3 /var/qmail/bin/qmail-popup \
your.domain.name /var/qmail/bin/checkpassword \
/var/qmail/bin/qmail-pop3d Maildir \
2>&1 | /var/qmail/bin/splogger pop3d 4 &

/usr/local/bin/tcpserver -vHR -x /etc/tcp.smtp.cdb 0 smtp \
/var/qmail/bin/qmail-smtpup \
your.domain.name /var/qmail/bin/checkpassword \
/var/qmail/bin/qmail-smtpd \
2>&1 | /var/qmail/bin/splogger smtpd 4 &

tcpserverのルールファイルを作ります

平文認証を使うなら ALLOWPLAIN を指定します。

# cd /etc
# touch tcp.smtp
# chmod 600 tcp.smtp

# vi tcp.smtp

192.168.:allow,ALLOWPLAIN=""
127.:allow,RELAYCLIENT=""
:allow

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

Maildirを作ります

# su user
$ /var/qmail/bin/maildirmake $HOME/Maildir
$ echo ./Maildir/ > ~/.qmail
$ exit

新しいユーザーではそのまま/Maildirが作られるようにします

# /var/qmail/bin/maildirmake /etc/skel/Maildir
# echo ./Maildir/ > /etc/skel/.qmail

パスワードデーターベースを初期化します。

# /var/qmail/bin/vida-pwdbinit

バーチャルドメイン

バーチャルドメインを使うならcontrol/virtualdomainsも記述します

exsample.co.jp:exsample

バーチャルドメイン用のパスワードファイルを初期化しておきます。

# /var/qmail/bin/vidapwdbinit exsample

exsample.co.jpをrcpthostsに記述するのを忘れずに。 locals には書いてはいけません。

virtualdomain用のオーナーを追加しておきます。

# useradd -g vida -d /home/pop/ -s /bin/bash exsample
# mkdir /home/exsample
# chown exsample.vida /home/exsample

仮想ユーザーを登録します。

バーチャルドメインのオーナー権限になって(実在ドメインはpop) # su pop
$ /var/qmail/bin/vida-passwd -a -u foo
$ /var/qmail/bin/vida-assign -a -u foo
$ /var/qmail/bin/vida-maildirmake foo Maildir

特殊な配送制限

control/senderhosts
認証に成功したり、環境変数 RELAYCLIENT が設定されていたりして中継が許可されたときでも、このファイルがある場合は、envelope sender (MAIL FROM)がこのファイルに記述されたドメインでなければ中継を拒否します。
組織において送信者のドメインを厳しく制限したい場合などに利用します。
ただし、null sender の場合は DSN の絡みもあってこの機能は無効になります。
例)
example.org
example.net

control/badrcptto
このファイルに記述されたメールアドレス宛のメッセージの受取りを拒否します。
例)
noname@example.org
emanon@example.org

sendmailを使っている場合

sendmailを使っているならこれを止めます

# killall -HUP sendmail
してからキューをフラッシュ
# /usr/sbin/sendmail -q
# killall sendmail

その後用が無くなったsendmailの名前を変更してsやらxを削ります。
chmod 0 /usr/sbin/sendmail
mv /usr/sbin/senmail /usr/sbin/sendmail.younashi

sendmailの代わりにqmailが呼び出されるようにリンクを張っておきます。
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

sendmailからの移行なら既存のデーターをMaildirに変更する必要があります
http://www.qmail.org/mbox2maildir のスクリプトを使うと良いでしょう
これだとMaildirも一緒に作ってくれます
私の場合いちいちMAILDIRをセットするのも面倒だったのでスクリプトの中ほどの$spoolname = "$ENV{MAILDIR}"; を $spoolname = "$ENV{HOME}/Maildir"; と変更しました
それと一番最後の unlink("$ENV{MAIL}"); を削除しておいた方が元データーが消されずにベターです

# su - user
$ mbox2maildir

/etc/inetd.conf のpop3dをとめて(コメントアウト)

# killall -HUP inetd

さぁ実行しましょう

# /var/qmail/rc

/etc/rc.d/rc.inet2 あたりに起動スクリプトを書いておきます

送信実験

# echo To:user | /var/qmail/bin/qmail-inject
これで、/home/user/Maildir/newに、mailがきていることを確認します

あとは実際にMUAから送受信をして動作を確かめます(手抜き(^^;)

クライアントの設定(smtp-auth)

EdMax(windows)

アカウント設定のSMTPサーバーは認証が必要をチェック 平文もCRAM-MD5も両方使えます。

Outlook Express(Windows)

ツール-アカウントのプロパティでこのサーバーは認証が必要をチェック。セキュリティで保護されたパスワードで認証は使えません。
qmail側はALLOWPLAINを設定する。

sylpheed

APOPで受信、SMTP AUTHで送信すれば何の問題もありません

仮想ドメインの受信

qmail-vida-0.40からログインIDを変えることでバーチャルドメインのPOPができるようになりました。

例えば、foo というアカウントに対して example.org というバーチャルドメインがあり、その所有者アカウントが vpop である場合にはログインIDを
foo@example.org
あるいは
foo@vpop
にすることにより、そのログインIDが example.org のバーチャルドメインに所属することを認識します。
このとき、起動ファイルでは DOMAINOWNER を空の値に設定しておきます。(起動スクリプト /var/qmail/rc 参照)

なお、このバーチャルドメインの設定は qmail のコントロールファイルcontrol/virtualdomains の設定から読み込んで判断します。

IMAP IMAP-SSL

リアルユーザーについては標準のcourier-imap(-ssl)でできるみたい。

apt-get install courier-imap(-ssl)

tcpserver over ssl

メールの送受信を少しでも安全なようにSSLに対応してみました。
あらかじめqmailのインストールが終わっていることが前提です。

参考サイト

http://www.oucc.org/~rei/debian/sslmail.rhtml
http://www.kawaz.jp/pukiwiki/?POP%A4%C8SMTP%A4%F2SSL%B2%BD%A4%B9%A4%EB
http://www.nrg4u.com/

必要なソース

http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20020705.patch.gz

もちろんtcpserverは必要です。

証明書の作成

本来はCA局に認証してもらうのですが自己認証で済ませてしまいます。

鍵ペアの作成
openssl req -x509 -new -days 3650 -out host.pem

秘密鍵からパスフレーズを取り除く
openssl rsa -in privkey.pem -out nopass.pem

公開鍵と秘密鍵を一つにする
cat host.pem > qmail.pem
cat nopass.pem >> qmail.pem

証明書インポート用DERファイルの作成
openssl x509 -inform pem -outform der -in host.pem -out host.der
出来上がったhost.derをクライアントにインストールすればOEとかでも文句を言われずに使えます。

コンパイル

libssl-devが必要です (apt-get install libssl-dev)

gunzip ucspi-tcp-ssl-20020705.patch.gz
patch -d ucspi-tcp-0.88 < ucspi-tcp-ssl-20020705.patch
cd ucspi-tcp-0.88
make clean
make

動いているqmail、tcpserverをとめて...

make setup check

起動ファイル(rc)

exec env - ALLOWPLAIN='' DOMAINOWNER='' \
/usr/local/bin/tcpserver -vHR -s -n /path/to/qmail.pem 0 pop3s /var/qmail/bin/qmail-popup \
your.domain.name /var/qmail/bin/checkpassword \
/var/qmail/bin/qmail-pop3d Maildir \
2>&1 | /var/qmail/bin/splogger pop3d 4 &

再起動

clam anti-virus & qmail-scanner

clamav と qmail-scannerを入れてみました。

参考サイト

ClamAVのページ
Clam Antivirusに関するメモ
作業メモ
http://www.unix-power.jp/linux/qmail-scanner.html

必要なソース

http://www.qmail.org/qmailqueue-patch
http://qmail-scanner.sourceforge.net/

qmail にpatchを充ててコンパイル。

patch -d qmail-1.03 <qmailqueue-patch

clamav と maildrop が woodyのものでは動かないので backportからインストールします。
apt-lineに

deb http://www.jp.backports.org/debian stable clamav courier

# apt-get install bzip2 lzop lha unrar zoo cpio
# apt-get install clamav clamav-base clamav-daemon clamav-freshclam
# apt-get install courier-maildrop
# apt-get install libtime-hires-perl perl-suid unzip
(この辺は適当に ^^;)

qmail-scanerのユーザーを追加

# groupadd qscand
# useradd -M -g qscand -s /sbin/nologin -d /dev/null qscand

/etc/clamav/clam.conf の
User clamav を User qscand に
/var/run/clamavのownerをqscandに変更します。 これをしないとclamdが走りません。(suidを付けても良いかも。そっちが正解??)

qmail-scaner を適当なところで解凍し、rootで
# ./configure --scanners "clamdscan" --add-dscr-hdrs yes --lang ja_JP.EUC --admin root --domain exsample.net --notify admin,recips --install

/var/qmail/rc のsmtpに
QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
を追加 再起動

qmail-scanner-1.24/contrib/test_installation.sh -doit で 2つのメールと2つの隔離のメールが届けば成功です。

テストが終わったらユーザーにはレポートメールを出す必要はありませんので、また、日本語は化けますので英語モードにしちゃいます。

./configure --scanners "clamdscan" --admin root --domain exsample.net --notify admin --install

Disallowed characters found in MIME headers.

と表示されまた場合 は、/var/qmail/bin/qmail-scanner-queue.plの
my $BAD_MIME_CHECKS='2';. を
my $BAD_MIME_CHECKS='0';. としてみてください。

おまけ(postfix & amavis) 

qmail とは関係ないですが別鯖でBANNED NAMEで添付ファイルが解析できなかったので。

BANNED NAME えらーについて

参考 http://www.musicae.ath.cx/linux/debian.html

// amavisd-newの設定

# vi /etc/amavis/amavisd.conf
$mydomain = 'you.your.domain';
// spamassassinを使用するためにコメントアウト。
#@bypass_spam_checks_acl = qw( . ); # No default dependency on spamassassin
$final_virus_destiny = D_DISCARD; # (defaults to D_BOUNCE)
$final_banned_destiny = D_PASS; # (defaults to D_BOUNCE)
$final_spam_destiny = D_PASS; # (defaults to D_REJECT)
$final_bad_header_destiny = D_PASS; # (defaults to D_PASS), D_BOUNCE suggested
$warnvirusrecip = 1; # (defaults to false (undef))
$hdrfrom_notify_sender = "amavisd-new <postmaster\@$mydomain>"
$banned_filename_re = new_RE(
# qr'^UNDECIPHERABLE$', # is or contains any undecipherable components
qr'\.[^.]*\.(exe|vbs|pif|scr|bat|cmd|com|dll)$'i, # some double extensions
// これをコメントアウトしないと日本語ファイル名の添付ファイルがbanned nameとなる。
# qr'[{}]', # curly braces in names (serve as Class ID extensions - CLSID)
...
qr'^message/partial$'i, # rfc2046. this one is deadly for Outcrook
);

spam対策

spamもすごいですね。鯖に簡単に設置して弊害の少ないパッチ。

http://www.bsddiary.net/d/200407.html#27
Jul's qmail page

http://www.bsddiary.net/d/qmail-throttle.diff
http://js.hu/package/qmail/qmail-1.03-mfcheck.4.patchをあてました。
いろいろあててるのでちょっと大変かも patch -F3 位であてるとほとんどあたると思います。(後は手直ししてね^^;)

tcp.smtpをこんな風にしてTHROTTLEを設定します。

=.jp:allow,ALLOWPLAIN=""
:allow,ALLOWPLAIN="",THROTTLE="10"

このゆっくり応答は意外と効果ありますよ。

あとどうしようもないアドレス(公開しているものおよびroot,postmaster,webmasterなど)にはspamassassinで大まかに削除してます。

最後に現在の /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 ./Maildir/ splogger qmail &

exec env - ALLOWPLAIN="" DOMAINOWNER="" \
/usr/local/bin/tcpserver -v -HR -l0 0 pop3 \
/var/qmail/bin/qmail-popup mail.exsample.net \
/var/qmail/bin/checkpassword \
/var/qmail/bin/qmail-pop3d Maildir \
2>&1 | /var/qmail/bin/splogger pop3d 5 &

exec env - ALLOWPLAIN="" DOMAINOWNER="" \
QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl" \
/usr/local/bin/tcpserver -v -R -l0 -x /etc/tcp.smtp.cdb 0 smtp \
/var/qmail/bin/qmail-smtpup mail.exsample.net \
/var/qmail/bin/checkpassword \
/usr/local/bin/rblsmtpd -r relays.ordb.org -r sbl.spamhaus.org \
/var/qmail/bin/qmail-smtpd \
2>&1 | /var/qmail/bin/splogger smtpd 3 &

exec env - ALLOWPLAIN="" DOMAINOWNER="" \
/usr/local/bin/tcpserver -v -HR -l0 -s -n /var/qmail/qmail.pem 0 pop3s \
/var/qmail/bin/qmail-popup mail.exsample.net \
/var/qmail/bin/checkpassword \
/var/qmail/bin/qmail-pop3d Maildir \
2>&1 | /var/qmail/bin/splogger pop3ds 4 &

exec env - ALLOWPLAIN="" DOMAINOWNER="" \
/usr/local/bin/tcpserver -v -R -l0 -s -n /var/qmail/qmail.pem \
-x /etc/tcp.smtp.cdb 0 smtps \
/var/qmail/bin/qmail-smtpup mail.exsample.net \
/var/qmail/bin/checkpassword \
/var/qmail/bin/qmail-smtpd \
2>&1 | /var/qmail/bin/splogger smtpds 3 &

質問等は掲示板またはメールでどうぞ m(..)m

戻る