Postfixのvirtual_mailboxをPostgreSQLで管理


いよいよPostfix導入実験の山場へと来た。
virtual_mailboxを使って、メールアカウントをOSのアカウントから分離して扱うための実験を始める。

まずは、PostgreSQLにvirtual_mailboxで使うテーブルを用意する。
今回用意するテーブルは2つ。
一つはvirtual_mailboxで扱うドメイン名のリスト。
もう一つはvirtual_mailboxで扱うメールアカウントの情報。

ドメイン名のリストは
CREATE TABLE virtual_domains (
record_id    serial    PRIMARY KEY,
domain       TEXT      NOT NULL,
status_flag  SMALLINT  DEFAULT 0,
note         TEXT
);
GRANT SELECT ON TABLE virtual_domains TO postfix;
と言った感じ。
基本的にエイリアス用に作ったテーブルと考え方は同じで、基本的にはドメイン名を格納するカラムがあればいい。

メールアカウントの情報は
CREATE TABLE virtual_maps (
record_id    serial    PRIMARY KEY,
login_id     TEXT      NOT NULL,
password     TEXT      NOT NULL,
address      TEXT      NOT NULL,
maildir      TEXT      NOT NULL,
status_flag  SMALLINT  DEFAULT 0,
note         TEXT
);
GRANT SELECT ON TABLE virtual_maps TO postfix;
と言う風になり、受信する時に使うログインIDとパスワードがあり、メールアドレスとスプール先のディレクトリ情報を格納している。

それぞれにテスト用のデータを入れてやる。
INSERT INTO virtual_domains (domain,status_flag) VALUES ('sample.com',1);
INSERT INTO virtual_maps (login_id,password,address,maildir,status_flag) VALUES ('vm0001','password','testmail@sample.com','vm/vm0001/',1);

続いて /etc/postfix/main.cf にvirtual_mailboxの設定を追記する。
virtual_transport = virtual
virtual_minimum_uid = 100
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_mailbox_base = /var/mail
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-virtual_domains.cf
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl, dotlock
と言う感じで基本的にはデフォルト値のコピー。

virtual_mailbox_domains用のPostgreSQLの設定情報を用意する。
ファイルはmain.cf内に書いた /etc/postfix/pgsql-virtual_domains.cf で
hosts    = unix:/tmp
user     = postfix
password = *******
dbname   = postfix
 
select_field = domain
table        = virtual_domains
where_field  = domain
additional_conditions = and status_flag = 1

もう一つ、virtual_mailbox_maps用のPostgreSQLの設定情報を用意する。
ファイルはmain.cf内に書いた /etc/postfix/pgsql-virtual_maps.cf で
hosts    = unix:/tmp
user     = postfix
password = *******
dbname   = postfix
 
query = SELECT maildir || 'Maildir/' FROM virtual_maps WHERE address = '%s' AND status_flag = 1
となる。
virtual_mailbox_maps用のクエリーはこれまでと異なり、SELECT文を丸ごと記載する方法をとっている。
理由はSELECT結果の表記がちょっと複雑になっているため。

ここまで用意できたら /var/mail の所有権をmain.cfで書いたUIDとGIDに書き換えてPostfixを再起動する。
# chown 10000:10000 /var/mail
# /usr/sbin/postfix reload

後はメールを送ってみて /var/mail の中にスプールディレクトリが出来てメールが保存されていれば成功。

とりあえずメールは送れたので、次は受信できるようにしなければ。

ハイブリッドalias_maps


さて、そろそろとPostfixネタもストックが底をつきはじめたのでペースダウン。 (^_^;

以前書いたPostgreSQLを使ったalias_mapsの管理でhashのマップとPostgreSQLのマップを併用するパターンを、後日実験すると書いてしまったので実験してみよう。

まずはどのように併用するか検討する。

Sendmailで使っていた /etc/mail/aliases (伝統的には /etc/aliases だが現実としてはシンボリックリンクになっているだけなので実態ファイルを扱うことにする)は、テキストエディターで編集して newaliases コマンドでhash化するなど取り扱いが不便だ。
一方、PostgreSQLでマップを作り、Wedベースのツールを作ってしまえば簡単に入れ替えたり出来るのでDB管理するのは非常に便利である。
あえて併用する必要性は低い気もするが、一つ考えられる使い分けパターンとしてはシステムアカウント(daemonとかoperatorとかsystemなど)は通常rootに転送しているだけでほぼ半永久的に書き換えることはなさそうなので、このようなシステムアカウントはaliasesファイルに書いておき、rootの転送先やML用の記述等ある程度書き換えが発生しそうなものをDBで管理すると、DBで扱うエイリアスの数も絞られていいかもしれない。

という事で、まずは /etc/mail/aliases を整理してシステムアカウントだけにする。
出来上がったら# newaliasesをしておく。

そして、DBにたくさん登録したAlias情報の中から、aliasesファイルに記述した分を削除する。

次に /etc/postfix/main.cf を書き換える。
#alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf
alias_maps = hash:/etc/mail/aliases, pgsql:/etc/postfix/pgsql-aliases.cf
変更内容は単純で、前回 alias_maps の指定をPostgreSQLだけにしたが、aliasesファイルと両方を指定するだけ、二つの設定をカンマで区切って書いてやればいい。

あとはPostfixに設定を再読込させる。
# /usr/sbin/postfix reload
実際に各Aliasに対してメールを送ってみて正しくメールが配送されれば設定完了。

Submission Portを使えるようにする


さて、POP3とIMAP4でメールを受信することまでは出来た。
次は何をしようかと思いを巡らせていたが、よくよく考えるとまだ自分からメールを送ることが出来ない状況だ。
と言うことで、送信のための環境整備を行うことにしよう。

通常メールの送信にはSMTPを使う。
SMTPはTCPの25番ポートでサーバとクライアントの間で通信を行うが、数年前から多くのISPがスパムメール対策の一環としてOutbound Port25 Blocking(OP25B)という施策をとっている。
これは25番ポートで外部のSMTPサーバと通信させないというモノ。
スパムメールの多くは送信者が自ら相手先のSMTPサーバと通信してメールを送るか、設定の甘いどこかのSMTPサーバを踏み台にして、そこから大量のメールを送信していたり、ウイルス感染したPCを踏み台にし、そこからメールをばらまいている。
いずれの場合も25番ポートを使ってISPのネットワーク外にあるSMTPサーバと通信を行うのが特徴なので25番ポートで外部と通信することを遮断してしまえばいい。

一般的なユーザーであれば回線接続先のISPのメールを使っているのが普通なので、ISPが用意したSMTPサーバへ接続してメールを送信し、あとはISPのサーバに任せてしまえばメールが送られるので全く問題ない。

しかし、社用のメールなので会社のメールサーバから送信したいとか、レンタルサーバを使っていて借りているサーバを送信サーバに設定したい場合などは困ってしまう。
多くの場合、回線接続先のSMTPサーバを送信サーバの設定してメールを送信すれば問題なくメールは送れるが、ノートPCを使って出先からメールを送信したい場合は一々接続先ISPのメールサーバに設定変更しなければいけなくなったりして不便だ。

その不便さに対応するためのモノがSubmission Portと呼ばれるモノだ。
これはTCPの587番ポートを使ってSMTP通信を行う。
但しSubmission Portを使って送信する場合は送信者の認証を必要とし、これをSMTP AUTH(SMTP認証)と呼んでいる。
すなわち、IDとパスワードで認証された人しか使えないSMTP用ポートなのだ。
従来の25番ポートではクライアントから送信のために接続されるだけでなく、不特定多数の外部サーバから自サイト宛のメールが届けられるので認証機能を付けてしまうと、他から届くはずのメールも受け取れなくなるので、クライアントからの送信専用ポートを用意して認証機能を設けたという次第である。

で、PostfixをSubmission Portに対応させてやるのだが、PostfixでSMTP認証を行うためにはSASLという認証機構を使って実現することになる。
PostfixでSASLを使うためには外部ライブラリーが必要で、Postfixが対応しているのはCyrusのSASL機能かDovecotのSASL機能らしい。
Dovecotは既にインストールしているの、こいつのSASL機能を使ってSMTP認証を行うのが手っ取り早いので、Postfix+DovecotでSMTP認証を実現することにする。

まずはPostfixをDovecotのSASLに対応させなければいけない。
makeのやり直しだ・・・
# make tidy
 
# make -f Makefile.init makefiles 'CCARGS=-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\" -DHAS_PGSQL -I/usr/local/pgsql/include' 'AUXLIBS=-L/usr/local/pgsql/lib -lpq'
 
# make
 
# make upgrade

Makefileの初期化を行う際にSASLを有効にし、SASLのタイプとしてDovecotを指定している。
最後はmake installではなくmake upgradeにする事で設定情報などは上書きされることなく、今回のmakeで更新されたファイルだけがインストールされるという優れ物機能。
Postfix本体のバージョンアップの際にも使用する。
バージョンアップの際は設定情報に追加された値などがある場合は、それらもマージしてくれるのでバージョンアップが簡単にできるらしい。

続いてPostfixの設定変更。
まずは /etc/postfix/main.cf の変更
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

SASL機能を使うための設定と、SMTP接続してきたクライアントの許容条件に permit_sasl_authenticated を追加し、SASLで認証が通った接続を許容することにしてやる。

続いて /etc/postfix/master.cf を書き換えて Submission Port を有効にする。
submission inet n - n - - smtpd
# -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

もともと設定情報は書かれているのでコメントアウトされているのを解除してやるだけ。
今回は3カ所のコメントアウトを解除している。
併せて /etc/services に
submission 587/tcp
submission 587/udp

が書かれていることを確認する。
無い場合は /etc/services に追加するか、 /etc/postfix/master.cf の submission と書かれている部分を 587 に書き換えてやる。

続いてDovecotの設定を書き換える。
/usr/local/etc/dovecot.conf の認証に関する設定を
auth default {
 mechanisms = plain login
 socket listen {
  client {
   path = /var/spool/postfix/private/auth
   mode = 0660
   user = postfix
   group = postfix
  }
 }
}
と言った感じにしてやる。(コメント等は端折ってます)
あとはPostfixとDovecotを再起動してやるだけ。

再起動が終わったらSubmission PortでSMTP認証が有効になっているかをテストする。
まずはtelnetを使って確認。
% telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 *****.*****.*** ESMTP Postfix
EHLO localhost
250-*****.*****.***
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
 
% telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 *****.*****.*** ESMTP Postfix
EHLO localhost
250-*****.*****.***
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

ちゃんと587番ポートでつないだ時に 250-AUTH PLAIN LOGIN と出てSMTP認証が有効になっている。

続いてPCの方から送信テストを行う。
SMTPを25番ポートのままにして外部のメールアドレス宛に送信をすると送信を拒否される。
25番ポートのままSMTP認証を有効にするが結果は同じ。
次にSMTPを587番ポートにして外部のメールアドレス宛に送信をすると、またまた送信を拒否される。
587番ポートでSMTP認証を有効にすると、ようやく送信できた。
これでメール送信のための環境も設定完了!

IMAP-IDLEへの対応ソフトは少ない?


前回Dovecotをインストールした際にThunderbirdでIMAP-IDLEのテストを行ったが、ふと他のソフトの対応状況が気になった。

プッシュ配信が出来ればクライアント側は定期チェックが不要になり、サーバ側も定期チェックへの応答が無くなる分負荷は減る。(まぁ絶え間なくスパムメールが来てたら定期受信の方が頻度が少なくなるとも言えるけど・・・)
またリアルタイム性が出て、すぐにメールが読めるというメリットがある。
是非とも対応していて欲しい。

まずThunderbirdだが、こちらはかなり前から対応している様子。
設定の中の詳細項目にサーバが対応してたらIDLEコマンドを使うというチェックボックスがあり、デフォルトでチェックが入っている。
サーバ側が対応していれば、定期受信をしない設定にしていてもオンラインなら新着が届けば受信してくれる。

あと、対応が確認できたのがMicrosoftのWindowsメール。
こちらも対応できているようで、定期受信をしない設定にしておいて他のPCからメールを送ってみると、すぐに着信を知らせるサウンドがなり受信していた。

他はと言うとなかなか対応しているという情報が得られない・・・

で、私が自宅で使用しているジャストシステムのShuriken 2008だが、残念ながら対応できていない様子。
そもそも設定に定期受信をしなくする設定がない。必ず定期受信が動いてしまう・・・
とりあえずジャストシステムのサポートに問い合わせてみた。
え~ジャストシステムのサポート担当の方、変な問い合わせをしたのは私です。お手数をおかけしました。 m(_ _)m

ジャストシステムのサポートはなぜか電話しかない。
今時Webからの問い合わせなんかもあっていいような気はするが、どこを探してもなかったので諦めて電話することに。
本日の14時過ぎから電話をかけ始める。ご多分に漏れず話中でつながらない。
十数回かけ続けるとようやくつながる、がサポート担当が混み合ってるので折り返し連絡しますという・・・ 待ち時間は1~2時間らしい

電話番号を伝え待つこと1時間、非通知で電話がかかってくる。
出てみるとジャストシステムのサポート担当の方。
率直に「IMAP-IDLEに対応しているのか」「定期受信をしない設定にしてIDLEで通知を受けるような設定は出来ないのか」聞いてみると、担当の方はIDLEコマンド自体知らないので分からないとのこと。
また定期受信をしない設定については詳しく調べて再度電話をもらえることになった。

更に待つこと2時間、再び電話がかかってくる。
先ほどの電話の際に非通知だと呼び出し音が鳴らないので番号通知でかけて欲しいと言っておいたので、今度はちゃんと番号通知でかかってきた。
で、結果はと言うとShurikenでは定期受信で新着を受け取る設定しかできないと言うことだった。
残念・・・(まぁ予想していた通りの結果だけど)
是非次期バージョンでは対応して欲しい。
頑張れジャストシステム!無料で配られているソフトに負けるな~

Dovecotのインストール


POP3/IMAP4サーバにDovecotの採用を決めたので早速インストールを始める。
まずはDovecotのホームページからソースをダウンロードしてくる。
私がダウンロードした時点の最新版は v1.1.7 でした。

ソースを展開してconfigureを行うが、ここでPostgreSQLに対応させておく必要がある。
# ./configure --with-pgsql
続けて
# make
 
# make install

で、インストール完了。
続けて実行用のアカウントとグループを作成する
# pw groupadd dovecot
# pw useradd dovecot -g dovecot -d /nonexistent -s /usr/sbin/nologin

そして設定ファイルの編集。
/usr/local/etc/ にサンプルファイルがインストールされているのでコピーして使う。
# cp dovecot-example.conf dovecot.conf
設定ファイルの中で変更したのはプロトコル関係が主。
#protocols = imap imaps
protocols = imap pop3
 
#disable_plaintext_auth = yes
disable_plaintext_auth = no
 
#mail_location =
mail_location = maildir:~/Maildir
 
#ssl_disable = no
ssl_disable = yes

とりあえず実験中なのでSSLは非対応とし、IMAPとPOP3を有効にした。

設定が終わったのでDovecotを実行する。
# /usr/local/sbin/dovecot
で、PCの方からPOP3とIMAP4の両方でアクセスしてみてる。
無事受信できているので、とりあえずインストール完了。

ついでにIMAP-IDLEも試してみたい。
PC用のメールソフトでIDLEコマンドに対応していそうなのがThunderbirdなので、こいつにアカウントを設定してやる。
定期受信をしないよう設定しておき、別のPCからテストアカウントへメールを送る。
Thunderbirdを見ると受信箱に新着がすぐに入ってくる。
ちゃんと動いていそうだ。 (^-^)

← 前のページ次のページ →