メールサーバの運営って難しいですよね?SPAM攻撃にさらされますし、ちょっとした設定ミスでメールの受け取りや送信が出来なくなるし、受信が出来なくなるだけならまだしもSPAM発信基地となってしまう可能性もあるわけです。そのため高額なメールアプライアンスサーバーいろんな場所で活躍しています。
しかしながら個人用途でそのような専用の機器はなかなか利用出来ません。ですがFreeBSDやLinuxでも「がんばれば!」負けないくらいのメールサーバが構築出来るハズ、と自分を励ましつつ構築・運営を行ってきました。そこでせっかくですから自分なりのノウハウというかメールサーバ構築方法を公開?したいと思います。
今回の構築に当たって使用するソフトウェアは
qmail+vpopmai+ClamAV+SpamAssassin+simscan
を利用します。最近ではpostfixを用いてサーバ構築を行っているのですが今回は過去経緯よりqmailを用います。もう一点、自分がvpopmailが好きであるという理由も大きいのですが。
まずqmailの弱点を考えてみましょう。自分が考えるqmailの弱点は、
その1 ・指定されたメールアドレスを有するユーザがサーバ上に存在するかしないかにかかわらず
「とりあえず」 受け取ってしまう。
・受け取ったメールに対してエラーメールを発信してしまう。
・SPAMの場合、偽装された送り主にエラーメールが送られてしまう。
その2 ・double bounce (ダブルバウンス)が #@[] という不正なメールアドレスで送信される。
その3 ・メール1つに対してTCP接続/切断が1回起こる。
その4 ・同一ドメインに対して何度も接続/切断が発生する。
その5 ・同一ドメインに対する同時接続数の制限がない。
その6 ・SMTP Auth に非対応
その7 ・TLS 非対応
その8 ・IPv6 非対応
特に問題なのが1で、qmailサーバでディクショナリーアタックを受けるとサーバのCPUパワーを空費し、バウンズ不可能な不達通知メールでキュー溢れをおこしてしまいます。実際、過去何回か痛い目を見ました。。。。。
そこで現在のネット環境に合わせて
・SUBMISSIONポートによるメール送信をサポート。
・SUBMISSION利用時はSMTP認証を必須。
・POP before SMTPをサポート[25番ポート利用時]
・アカウント管理はmysqlで行う。
・ドメイン単位でのSPAMフィルタ及びウィルスチェックの利用可否設定
・ディクショナリーアタック対策
以上の機能をサポート出来るようにインストール及びソフトウェア設定を行っていきます。オリジナルのqmailでは対応していなのでパッチを当てて機能拡張を行います。その3とその4とその5、及びその8の弱点は今回は無視することとします。
それでは当てるパッチの紹介です。
qmail-1.03.errno.patch
glibc-2.3.1以降に対応するためのパッチ。FreeBSDでは不要だが念のため。
netqmail-1.05-09-msp.patch
RFC2476に従ってSUBMISSIONポートを使用するためのパッチ。
netqmail-qregex-20040601-vrt.patch
qregex-20040601とvalidrcpttoを併用できるように修正されたパッチ。validrcptto ファイルにも正規表現を使えるように拡張されており、今回の肝になるパッチ。Stray Penguin様のサイト(http://www.asahi-net.or.jp/~AA4T-NNGK/index.html)で公開されているのを発見しまして、このたび有り難く使用することにしました。本当に感謝しています。
(qregex-20040601・・・・・badmailfromというファイルを用いてfromヘッダで通知されたメールアドレスを判定、リストにメールアドレスが存在した場合にメール受け取りを拒否するが、そのリストの記入に正規表現が利用できるようにしたパッチ。badmailtoファイルにtoヘッダで通知されたメールアドレスの場合受け取りを拒否出来るようにもなる。むろん正規表現が利用可能)
(validrcptto・・・・・メールサーバでメールを受け取るユーザをvalidrcpttoファイルに記載、記載がないユーザの場合はメールの受け取りを拒否するためのパッチ。今回利用するパッチを使った場合、正規表現が利用可能になる。)
qmail-date-localtime.patch
Received などの行の時刻をローカルタイムにするパッチ。
qmailqueue-patch
境変数QMAILQUEUEを使えるようにするパッチ。simscanでウィルス判定及びSPAM判定を行うため
に必要です。
netqmail-1.05-smtpd-auth-0.31.patch
SMTP認証機能を追加します。 オリジナルのパッチではqmail-smtpd-auth-0.31 を解凍するとできる base64.c, base64.h, README.auth を qmail のソースdir にコピーしてからパッチを行うのですが、一つ一つ当てていくのは大変なのでStray Penguin様のサイトで配布されている、いきなりパッチだけで済むパッチを利用させて頂きます。
FreeBSDで元々あたるパッチ
sendmail-flagf.patch
qmail 付属の sendmail ラッパーを、”-f” オプションで呼んだ時に sendmail 同様に From:ヘッダを設定するように修正するパッチ
qmail-103.patch
DNSに関するUDPパケットが512バイトを超えると処理できなくなる問題の修正パッチ
patch-qmail-1.03-rfc2821.diff
RFC2821 に準拠するようにするパッチ。挨拶時(接続直後とHELO)が結果コード 5xx の場合、永続エラーにしたり、挨拶時(接続直後とHELO)エラーの場合、複数の MX があるなら別の MX を試すようにするらしいです。
事前準備として必要とするパッチをダウンロードしましょう。パッチダウンロード用のフォルダは[/root/qmail-patch]とします。
# mkdir /root/qmail-patch
# cd /root/qmail-patch
# fetch http://pub.kaone.net/public/qmail-1.03.errno.patch
# fetch http://www.ksknet.net/sample/qmail-date-localtime.patch
# fetch http://www.qmail.org/qmailqueue-patch
# fetch http://www.aripollak.com/files/netqmail-1.05-09-msp.patch.txt
# fetch http://www.asahi-net.or.jp/~AA4T-NNGK/codes/netqmail-qregex-20040601-vrt.patch
# fetch http://www.asahi-net.or.jp/~AA4T-NNGK/codes/netqmail-1.05-smtpd-auth-0.31.patch
# mv netqmail-1.05-09-msp.patch.txt netqmail-1.05-09-msp.patch
早速、portsを利用してインストールを行っていきましょう。パッチを当ててインストールを行うためにいつもの「make install」ではなく「make patch」コマンドを実行します。
また、コマンド実行時にオプション選択を聞いてきますが「RCDLINK」、つまりリンクを自動で作成するオプション以外はすべて無効にして下さい。一つ一つ手でパッチを当てていきます。
# cd /usr/ports/mail/qmail
# make patch
上記コマンドを実行すると、qmailのソースコードとFreeBSD標準で適応されるパッチをダウンロード、workフォルダに解凍されソースにパッチが適応された状態で中断します。
一つ一つパッチを適応していくこととします。
# cd work/qmail-1.03/
# patch -p1 < /root/qmail-patch/netqmail-1.05-09-msp.patch
# patch -p1 < /root/qmail-patch/qmail-date-localtime.patch
# patch -p1 < /root/qmail-patch/netqmail-qregex-20040601-vrt.patch
# patch -p1 < /root/qmail-patch/qmailqueue-patch
# patch -p1 < /root/qmail-patch/qmail-1.03.errno.patch
portsに展開されたファイルへのパッチの適用が終わったら、コンパイルとインストールを続けて行います。
# cd ../..
# make
# make install
インストールが完了したら下記の通りコマンドを入力してsendamilを無効に、qmailを有効にします。
その後「make clean」を実行しましょう。
# /var/qmail/scripts/enable-qmail
# make clean
SUBMISSION用のqmailをビルドします。作業フォルダは[/root/qmail-1.03]とします。上記手順でqmailのインストールを行った場合[/usr/ports/distfiles]配下にqmail用のソースがダウンロードされていますのでそのまま利用します。
# cd /root/
# tar xvzf /usr/ports/distfiles/qmail/qmail-1.03.tar.gz
# cd qmail-1.03/
# patch -p1 < /root/qmail-patch/netqmail-1.05-09-msp.patch
# patch -p1 < /root/qmail-patch/qmail-date-localtime.patch
# patch -p1 < /usr/ports/distfiles/qmail/patch-qmail-1.03-rfc2821.diff
# patch -p1 < /usr/ports/distfiles/qmail/qmail-103.patch
# patch -p1 < /root/qmail-patch/netqmail-1.05-smtpd-auth-0.31.patch
FreeBSDのportsインストールでqmailのインストールを行った場合、「qnofiles」というグループが作成されています。なのでFreeBSD環境に合わせてグループ名を下記の通り書き換えます。
# cp conf-groups conf-groups.org
# ee conf-groups
——————————————————————
qmail ←1行目
nofiles ←2行目
——————————————————————
↓
——————————————————————
qmail ←1行目
qnofiles ←2行目
——————————————————————
書き換えが完了したらビルド及びインストールを行います。
# make
# cp -i qmail-smtpd /var/qmail/bin/qmail-smtpd-submission
以上でqmailのインストールは完了しました。続いてウィルスチェックソフトやSPAMフィルターのインストール、POP3サーバのインストール等々、必要とするソフトをインストールしていきます。ここからは手作業でのパッチ当てがないので(多分)幾分、作業が楽です。
最初に「tcpserver」のインストールを行います。tcpserver はqmailを実行するのに使用します。
# cd /usr/ports/sysutils/ucspi-tcp/
# make install clean
ウィルスチェックの為、ClamAV のインストールを行います。
# cd /usr/ports/security/clamav
# make install clean
SPAMフィルターのインストールを行います。
# cd /usr/ports/japanese/p5-Mail-SpamAssassin
# make
# make install clean
オプションは下記の通りです。
WITH_AS_ROOT=true
WITH_SPAMC=true
WITHOUT_SACOMPILE=true
WITHOUT_DKIM=true
WITH_SSL=true
WITH_GNUPG=true
WITHOUT_MYSQL=true
WITHOUT_PGSQL=true
WITH_RAZOR=true
WITHOUT_SPF_QUERY=true
WITHOUT_RELAY_COUNTRY=true
# cd /usr/ports/mail/simscan
# make install clean
オプションは下記の通りです。
WITH_CLAMAV=true
WITH_RIPMIME=true
WITH_SPAMD=true
WITHOUT_USER=true
WITH_DOMAIN=true
WITH_ATTACH=true
WITHOUT_DROPMSG=true
WITHOUT_PASSTHRU=true
WITH_HEADERS=true
インストールが完了と同時にspamassassin作業用のディレクトリを作成します。FreeBSDではユーザーnobodyのホームディレクトリが”/nonexistent/”に設定されています。しかしながら実際にはそんなディレクトリは存在しません。単にログインさせないユーザーのホームディレクトリという意味で使用しているようです。(nonexistentは実在しないという意味ですし)
そのままSpamAssassinを実行するとエラーが出ますので下記のようにディレクトリを作成してspamassassinプログラムが読み書き出来るようにディレクトリに権限を付与します。
(ちなみにCentOS5.3ではユーザーnobodyのホームディレクトリは[/]、つまりドキュメントルートに設定されてました。よってLinuxでは下記のディレクトリを作成しなくとも動作可能と思われます)
# mkdir /nonexistent/
# mkdir /nonexistent/.spamassassin/
# chown -R simscan:spamd /nonexistent/.spamassassin
引き続きvpopmail のインストールを行います。
vpopmailのセットアップですが、下記2つの要件に対応出来るように設定します。
・アカウント管理にmysqlを利用する
・POP before SMTP が利用できるようにする
ただし現在のインターネット環境を考えるに、SUBMISSION+SMTP認証をためらう理由が見あたらないことから新規にメールサーバを構築する場合は[POP before SMTP]は利用できないようにすべきでしょう。自分が管理しているサーバは過去の経緯よりどうしてもサポートしなければならないのでサポートするようにしているだけです。
また、mysqlの利用も一般ユーザが利用する位で有れば使用しない方が良いかもしれませんね。ここら辺は一長一短だとは思いますが。。。。。ただ、SMTP認証はmysqlを利用した環境でしか自分はチェックしていません。
MySQLにてユーザ管理を行うために、当然ですがmysqlのインストールが必要です。サクッとインストールを行いましょう。
# cd /usr/ports/databases/mysql50-server/
# make WITH_CHARSET=utf8 WITH_XCHARSET=all
# make install clean
続いてvpopmailをインストールします。APOPを利用出来るようにするのとドメインごとにクォータ制御を行うので下記のようなmakeを発行、インストールを行います。
# cd /usr/ports/mail/vpopmail
# make WITH_MYSQL=yes WITH_CLEAR_PASSWD=yes WITH_DOMAIN_QUOTAS=yes
# make install clean
[mysqlを利用しない場合 : makeのみ]
[POP before SMTPを利用しない場合 : make WITHOUT_ROAMING=yes]
[APOPを利用する場合 : make WITH_CLEAR_PASSWD=yes]
[ドメイン単位でquotaを行う場合 : make WITH_DOMAIN_QUOTAS=yes]
以上でソフトウェアのインストールが完了しました。
引き続き、ソフトウェアの設定が必要ですが、まずはインストールそのものは上記手順にて完了です。
設定編は時間を見計らって後日記載したいと思います。