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

第15回 FDS+Postfixでメールサーバ管理

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

バーチャルドメイン設定

ここで,前回設定し損なったvirtual_mailbox_domainsもLDAPに対応させておきます。現在バーチャルドメインの一覧はmain.cfにハードコーディングされていますので,ドメインの一覧を

dn: ou=Mail,dc=bluecoara,dc=net

の中に保存しておくことにします。ドメイン名を格納する属性名ですが,これまでに使っているスキーマ中にmailAccessDomainというちょうど良さそうな属性が用意されていますので,これを利用することにします。ユーザのエントリと同様,mailRecipientというオブジェクトクラスを定義する必要があるため注意してください。

リスト6 /etc/postfix/main.cfのvirtual_mailbox_domainsパラメータを修正

修正前
virtual_mailbox_domains = bluecoara.net, example.co.jp

修正後
virtual_mailbox_domains = ldap:/etc/postfix/domains.cf

リスト7 /etc/postfix/domains.cf

server_host = localhost
search_base = dc=bluecoara,dc=net
# 該当するドメイン名が見つかった場合は,バーチャルドメインとして扱う 
query_filter = (mailAccessDomain=%s)
# なんでも良いので,適当な値を返すようにする
result_attribute = ou
# パフォーマンスを考慮し,子ツリー以下は検索しない
scope = one

これにあわせて,LDAPエントリにバーチャルドメインを定義します。

リスト8 LDAPエントリの一部を修正

% ldapmodify -x -D "cn=Directory Manager" -w dssecret << EOF 
dn: ou=Mail,dc=bluecoara,dc=net
changetype: modify
add: objectClass
objectClass: mailRecipient
-
add: mailAccessDomain
mailAccessDomain: bluecoara.net
mailAccessDomain: example.co.jp
EOF

以上の設定を行うことにより,Postfixが25/tcpでメールを受信した際,その宛先ドメインがdn: ou=Mail,dc=bluecoara,dc=netのmailAccessDomain属性に含まれていればバーチャルドメインとして扱い,それ以外であれば外部へリレーするようになります。

もし管理対象のメールサーバに複数のドメイン名がない場合や,バーチャルドメインの数が少ない場合には,ドメイン名をmain.cfに直接記述するようにしてください。LDAPサーバへの検索クエリが少なくなることで,パフォーマンスの向上につながります。

SMTP Authの設定

これまでの設定により,メールサーバは外部メールサーバからのメールを25/tcpで受信できるようになりましたが,Outlookなどのメールソフトから送信されてくるメールを正しく配送するためには送信用の設定が別に必要となります。

このための送信用ポートを587/tcpとし,不正中継対策のために送信の際にはユーザ名,パスワードを要求するようにします。

SendmailやPostfixなど,多くのMTAでSMTP Authの実際の認証をコントロールするのはcyrus-saslというライブラリで,このライブラリはいくつかのLDAP認証をサポートしています。

2003年の『Software Design』4~6月号ではsaslauthdという認証デーモンを紹介しましたが,最近のバージョンではldapdbというsaslauthdを必要としないLDAP認証手段が用意されています(最近のバージョンといっても,cyrus-saslの最新バージョンは2006年にリリースされて以来変更されていませんが……)。

saslauthdとldapdbの認証経路の違いは次の通りです。

saslauthdを使う場合の認証

saslauthdを使う場合の認証

ldapdbを使う場合の認証

ldapdbを使う場合の認証

このように,ldapdbを利用した方がシンプルなのですが,ldapdbを利用するためには,LDAPサーバ側にSASL認証,SASLプロキシ認証用の設定を行っておく必要があります。

SASLプロキシ認証では,たとえば

dn: uid=HNAKAMITSU,ou=Mail,dc=bluecoara,dc=net
userPassword: hnakamitsu

の認証を行う場合に,まずは

uid=proxyuser,ou=Mail,dc=bluecoara,dc=net

といった認証代行用のDNでディレクトリサーバへの接続を行い,このツリー中に設定されているsaslAuthzTo属性を参照し,最後に実ユーザの認証が行われます。しかし,残念ながらFDSでは,このSASLプロキシ認証がまだサポートされていません。将来的にはサポートされるかもしれませんが,2008年9月現在,Red Hat Directory Server Administrator's GuideのSASLの項には

SASL proxy authorization is not supported in Directory Server; therefore, the server will ignore any SASL authzid supplied by the client. 

とあります。したがって,FDS+SMTP Authという組み合わせの場合は残念ですが,従来のようにsaslauthdを使う必要があります……と言いたいところですが,それだと2003年の記事とあまり変わらず,おもしろくありませんので,今回は敢えて別の方法を取り入れてみます(笑⁠⁠。

機会があればいつかOpenLDAP+ldapdbという組み合わせも紹介するかもしれません。

著者プロフィール

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

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