2013/05/03

安定版OpenSMTPD 5.3で仮想メールボックスの試運転/CentOS 6

OpenSMTPD 5.3が三月にリリースされました。そして、四月になってバグ修正とLMTP対応版であるOpenSMTPD 5.3.1がリリースされています。公式の発表でも言及されていますが、5.3が最初の安定版です。

今年の始め頃に書いた「OpenSMTPDの試運転と設定/OpenBSD 5.2」と「OpenSMTPDとmaildropで仮想メールボックス環境を構築」の記事で例示した設定ファイルはそのままでは5.3.1では動かなくなっていますので、今回はOpenBSD 5.3.1 portable版をCentOSで試運転した話を書きます。

OpenSMTPD 5.3.1 on CentOS 6で試験する内容

OpenSMTPDの試運転と設定/OpenBSD 5.2」と「OpenSMTPDとmaildropで仮想メールボックス環境を構築」の記事で行った内容を、Stable版OpenSMTPD on Linux(CentOS)で、下記内容の環境を構築する事によって試験しました。
  1. バーチャルドメイン対応とMaildir/への配送
  2. LAN(192.0.2.0/24)内からのメールはリレーする
  3. 特定のドメイン宛メールはGmailやSendGridのSMTPサーバへ認証してリレーする
  4. 仮想メールボックスへの配送

前提となる環境

  • OpenSMTPDの設定ファイル一式は全て/usr/local/opensmtpd/etcに置く
  • hostname(1)の実行結果がmta.example.jpとなるホストでやる
  • バーチャルドメインの対応と定義は/usr/local/opensmtpd/etc/smtpd/virtusersに書く
  • バーチャルドメインはexample.jpとneko.azumakuniyuki.orgの二つとする
  • 仮想メールボックスの位置は/home/virtmail/ドメイン/ユーザ/Maildirとする
  • 仮想メールボックスの所有ユーザはvirtmailとする
  • 仮想メールボックスのMaildir/への配送はmaidropプログラムを使う
設定ファイル一式を/usr/local/opensmtpd/etcに置く理由は、aliasesがデフォルトで/etc/mail/aliasesになっているのですが、/etc/mailはSendmailの支配下にあるので、OpenSMTPDが領空侵犯をしない為の配慮です。

OpenSMTPD 5.3.1をコンパイルしてインストールする

今回はOpenBSD以外のシステムに入れるので、ポータブル版のOpenSMTPDを取ってきて、/usr/local/srcで開封してコンパイルして、/usr/local/opensmtpdに入れる事にします。

入れる前に、メールシステムで要りそうなパッケージと入れろと言われるパッケージをyumで入れました。
# yum install libtool db4 db4-devel db4-utils zlib-devel openssl-devel libevent-devel ⏎
# yum install autoconf autotools automake cyrus-sasl cyrus-sasl-devel pcre-devel gcc-c++
パッケージを入れてからgit clone OpenSMTPDでソースコード取ってきて入れます。
# cd /usr/local/src ⏎
# git clone -b portable git://github.com/poolpOrg/OpenSMTPD.git ⏎
Initialized empty Git repository in /usr/local/src/OpenSMTPD/.git/
remote: Counting objects: 18005, done.
remote: Compressing objects: 100% (6944/6944), done.
...

# cd ./OpenSMTPD ⏎
# ./bootstrap ⏎
+ test yes = yes
+ libtoolize --copy --force
libtoolize: putting auxiliary files in `.'.
...

# ./configure --prefix=/usr/local/opensmtpd --with-ssl-dir=/usr --without-openssl-header-check ⏎
...
# make && make install
OpenSMTPDをインストールしたら、特権分離用ユーザとそれらの$HOMEを作成します。README.mdにもこれらを作るように書いていますのでファイルの中身を確認すると良いです。
# mkdir /var/empty ⏎
# useradd -c "SMTP Daemon" -d /var/empty -s /sbin/nologin _smtpd ⏎
# useradd -c "SMTP queue user" -d /var/empty -s /sbin/nologin _smtpq ⏎
# useradd -c "SMTP filter user" -d /var/empty -s /sbin/nologin _smtpf

maildropも入れる

MDAとしてMaildir/にも配送出来るmaildropを入れます。yumで入れてもいいですが、試験なのでソースからコンパイルして/usr/local/opensmtpd以下にいれる事にします。maildropのソースはこのあたりから持ってきます。
# cd /usr/local/src/maildrop-2.6.0 ⏎
# export DIST=/usr/local/opensmtpd ⏎
# ./configure --prefix=$DIST --enable-keep-fromline=1 --enable-unicode --with-etcdir=$DIST/etc --enable-maildrop-gid=_smtpd ⏎
# make && make install ⏎
...

仮想メールボックスの所有者とログファイルを作成

仮想メールボックス(バーチャルメールボックス)の所有者であるユーザ``virtmail''を追加します。このユーザはUIDもShellも$HOMEも持つユーザとして作成します。
# useradd -c 'Virtual mailbox' -d /home/virtmail -s /bin/sh virtmail ⏎
# finger virtmail⏎
Login: virtmail          Name: Virtual Mailbox
Directory: /home/virtmail            Shell: /bin/sh
Never logged in.
No mail.
No Plan.

# touch /var/log/maildrop-virtual.log ⏎
# chown virtmail:virtmail /var/log/maildrop-virtual.log
あと、仮想メールボックスで受けとる"kijitora@neko.azumakuniyuki.org"と"nekochan@example.jp"用のディレクトリも作っておきます。
# mkdir -p /home/virtmail/neko.azumakuniyuki.org/kijitora/Maildir/{cur,new,tmp} ⏎
# mkdir -p /home/virtmail/example.jp/nekochan/Maildir/{cur,new,tmp} ⏎
# chown -R virtmail:virtmail /home/virtmail/

maildroprcを作る

/usr/local/opensmtpd/etc/maildroprcを下記の内容で作りました。


OpenSMTPDの設定ファイルを作る

それなりにちゃんとしたSMTPサーバを構築するので、設定ファイルも管理しやすいように幾つか作ります。設定ファイルは全て/usr/local/opensmtpd/etc以下にいれています。

smtpd.conf

OpenSMTPD 5.2までのsmtpd.confは、文法が変わっていて5.3ではそのまま動かなくなっていますので変わった部分を直しつつ設定ファイルを作ります。


大きな変更点は、all が any になった点と map が table になった点です。

ルールの記述は、accept またはrejectのあとに from 何とか を書かないと from local と見なされるので、例えば外部からの接続で宛先がroot@mta.example.jpの場合、aliasesで特定ユーザに配信する為に accept from any for local alias...と記述しています。

aliases(.db)

aliasesは伝統的なSendmailやPostfixのそれと同じフォーマットです。データベース形式への変換はnewaliasesではなく、makemapを使います。元のファイルは/etc/mail/aliasesをコピーしてきました。
# cd /usr/local/opensmtpd ⏎
#  cp /etc/mail/aliases ./etc ⏎
# ./sbin/makemap etc/aliases

authinfo(.db)

僕が作った設定ファイルの例では、特定の宛先(ここでは猫の種類.example.*宛)の場合は、authinfoに定義したリレーに基づいて転送をします。このファイルもaliasesと同じ方法でmakemapして、rootと特権分離ユーザである_smtpdだけが読めるようにパーミッションを640にします。


このファイルを参照するルールはaccept for domain ...って書いている部分です。

relayhosts(.db)

Sendmailでおなじみの/etc/mail/relay-domainsに相当するファイルとして作っています。特定のIPアドレス又はネットワークからの接続であればリレーを許可します。


RHS(右辺値)はなんでも良いです。REJECTって書いてもリレーされます。

またSendmailのrelay-domainsのように文字列での一致ではないので、ネットマスクを付けた表記も可能です。このファイルもおなじようにmakemapします。

このファイルを参照するルールはaccept from <relayhosts> for any relayです。

virtdomains(.db)

Sendmailのvirtuser-domainsに相当するファイルとして作っています。但し、前述のrelayhostsと同じくDB形式で参照するので、makemapを使って下記の内容をDBにします。RHSはやはり何でも良いです。

OpenSMTPD 5.2までは仮想メールボックスのドメインを定義するのは、仮想メールボックスのメールアドレスを定義しているのと同じファイルに書いていましたが、5.3からは別ファイルに書く必要があるようです。

virtusers(.db)

virtdomains(.db)に一致したドメインのうち、実際に受けとるメールアドレスの定義を行います。LHS(左辺値)には受けとりたいメールアドレスを、右辺値にはメールボックス(Maildir/)の所有ユーザであるvirtmailを指定しました。


起動とか

このあたりはOpenSMTPD 5.2以前と変わっていないようで、smtpdを実行すればOKです。デバッグモードで起動する場合もsmtpd -vdで良いです。
# /usr/local/opensmtpd/sbin/smtpd && tail -f /var/log/maillog ⏎
May  2 09:59:49 mta.example.jp smtpd[30231]: info: OpenSMTPD 5.3p1 starting
May  2 09:59:49 mta.example.jp smtpd[30232]: info: startup

# /usr/local/opensmtpd/sbin/smtpctl stop ⏎
command succeeded
停止はkill -TERMでも止まりますが、smtpctl stopでやるのがスマートです。わざわざコマンド成功って表示されます。

まとめ

他の試験、例えばログのローテーションや配送テストは「OpenSMTPDとmaildropで仮想メールボックス環境を構築」の内容と同じなので、この記事では書いていません。まだ試験していないのはrejectルールのあたりと、submission(587)で認証してから投函出来るかどうかと、SMTP over SSLとLMTPあたりです。

5.2から5.3にかけて設定ファイルの文法が変わりましたが、5.3は安定版としてリリースされているので、このあたりが大きく変わる事はないと思います。今回も仮想メールボックスの環境という実用的な実装が出来るかどうかを中心に試験しましたが、完成度は高いと思います。

github.com/poolpOrg/OpenSMTPDでじゃんじゃんIssuesが上げられて、じゃんじゃんclosedになっているぐらい開発が活発です。果たして信頼と実績・歴史と伝統のSendmailを隠居の身に追いやるのか、あるいはもはや改造専用MTAみたいになっているqmailを完全に駆逐するのか、今後が楽しみなMTAです。

0 件のコメント:

コメントを投稿