そろそろLDAPにしてみないか?

第14回 LDAPで管理するメールサーバ[連携設定編]

この記事を読むのに必要な時間:およそ 5 分

Postfixの設定

前置きが長くなりましたが,データが揃いましたので,やっとPostfixの設定を行うことができます。CentOSに含まれるPostfixはLDAPサポートされていますが,ソースからインストールする場合などは付属のドキュメントを参照し,libldapなどをリンクするようにしてください。

リスト3 /etc/postfix/main.cfの一部

# Postfixで管理するバーチャルドメイン
virtual_mailbox_domains = bluecoara.net, example.co.jp 
# LDAPからホームディレクトリを取得する場合のベースディレクトリ
# 通常,セキュリティ上の理由から設定した方が良いが,今回は属性の値をそのまま使うため/と設定 
virtual_mailbox_base = / 
# メールアドレスとメールボックスを対応させるためのLDAP設定ファイル
virtual_mailbox_maps = ldap:/etc/postfix/vmailbox.cf 
# メールファイルを保存する場合の最小UID
virtual_minimum_uid = 5000 
# メールファイルの所有者,グループ(5000という固定設定) 
virtual_uid_maps = static:5000 
virtual_gid_maps = static:5000

リスト4 /etc/postfix/vmailbox.cf

# LDAPサーバのアドレス
server_host = localhost
# 検索ベース 
search_base = dc=bluecoara,dc=net 
# 検索フィルタ(%sがメールアドレスに置き換わる) 
query_filter = mail=%s 
# 検索後に取得する属性
result_attribute = mailMessageStore
# 属性取得後に文字列の後ろに/Maildir/という文字を付加することでメールを 
# ホームディレクトリ/Maildir/以下に保存するようにする 
result_filter = %s/Maildir/ 

今回main.cf中に2つのドメイン名を設定していますが,ここにはPostfixで管理したいバーチャルドメインをすべて列記する必要があります(もちろんこれらのドメイン名をLDAP上に格納することもできるのですが,これに関してはページの都合上,次回以降の記事で紹介するつもりです⁠⁠。

以上の設定が完了したら,Postfixをリロードします。また,メールは/home/mail以下にUID=5000, GID=5000という状態で保存されることになりますので,まずは親ディレクトリを作成しておきます。

図10 親ディレクトリの作成

# mkdir /home/mail 
# chown 5000:5000 /home/mail 

図11 Postfixのリロード

# postfix reload 

続けてLDAP内のアカウントにメールを送信し,動作確認を行ってみます。ここでは手軽にテストできるようnetcatを使ったスクリプトを作成しました。

リスト5 send.sh

#!/bin/sh
ADDR=$1
nc localhost 25 <<EOF
HELO foo 
MAIL FROM: <test@example.com> 
RCPT TO: <$ADDR 
DATA 
From: <test@example.com> 
To: <$ADDR> 
Subject: test 

test 
. 
QUIT 
EOF

図12 send.shの実行

% ./send.sh hnakamitsu@bluecoara.net 

リスト6 メールログの一部

Aug 17 02:15:24 cos5a postfix/smtpd[2767]: connect from cos5a[127.0.0.1] 
Aug 17 02:15:24 cos5a postfix/smtpd[2767]: EF2ED14C7F6: client=cos5a[127.0.0.1] 
Aug 17 02:15:24 cos5a postfix/cleanup[2770]: EF2ED14C7F6: message-id=<20080816171524.EF2ED14C7F6@cos5a.localdomain> 
Aug 17 02:15:25 cos5a postfix/qmgr[2737]: EF2ED14C7F6: from=<test@example.com>, size=344, nrcpt=1 (queue active) 
Aug 17 02:15:25 cos5a postfix/smtpd[2767]: disconnect from cos5a[127.0.0.1] 
Aug 17 02:15:25 cos5a postfix/virtual[2771]: EF2ED14C7F6: to=<hnakamitsu@bluecoara.net>, relay=virtual, delay=0.06, delays=0.04/0/0/0.03, dsn=2.0.0, status=sent (delivered to maildir) 
Aug 17 02:15:25 cos5a postfix/qmgr[2737]: EF2ED14C7F6: removed 

最後に,実際にメールが配送されているかファイルを確認してみます。まだPOP3/IMAPサーバを構築していないため,ユーザに配送されたメールを読むにはcatコマンドでファイルを直接開かなければなりません。

図13 findコマンドによるメールの確認

% find /home/mail 
/home/mail 
/home/mail/bluecoara.net 
/home/mail/bluecoara.net/hnakamitsu 
/home/mail/bluecoara.net/hnakamitsu/Maildir 
/home/mail/bluecoara.net/hnakamitsu/Maildir/tmp 
/home/mail/bluecoara.net/hnakamitsu/Maildir/new 
/home/mail/bluecoara.net/hnakamitsu/Maildir/new/1218906925.V802Ifd47M14946.cos5a 
/home/mail/bluecoara.net/hnakamitsu/Maildir/cur 

このように,Postfixにより/home/mail以下にMaildir形式のディレクトリやメールファイルが作成されていることがわかります。お疲れさまでした。

まとめ

今回はLDAPとPostfixの基本的な連携を紹介しました。Postfixにはルックアップテーブルと呼ばれる機能があり,通常はhash形式で属性,値という組み合わせを設定します。代表的な例が/etc/aliasesです。このように,従来hashなどで設定していたパラメータ

hash:ファイル名

という設定を

ldap:LDAP設定ファイル

と書き換えることで,さまざまなPostfixのルックアップテーブルをLDAPと連携させることができます。ただし,Postfix付属のドキュメントにもあるよう,LDAP検索はTCPを経由するため,直接ハッシュファイルにアクセスする方式よりも遅いとされています。

注)
※ただし,メールとはストリーミング放送のようにリアルタイム性が要求されるプロトコルでもないため,それほど問題にはなりません。もしもこれがボトルネックになるようであれば,LDAP内のデータを元に日々ハッシュファイルを作成するようなスクリプトを組む方法が考えられます。

次回はPostfixと転送アドレスの連携,不正中継を防止するためのSMTP Authの設定とPOP3/IMAPの連携について解説する予定です。

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。