Postfix + PostgreSQL でメールアカウントを制御


まずはMTAをPostfixに切り替えて無事動き出した。
次なる野望はPostgreSQLでメールアカウントを制御すること。

Postfixの設定でDB化出来ることは結構あるみたいだ。
基本的に maptype:mapname 形式で指定される情報はDBで対応できると見ていい。

で、早速実験開始!
いきなりバーチャルホストを使った実験は他の準備が整っていないので止める。
手っ取り早そうなのは Alias をPostgreSQLで扱うこと。
まずはPostgreSQL側の設定から始める。

他のサイトを見るとDBにPostfix用のユーザーアカウントを作って、それで全てを操作するようにしている。
でも、私の方はちょっと違った方法を試してみたい。
と言うのも、Postfix側からはDBを参照するだけでDBの中身を書き換える必要性は無い。
であれば、参照しかできないDBのユーザーアカウントをPostfix用に用意して、参照だけさせるのがいいと思われる。
なんせPostfixの設定ファイルにDBのユーザー名とパスワードがはっきり書かれる訳で、何かの理由で他の人に見られてしまったらメールの配送に関わる情報を自由に書き換えられてしまう可能性が残ってしまう。これはセキュリティー上決して良い状態ではない。
しかし、読み出ししかできないユーザーアカウントであれば最悪見えるだけで変更は出来ないので、若干ではあるがセキュリティーが向上される。(気分の問題って話もあるけど・・・)
まぁ実験なんで色々試してやろうと言うことで、Postfix用の読み出し専用アカウントをPostgreSQLに用意することにする。
% createuser -P postfix
Enter password for new role: ********
Enter it again: ********
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

続いて普段PostgreSQLで使用しているユーザーアカウントで pgsql を起動し、Database と Table を作り、Postfix用のユーザーアカウントにアクセス権を設定する。
CREATE DATABASE postfix OWNER ***** ENCODING 'LATIN1';
 
GRANT CONNECT ON DATABASE postfix TO postfix;
 
CREATE TABLE aliases (
  record_id    SERIAL    PRIMARY KEY,
  alias        TEXT      NOT NULL,
  address      TEXT      NOT NULL,
  status_flag  SMALLINT  DEFAULT 0,
  note         TEXT
);
 
GRANT SELECT ON TABLE aliases TO postfix;

ここで一つ注意点が見つかった。
初めは何も考えず Database を作ってテストを行った所、
warning: dict_pgsql: cannot set the encoding to LATIN1, skipping unix:/tmp
というエラーメッセージが出てしまい、Postfixが起動できなくなってしまった。
どうやらpostfixはDBの文字コードが LATIN1 じゃないとダメらしい...我が儘なヤツだ。

aliasesテーブルの中身としては

record_id:レコードの管理番号
alias:OS上のアカウントなど最終配送先
address:メールが送られてくる時の宛先メールアドレス
status_flag:レコードの有効性を管理する 0は無効、1は有効
note:後で管理ツールを作った時にメモを書き込むためのカラム

続いてDBにAlias用のデータを入れる。
INSERT INTO aliases (alias,address,status_flag) VALUES ('root','postfix',1);
と言った感じで /etc/mail/aliases にあるモノをどんどん入れていく。
今回は実験第一弾なので全て入れたが、必ずしも全て入れる必要はない。
/etc/mail/aliases と PostgreSQLに作ったテーブルを併用することも可能なのだが、併用パターンは後日実験する。

Alias用のデータを入れ終えたら、次はPostfixがPostgreSQLを参照するよう設定を変える。
まず用意するのはPostgreSQLを参照するための設定ファイル。
/etc/postfix/pgsql-aliases.cf というファイルを作り、中に設定情報を記述する。
hosts = unix:/tmp
user = postfix
password = ********
dbname = postfix
select_field = alias
table = aliases
where_field = address
additional_conditions = and status_flag = 1

設定情報の意味としては

hosts:PostgreSQLのホスト情報、今回はUnixドメインソケットを使用した
user:PostgreSQLのユーザー名
password:PostgreSQLのパスワード
dbname:データベース名
select_field~additional_conditions:こいつらは
SELECT select_field FROM table WHERE where_field = 'メールの宛先' additional_conditionsに置き換わる

続いて /etc/postfix/main.cf を修正する。
#alias_maps = hash:/etc/mail/aliases
alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf

後はPostfixに設定ファイルを再読込させるだけ。
# /usr/sbin/postfix reload
これでAliasに設定した宛先にメールを送って正しく受信できればOK。
更にDBのstatus_flagを変えてAliasを無効にした時、エラーメールが返ってくれば完璧。

って事でメールを送ってみると無事動いている。
めでたしめでたし。

次はMaildirへの変換あたりを実験してみるかな。

まずはPostfixをインストールしてみる


色々と思いを巡らしていてもしょうがないので、まずは一度Postfixを入れてみることにしよう。
実験の一番の目的はDBでバーチャルホスト用のメールアカウントを管理することなので、LANの中だけでテストしていても面白くない。
そこで、実環境で稼働している二台目のサーバーを使って実験することにした。
このサーバはWebサーバーとしての役割がメインで、メールについてはこれまでセカンダリーサーバーとしての役割とJmailの開発実験用だった。
Jmailはサーバーにアカウントを用意しているのではなく、Jmail用のドメイン宛のメールは一括で受信処理用のプログラムに渡して処理させている。
自分がログインするアカウント宛にメールが来ても全てメインサーバーのメールアカウント宛に転送しているので、このサーバーにはこれまでメールを受け取るアカウントが存在していない。
すなわち、実験中にメールの処理が出来なくても運用上支障がないとても都合の良いサーバーなのだ。

と言う訳で二台目のサーバーのMTAをPostfixに変え、適当にサブドメインでバーチャルホストを実現し、DBを使ったメールアカウント管理の実験を行おう。

まずは作業開始前のサーバーの状況。

OS:FreeBSD 6.0
MTA:Sendmail 8.13.4
DB:PostgreSQL 8.3.0

と言った構成である。

最初にどこから手を付けるかといえば、MTAをPostfixにしてみることが先決。
と思ったが、メインサーバーの移行時のことを考えると現状のSendmailでmbox形式でメールを受け取らせておいて、Postfix移行時にMaildir形式へコンバートする実験も行わないといけない。
と言う訳で実験用にアカウントを作成。そのアカウント宛にメールを送りメールスプールに貯まっていることを確認した。

続いてPostfixのインストール開始。
まずはPostfixのサイトからソースをダウンロードする。私が実験を始めた時の最新バーションは v2.5.5 だった。
ダウンロードしたファイルを展開し作業開始。
初回のインストールなので本当は必要ないが、なんとなくおまじないとして初期化から行う。
# make tidy

次にMakefileの初期化を行うが、PostgreSQLに対応させるためにはオプションの指定が必要となるみたいだ。
指定する内容はPostgreSQLのヘッダーファイルの在りかとライブラリーの在りか。
私のサーバではPostgreSQLのディレクトリ内に両方があったので、その場所を指定してMakefileの初期化を行った。
# make -f Makefile.init makefiles 'CCARGS=-DHAS_PGSQL -I/usr/local/pgsql/include' 'AUXLIBS=-L/usr/local/pgsql/lib -lpq'

無事初期化を終えたらコンパイル開始ということで、お決まりの
# makeを実行する。
make が無事終わったら make install を行う前にPostfix用の実行アカウントとグループ、それとmaildropの処理で使われるグループを作成しておく。
# pw groupadd postfix
# pw groupadd postdrop
# pw useradd postfix -g postfix -d /nonexistent -s /usr/sbin/nologin

更に、Sendmailを終了させOSの再起動時に動かないよう/etc/rc.confを書き換えておく。
そして、現在のSendmail関連のファイルを待避させる。
# mv /usr/sbin/sendmail /usr/sbin/sendmail.OLD
# mv /usr/bin/newaliases /usr/bin/newaliases.OLD
# mv /usr/bin/mailq /usr/bin/mailq.OLD

ここまで用意できたらいよいよインストール実行。
# make install

途中で設定ファイル等のインストール先を聞かれる。
本を読んでも、いろいろなWebサイトを見ても、ここで聞かれることに対しては基本的にデフォルト値から変える必要がないので[Enter]を押していけばよいと書いてある。
しかし!
私のインストール環境ではどういう訳かデフォルト値が空になっている...
何かがおかしい。でも、何がおかしいのか分からないので、とりあえず聞かれた項目に一つずつ答えていく。
最後のsetgid_groupを入力し終えるとインストールが始まった。

が、途中でlibpq.so.5が見つからないとエラーを吐いて止まってしまった。
libpq.so.5自体はMakefileの初期化を行った際に指定した /usr/local/pgsql/lib の中にちゃんとある。
なのに見つからないと怒られる...なぜ(ToT)
で、makeの実行状況をよく見ると /usr/local/lib の中から libpq.so.5 を読み出そうとしている。
いやいや、折角Makefileの初期化をする際にディレクトリを指定したのに、なぜ指定したディレクトリから探してくれないんだ。
何度かmakeをやり直してみたが結果は同じ。
う~ん、これってMakefileのバグ??
などと悩んでてもしょうがないので、とりあえず /usr/local/lib の中に libpq.so.5 をコピーしてやる。
# cp /usr/local/pgsql/lib/libpq.so.5 /usr/local/lib
もう一度make tidyからやり直してやると、今度はインストール先等を聞かれた時にちゃんとデフォルト値が入っている。明らかに先ほどとは違う。
で、進んでいくと見事インストール成功!!

後は /etc/postfix/main.cf を動作環境に合わせていじってやる。
とりあえずメールスプールはmbox形式のままで動かしてみることにして、変更した内容は以下のような感じ。
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /etc/postfix
readme_directory = no
mail_spool_directory = /var/mail
#home_mailbox = Mailbox
#home_mailbox = Maildir/
mail_owner = postfix
setgid_group = postdrop
unknown_local_recipient_reject_code = 550
relay_domains = $mydestination, $mydomain
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
virtual_alias_maps = hash:/etc/mail/virtusertable
virtual_alias_domains = /etc/mail/virtuser-domains
disable_vrfy_command = yes
smtpd_helo_required = yes
コメント等は端折ってあるのでご容赦ください。

準備が出来たらいよいよPostfixの起動。
# /usr/sbin/postfix start

syslogを見るとちゃんと起動できていそう...
先ほど作った実験用のアカウント宛やJmailのアカウント宛にメールを送ってみると無事届いた。

まずはPostfixのインストール成功!

次はいよいよPostgreSQLを使う実験だな。

メールアカウントの管理をPostgreSQLで


MTAを新しくするにあたり実現したいことは決まった。
ただ、中でも厄介そうなのが「メールアカウントをOSのアカウントから分離」というお題。
しかし、OSのセキュリティー向上を考えるとなんとしても実現させたい。

とりあえず思いついたのはLDAPを使う方法。
そもそもLDAPはユーザーアカウントを管理するためのモノなので適任と言えば適任。
PostfixもLDAPに対応しているし、最近のPOP3/IMAP4サーバやSMTP AUTHの認証機構もLDAPに対応しているので、メールシステム全体でユーザー管理の一元化が可能になる。
これまでLDAPを使ったことがないので、まずはLDAPサーバを動かして見ることにした。

まずは自宅のメインPCにVirtual PC 2007を入れ、FreeBSD 7.0の環境を用意。
OpenLDAPのインストールを行い認証機能のテストを始めて見た。
動かしてみて感じたことだが、案外と管理が煩雑だった。
慣れの問題もあるだろうけど、そもそも組織だった管理をしたい訳ではないのでディレクトリ構造でのアカウント管理はオーバースペックとも言える。
それに、遠隔地にあるサーバで動かすのでコマンドラインで操作するのは面倒臭い。
Webベースのツールを用意して簡単な管理がしたい所だが、目的にあったLDAP用のツールが見つからない。かといって、LDAP用のツールを自分で作るとなると、これもまた面倒臭いというのが本音。

ちょっと行き詰まってしまった。

で、他に方法がないかと調べていたら、Postfixのバーチャルホストのアカウント管理にMySQLやPostgreSQLが使用できることが判明した。
更に調べていくと、POP3/IMAP4サーバでもDBを使った認証が可能だし、SMTP AUTHでもDBを使った認証が可能なようだ。
となればDBを使ったユーザー管理の方が断然簡単に思えた。
なんせ仕事柄DBを使うWebアプリを作るのは慣れたモノ。ユーザー管理用のツールだって自分で作れてしまうし、利用者向けのパスワード変更Webページなんてのも自分で作れてしまう。
自分で作るのだから使い勝手だって自分の好みに合わせられるので、こんな良いことはない。

と言うことで、ユーザーアカウントの管理はDBを使用することに決定。
で、使用するRDBMSはプライベートでは使い慣れているPostgreSQLを使うことにした。
なんせ今稼働しているサーバーにはPostgreSQLが動いているので新たにインストールする必要はなく、今の環境に新しいテーブル等を用意するだけで住むので簡単だ。

しかし、ここでも問題が...
本を読んだりWebで調べたりするがPostgreSQLを使ったPostfixの設定に関する情報が少ない。
というか皆無に等しい。
Postfixに付属のドキュメントが一部和訳されて出ていたりするが、実例といえるような内容の記述がないので具体的に何をしたらいいのか分からない。
困った...

メールサーバーの入れ替え計画始動


自前で運用しているサーバーでは知人の会社のドメイン等、多数のドメインが運用されている。
中でもメインの機能として使用されているのが電子メール。
今やインターネットでもっとも利用されているサービスと言ってもいいだろう。

で、ウチのサーバで扱っているメールアカウントが100件近くとかなり増えてきている。(個人が運用しているサーバーとしては多い方でしょ)
しかも添付ファイルが付いていて重いメールがあったり、迷惑メールが届いたりと負荷が上がってきている。
中には不正中継に利用しようとしてアクセスしてきていたり、存在しないメールアドレス宛にメールを送ってきたり、更にはウチのドメインを語って迷惑メールがばらまかれたせいでエラーメールが大量に届いたりと甚だ迷惑なアクセスも多数ある。(適当にプログラムで生成して手当たり次第送ってる感じ)

いろいろと対策は行ってきているが手詰まり感があるし、セキュリティーパッチの対応など結構保守作業もあって馬鹿にならない。
そもそも設定ファイルの記述が難解で、新しい対策を施そうとしても中々進まない。

という訳で、10年にわたって使用してきたsendmailを諦め新しいMTAの導入を決意した。(のは、もう半年以上前...)

MTAの切り替えを行うにあたって今回の目標を設定。

  1. 設定が容易
  2. セキュリティー向上
  3. Submission Port対応
  4. Maildir形式への対応
  5. メールアカウントをOSのアカウントから分離

1と2はなんと言っても運用を楽にするため。
3は、これまで利用者に送信用サーバーは接続しているISPのメールサーバーを利用してもらっていたが、迷惑メール対策の新しい手法として送信ドメイン認証などが利用され始めてきたことを鑑みると、正規の送信用サーバーとしての機能を提供する必要が出てきていると考えたため。
4は、大きな添付ファイル付きメールや大量のメールを溜め込んだ場合でも受信が高速に行えるようにしたいのと、POP3だけではなくIMAP4の正式サービスを提供したいため。
5は、メール用としてしか利用されないユーザーアカウントをOSに用意するのはOSのセキュリティー上好ましくないと感じたため。(パスワード変更しないで使い続ける人が多いからねぇ)

と言うことで新MTAの選考を開始!
とは言ってもsendmail以外のMTAってqmailかPostfix位しか選択肢がない。
ので今回はPostfixを導入することとした。
Postfixになったのには深い訳はないが、とりあえずやりたいことは全て対応できそうという理由...

しかし、ただ単にMTAを入れ替えればOKという訳にはいかない。
バーチャルホストで複数ドメインの運用を行っているし、メーリングリストも動いていたりするので十分な検証を行って万全の状態で切り替えを行わなければいけないので、目標は2009年中の切り替え。
まぁ出来れば秋頃までには実施したいなぁ何て考えながらテスト環境で導入実験を行っていこう。

という顛末でPostfix導入に向けた実験をはじめる。
Postfixに関する情報はそれなりに存在するが、案外と自分のやりたいことの情報が不十分だったりすることがあるので、作業の備忘録としての記録と私の経験が他の方の役に立てばという思いで作業の進捗をblogに残していこうと思う。
何かお気づきの点などあればコメントを残していただきたい。

買い換えちゃいました


普段からよく使う訳じゃないけど無いと困るのがノートPC。

これまではIBM ThinkPad s30を愛用してきていました。

しかし、使用するアプリケーションがバージョンアップする度にCPUへの負荷やメモリ使用量が増大し、動作が重くなってきてました。
なんせOSを起動してまともに使えるようになるまで10分かかる有様で、ブラウザからメーラーにウインドウを切り替えると数分画面が固まることもしばしば。
何度かOSの再インストールをしてリフレッシュをかけたけど、すぐに元の状態に戻ってしまうだけなので諦めちゃいました。

で、しばらく前から買い換えを画策してましたが、なんせ元手が必要な話なので...

でも、今年は冬のボーナスもしっかり出たし、その直前2ヶ月ほどは残業もタップリで元手捻出に成功!\(^_^)/
と言うわけでこの冬はノートPCを買い換えることにしました。

最近ではASUSのEee PC等に代表されるUMPCなるモノが流行ってるみたいで、しかも6万円くらいと安いらしい。
チョット興味が有り、周りにも何人か持ってるヤツもいたりしたので使わせてもらったけど、やはり小さすぎる感が否めない。
ノートPCの使用用途としては旅行や帰省の時に持って歩くのがメインで、普段使いじゃ無いので小さいのがベストだけど、デジカメで撮った写真をチェックしたり、ラリーの主催の時は現場で書類作成に使ったりするのである程度の操作性が欲しい。
用途がメールとWebの閲覧だけならUMPCで十分足りると思うが、普段持ち歩いて使う訳じゃ無いだけにもう少し上のスペックが欲しくなる。

そうなるとこれまで使っていたs30と同じB5サイズのノートがターゲット。
レノボ、パナソニック、Dell、東芝、富士通、NEC、HPと調べれば各社からそれなりに出ている。
ただ、ノートPCとなるとレノボ、パナソニック、東芝あたりが好きなので、このあたりにターゲット絞って検討。
この3社を選んだのに深い訳があるという事ではないが、比較的小型ノートPCに昔から力を入れていて、小型・軽量・高性能となると歴史の分だけ安心感があると言うだけ。

価格差はそんなにないので後はスペック。
ただ、スペックも大差がないのが現状。どれもintelのCentrino2で作ってきているので同じになってしまう。
唯一差を見せていたのがパナソニックのLet’s note W8。
B5サイズで2スピンドル、1.25kg、長時間バッテリー駆動というのが気に入った。

と言う訳でターゲットをパナソニックのLet’s note W8に決定。
価格比較サイトで見ると最安値は169,000円くらい。
いつも行くヨドバシカメラだど214,800円で18%ポイント還元(38,664ポイント)で実質176,136円と、その差7,000円くらい。
まぁ、送料だの振込手数料だの掛かるし、万が一のアフターサービスのことを考えたらヨドバシカメラでいいっかって事でヨドバシカメラへ出発。
まずは店員さんを捕まえて気になる点を聞く。
パナソニックのLet’s noteは全く同じスペックで1スピンドルのT8というのがある。CD・DVDドライブは常に使う訳じゃ無いので外付けでも困らない。でもドライブが無いと困る時もあるので外付けドライブは用意したい。
で、T8に外付けドライブをセットで買うのとW8ではどっちが安いのか。結果は差は殆ど無し。数百円違うかどうか・・・
じゃぁ内蔵してる方が必要な時に持ってないなんて寂しいことにならないのでW8にしようと決定。
続いてW8の214,800円、もっと安くできないの??と聞いてみる。
ネットの最安値と同じにしてとは言わないからチョットくらい安くしてくれないのと言ってみると、相談してくると言って奥へ消えて行く...戻ってきて「800円だけ取りますのでそれで勘弁してください」だって。まぁそんなに値引きしてくれるとは思ってなかったけど、せめて800円じゃなくっって4,800円くらい取って欲しかったなぁなんて言いながら購入を決定しました。
214,000円でポイント還元が38,520ポイントで実質175,480円。
もらったポイントで増設メモリ2GBとノートPCに合わせて無線LANの高速化を図るため、無線ルータを新調して20,000ポイントほど使用。

で、遂にノートPCが新しくなりました~\(^_^)/

う~ん、やっぱ新しいのは良いなぁ。
動作が速いし画面も結構綺麗だし。
しばらくは良いおもちゃになりそうです。

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