前回インストールが完了したFDSですが、今回はその中にメールユーザ用のエントリを作成し、Postfixと連携させてみます。
必要なエントリ
まずはユーザエントリに必要な属性を改めてまとめてみますので、それぞれの意味を理解しLDAPへの登録を行ってみましょう。
表1
メールアドレス Postfixのメール配送に使用される。 またSMTP AuthやPOP3のログインIDとして用いる
パスワード 各サービス用のパスワード
メールボックスパス
Postfixがメールを保存するために使用
Dovecotがメールにアクセスするために使用
転送先アドレス
Postfixが転送用として使用
メールグループを追加
お気づきかもしれませんが、FDSをセットアップした時点で、いくつかのLDAPツリーが最初から作成されています。たとえば、通常UNIXアカウントを登録するためのou=People,dc=bluecoara,dc=net
やou=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管理画面
図3 新規ツリーを作成
このようにして登録したデータは管理コンソールから確認することができますが、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 のスクリーンショットからわかるように、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属性を流用させていただくことにしましょう。
したがって、先ほど管理コンソールを使って登録してしまったデータですが、実際には次のような内容になるべきです。
リスト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を経由するため、直接ハッシュファイルにアクセスする方式よりも遅いとされています。
次回はPostfixと転送アドレスの連携、不正中継を防止するためのSMTP Authの設定とPOP3/IMAPの連携について解説する予定です。