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

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

前回インストールが完了したFDSですが、今回はその中にメールユーザ用のエントリを作成し、Postfixと連携させてみます。

必要なエントリ

まずはユーザエントリに必要な属性を改めてまとめてみますので、それぞれの意味を理解しLDAPへの登録を行ってみましょう。

表1
メールアドレスPostfixのメール配送に使用される。
またSMTP AuthやPOP3のログインIDとして用いる
パスワード各サービス用のパスワード
メールボックスパス Postfixがメールを保存するために使用
Dovecotがメールにアクセスするために使用
転送先アドレス Postfixが転送用として使用

メールグループを追加

お気づきかもしれませんが、FDSをセットアップした時点で、いくつかのLDAPツリーが最初から作成されています。たとえば、通常UNIXアカウントを登録するためのou=People,dc=bluecoara,dc=netou=Groups,dc=bluecoara,dc=netというツリーは、管理コンソールやldapsearchコマンドで確認することができます。

図1 ldapsearchによるデフォルトツリーの確認
% ldapsearch -x -D "cn=Directory Manager" -w dssecret -b "ou=People,dc=bluecoara,dc=net" "objectClass=*" 
# People, bluecoara.net 
dn: ou=People, dc=bluecoara, dc=net 
objectClass: top 
objectClass: organizationalunit 
ou: People 

デフォルトで存在するou=People,dc=bluecoara,dc=net以下にメール用のエントリを登録しても良いのですが、今回はou=Mail,dc=bluecoara,dc=netという別のツリーを作成してみます。fedora-idm-consoleコマンドを使って管理コンソールを開いてください。

次に画面左側のツリーより「Directory Server(ホスト名⁠⁠」をダブルクリックし、ディレクトリサーバ管理画面を表示させます図2⁠。さらにその中から「Directory」タブを選択し、画面左側のツリーに新しいツリー、つまりMailというOUを作成します図3⁠。

図2 FDS管理画面
図2 FDS管理画面
図3 新規ツリーを作成
図2 新規ツリーを作成

このようにして登録したデータは管理コンソールから確認することができますが、ldapsearchコマンドでも確認することができます。

図4 ldapsearchコマンドによるエントリの確認
% ldapsearch -x -D "cn=Directory Manager" -w dssecret -b "ou=Mail,dc=bluecoara,dc=net" "objectClass=*" 
# Mail, bluecoara.net 
dn: ou=Mail,dc=bluecoara, dc=net 
ou: Mail 
description: Postfix/Dovecot 
objectClass: top 
objectClass: organizationalunit 

もちろん管理コンソールを使わず、ldapaddコマンドでエントリを登録、編集、削除することもできます。

図5 テストエントリの追加
% ldapadd -x -D "cn=Directory Manager" -w dssecret <<EOF 
dn: ou=Hoge,dc=bluecoara, dc=net 
ou: Hoge 
objectClass: top 
objectClass: organizationalunit 
EOF
adding new entry "ou=Hoge,dc=bluecoara, dc=net"
図6 テストエントリの削除
% ldapdelete -x -D "cn=Directory Manager" -w dssecret "ou=Hoge,dc=bluecoara,dc=net" 

メールユーザの追加

メールデータ用の親ツリーが完成したら、次はその中にデータを登録します図7⁠。

図7 FDS管理画面でユーザデータの追加
図7 FDS管理画面でユーザデータの追加

図7のスクリーンショットからわかるように、ldapaddコマンドと異なり管理コンソールを使えば直感的にデータを登録することができます。

たとえばこのユーザの携帯電話番号を登録したい場合、画面上の「Advanced...」をクリックし、携帯電話用の属性であるmobileを選択し値を入力することで、簡単にデータを登録することができます。

転送メールアドレスはどの属性に保存する?

前述のように、管理コンソールを使えば、携帯電話番号や住所のような値を直感的に簡単に登録することができるのですが、先ほどの画面の中には転送アドレスを登録できるような場所がありません。独自のスキーマを登録するか適当な属性で代用するか、どうしましょう…?

FDSにおけるスキーマファイルは/etc/dirsrv/schema以下にLDIF形式の形で保存されています。編集方法はオフライン、オンラインの2通りがあり、具体的にはプロセスを停止した状態でスキーマファイルを編集、プロセスを起動するオフライン方式と、プロセスを止めない状態でldapmodifyコマンドを使って新しいスキーマを直接登録するオンライン形式です。オンライン設定は管理コンソールから行うこともできます。

いずれかの方法を使って独自スキーマを登録したいところですが、ちょっと待ってください。実はFDSには各種メール用のスキーマが標準で登録されています。

これらは元々商用システムであったSun Java System Messaging Serverなどで用いられていた属性です。スキーマディレクトリの中にある50ns-mail.ldifを開いてみてください。その中にちょうど良さそうなmailForwardingAddressという属性が存在するではありませんか!

リスト1 50ns-mail.ldifの一部(わかりやすいよう改行を入れています)
attributeTypes: (
  2.16.840.1.113730.3.1.17
  NAME ( 'mailForwardingAddress' )
  DESC 'Netscape Messaging Server 4.x defined attribute'
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  X-ORIGIN 'Netscape Messaging Server 4.x'
) 

objectclasses: (
  2.16.840.113730.3.2.37
  NAME 'nsMessagingServerUser'
  DESC ''
  SUP top AUXILIARY MUST ( objectClass )
  MAY ( cn $ mailAccessDomain $ mailAutoReplyMode $ mailAutoReplyText $
        mailDeliveryOption $ mailForwardingAddress $ mailMessageSt ore $
        mailProgramDeliveryInfo $ mailQuota $ nsmsgDisallowAccess $
        nsmsgNumMsgQuota $ nswmExtendedUserPrefs $ vacationstart date $ vacationenddate ) 
  X-ORIGIN 'Netscape Messaging Server 4.x'
) 

このファイルはLDIF形式になっているものの、中身はOpenLDAPのスキーマと非常に似ていることがわかります。つまり、mailForwardingAddress属性を使うためにはnsMessagingServerUserというObjectClassを定義する必要があり、そのOIDは2.16.840.113730.3.2.37です。また、メールを保存するためユーザのホームディレクトリのパスも必要となりますので、こちらもスキーマファイルに登録済みであるmailMessageStore属性を流用させていただくことにしましょう。

注)
※homeDirectory属性を用いる方法もありますが、homeDirectory属性を使うためにはposixAccountオブジェクトクラスやuidNumber属性など、いろいろなMUST属性を登録しなければならないので面倒なのです。

したがって、先ほど管理コンソールを使って登録してしまったデータですが、実際には次のような内容になるべきです。

リスト2 メールユーザ用のLDIF
dn: uid=HNAKAMITSU,ou=Mail,dc=bluecoara, dc=net 
objectClass: top 
objectClass: person 
objectClass: organizationalPerson 
objectClass: inetorgperson 
objectClass: mailRecipient 
mail: hnakamitsu@bluecoara.net 
uid: HNAKAMITSU 
givenName: Hideo 
sn: NAKAMITSU 
cn: Hideo NAKAMITSU 
userPassword: {SSHA}tTyYPQIq9ZDzoCDnAiLZaXvs2zA3Cc0B 
mailForwardingAddress: forward@example.com
mailMessageStore: /home/mail/bluecoara.net/hnakamitsu

登録にはldapaddコマンドを使います。古い情報が保存されている場合は削除しておいてください。

図8 メールユーザの追加
% ldapdelete -x -D "cn=Directory Manager" -w dssecret "uid=HNAKAMITSU,ou=Mail,dc=bluecoara, dc=net " 
% ldapadd -x -D "cn=Directory Manager" -w dssecret -f hnakamitsu.ldif 

userPassword属性に用いる値ですが、OpenLDAP同様平文パスワードを登録することもできますし、slapasswdコマンドを用いたSSHA形式などの値を登録することも可能です。なお、管理コンソールを使った場合、標準のパスワードエンコーディングはSSHA形式となります。

単体テスト

ユーザの登録が完了しましたので、Postfix側の動作について改めて確認しておきましょう。Postfixがhnakamitsu@bluecoara.net宛のメールを受信する場合、PostfixプロセスはFDSに対し、"(mail=hnakamitsu@bluecoara.net)"のような検索フィルタを用いて検索を行い、そのユーザのmailMessageStore属性を取得する必要があります。

まずはPostfixを使用せず、この動作が可能かどうか確認しておきましょう。これが成功しないことにはPostfixでメールを配送することもできません。

図9 ldapsearchによる検索確認
% ldapsearch -x -b "dc=bluecoara,dc=net" "mail=hnakamitsu@bluecoara.net" "mailMessageStore" 
# HNAKAMITSU, Mail, bluecoara.net 
dn: uid=HNAKAMITSU,ou=Mail,dc=bluecoara, dc=net 
mailMessageStore: /home/mail/bluecoara.net/hnakamitsu

このように、とくにACL等を設定することなく匿名バインドで検索を行うことができるようです。

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の連携について解説する予定です。

おすすめ記事

記事・ニュース一覧