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への変換あたりを実験してみるかな。

コメント

コメントを残す

メールアドレスが公開されることはありません。