POSTFIX での LDAP サポート ========================== Postfix は次の検索のソースとして LDAP ディレクトリを使うことができます: aliases, virtual, canonical 等。これでメールサービスの情報を きめ細かくアクセスコントロールがなされたネットワークデータベースの 複製に保持することができます。メールサーバのローカルに情報を保管 しないことで、管理者はどこからでもメンテナンスでき、ユーザは適切だと 考えるちょっとしたことを制御できます。悩むことなく、またそれぞれの コピーを持つことの遅れもなしに、同じ情報を持つ複数のメールサーバを 持つことができます。 LDAP サポート付きでビルドする ============================= 注意: Postfix はすでに LDAP バージョン 1 をサポートしていません。 LDAP ライブラリとインクルードファイルがシステムにインストールされて いる必要があり、またそれに合わせて Postfix Makefile を編集する必要が あります。 例えば、Postfix で使うために(つまり LDAP クライアントコードだけで) OpenLDAP ライブラリをビルドするには、次のようなコマンドを使います: % ./configure --without-kerberos --without-cyrus-sasl --without-tls \ --without-threads --disable-slapd --disable-slurpd \ --disable-debug --disable-shared UM distribution (http://www.umich.edu/~dirsvcs/ldap/ldap.html) または OpenLDAP (http://www.openldap.org) のライブラリを使うので あれば、Postfix ソースツリーのトップレベルで次のようにします: % make tidy % make makefiles CCARGS="-I/usr/local/include -DHAS_LDAP" \ AUXLIBS="-L/usr/local/lib -lldap -L/usr/local/lib -llber" Solaris 2.x では、ランタイムリンク情報を指定する必要があるかも しれません。そうしないと、ld.so はシェアードライブラリの一部を 見つけられないでしょう: % make tidy % make makefiles CCARGS="-I/usr/local/include -DHAS_LDAP" \ AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lldap \ -L/usr/local/lib -R/usr/local/lib -llber" 'make tidy' コマンドは以前に Postfix を LDAP サポートなしにビルド した場合にのみ必要です。 '/usr/local' の代わりに LDAP インクルードファイルやライブラリの 実際の場所を指定します。異なるバージョンの LDAP インクルードファイルや LDAP ライブラリを混ぜないように気をつけてください。 LDAP ライブラリが Kerberos サポート付きでビルドされていたら、 この行に Kerberos ライブラリも含める必要があります。KTH Kerveros IV ライブラリは dns_lookup を定義している Postfix の lib/libdns.a と 競合するかもしれないので注意してください。競合が起こったら、 Postfix をビルドするためだけに Kerberos サポートなしの LDAP ライブラリとリンクしたいと思うかもしれませんが、それはいずれにせよ Kerberos の LDAP サーバへのバインドをサポートしません。 ご迷惑をおかけします。 Netscape LDAP SDK のどれかを使うのであれば、AUXLIBS 行を libldap10.so や libldapssl30.so か持っているものを向くように変更する必要があり、 また実行ファイルが実行時にそれを見つけることができるように、適切な リンカオプション (e.g. '-R') を使う必要があります。 LDAP 検索の設定 =============== LDAP 検索を使うには、少なくとも一つの LDAP ソースを main.cf の検索 テーブルとして定義します。例: alias_maps = hash:/etc/aliases, ldap:ldapsource それぞれの LDAP ソースは次のパラメータを持つことができ、それらは main.cf であなたが与えたソース名に定義とアンダースコアが前置されます。 例を続けると、以下の最初のパラメータ "server_host" は main.cf で "ldapsource_server_host" として定義されます。デフォルトはカッコ内に 示されます: server_host (localhost) LDAP サーバが動いているホスト名。すなわち ldapsource_server_host = ldap.your.com 上で述べられた全てのライブラリで、空白で区切られた複数のサーバが 指定できます。ライブラリは最初のサーバに失敗すると順番に 試していきます。また、"ldap.your.com:1444" のように指定することで、 リストのそれぞれのサーバに異なるポートを与えることもできます。 server_port (389) LDAP ポートが listen するポート。すなわち ldapsource_server_port = 778 search_base (No default; you must configure this.) 検索に接続するためのベース。例えば ldapsource_search_base = dc=your, dc=com timeout (10 seconds) 検索がタイムアウトするまでの秒数。すなわち ldapsource_timeout = 5 query_filter (mailacceptinggeneralid=%s) ディレクトリサーチに使われる RFC2254 フィルタ。ここで %s は Postfix が解決しようとするアドレスに置き換えられます。すなわち ldapsource_query_filter = (&(mail=%s)(paid_up=true)) result_filter (%s) 結果の属性に適用されるフィルタ。query_filter と同じ展開が サポートされ、容易にテキストを付け加える(または前に付ける)のに 使えます。 domain (デフォルトではこれを無視します。) これはドメイン名やファイルへのパスまたはディレクトリです。 指定されると、このリストでのドメイン検索のみが行なわれます。これは LDAP マップが 'user' を探したり、リストにないドメインを探そうと しないことを意味します。これは LDAP サーバ上のクエリを大きく 削減することができます。 ldapsource_domain = postfix.org, hash:/etc/postfix/searchdomains result_attribute (maildrop) Postfix が Email アドレスを解決するために、検索により返された ディレクトリエントリから読み込む属性。 ldapsource_result_attribute = mailbox,maildrop special_result_attribute (No default) DN や URL を含むことができるディレクトリエントリの属性。 見つかると、その値を使って再帰的に検索を続けます。 ldapsource_special_result_attribute = member scope (sub) LDAP 検索のスコープ: sub、base または one。これらは LDAP_SCOPE_SUBTREE, LDAP_SCOPE_BASE および LDAP_SCOPE_ONELEVEL に 変わります。 bind (yes) LDAP サーバにバインドするかどうか。新しい実装では LDAP はクライアントがバインドする必要はありませんが、時間の節約に なります。例: ldapsource_bind = no バインドが必要であれば、ローカルマシンの LDAP サーバにつながる SSL トンネルのポートに接続することを考えるとよいかもしれません。 LDAP サーバがネイティブで SSL をサポートしていなければ、 (ラッパやプロキシなどお好みの方法で)トンネルをシステムに置いて ください。これはパスワードが平文でネットワークを流れることを 防ぎます。 bind_dn ("") バインドが必要であれば、識別名をつけてバインドします。 例: ldapsource_bind_dn = uid=postfix, dc=your, dc=com bind_pw ("") 上の識別名に対するパスワード。これを使うのであれば、main.cf を Postfix ユーザのみに読めるようにするのがよいでしょう。例: ldapsource_bind_pw = postfixpw cache (no) LDAP 接続のクライアント側のキャッシュを使うかどうか。 ldap_enable_cache(3) を参照してください。デフォルトでは off です。 cache_expiry (30 seconds) クライアント側のキャッシュを使う場合、キャッシュされた値は この秒数後に期限が切れます。 cache_size (32768 bytes) クライアント側のキャッシュを使う場合、これはキャッシュのバイト 単位のサイズになります。 dereference (0) LDAP エイリアスの参照値を読み出す時。(これは Postfix エイリアス には何もしないことに注意してください。)許される値は以下の OpenLDAP/UM LDAP の実装で合法なものです: 0 never 1 when searching 2 when locating the base object for the search 3 always これ以上の情報は ldap.h や ldap_open(3) または ldapsearch(1) を 参照してください。他に可能な値を持っている LDAP パッケージを 使っているのであれば、postfix-users@postfix.org メーリングリストに 投稿してください。 chase_referrals (0) LDAP_OPT_REFERRALS をセット(またはクリア)します (LDAP バージョン3サポートが必要です)。 version (2) 使用する LDAP プロトコルのバージョンを指定します。 debuglevel (0) OpenLDAP ライブラリにセットするデバッグのレベル。 これらの値では引用符を使わないでください; 少なくとも、Postfix の 設定ルーチンが引用された文字列の扱い方を理解するまでは。 例 == エイリアス ---------- LDAP を使ってエイリアスを検索するための基本的な例です。main.cf で これらの設定パラメータを定義することを想定します: alias_maps = hash:/etc/aliases, ldap:ldapsource ldapsource_server_host = ldap.my.com ldapsource_search_base = dc=my, dc=com /etc/aliases データベースに見つからないローカルアドレス "ldapuser" 宛のメールを受け取る際に、Postfix は ldap.my.com の 389 番ポートを 開いている LDAP サーバを検索します。匿名でバインドし、 mailacceptinggeneralid 属性が "ldapuser" であるディレクトリエントリを 検索し、見つかった "maildrop" 属性を読み込み、メッセージが配送される RFC822 アドレスとして扱われる、 maildrop のリストを構築します。 バーチャルドメイン/アドレス --------------------------- バーチャル検索の情報をディレクトリに保存したい場合は、少々複雑です。 まず Postfix がバーチャルドメインについて知っているかを確かめる必要が あります。その簡単な方法は、ドメインをディレクトリのいずれかの エントリの mailacceptinggeneralid 属性に加えることです。次に、 全てのバーチャル受信者の mailacceptinggeneralid 属性がバーチャル ドメインの FQDN になっていることを確かめます。最後に、あるディレクトリ エントリをバーチャルドメインのデフォルトユーザとして指したいので あれば、そのエントリにさらに "@virtual.dom" の mailacceptinggeneralid (またはディレクトリの同等のもの)を与えます。そう、ユーザ部分は ありません。なんでも受け取るユーザが欲しくなければ、このステップを 省略すると、そのドメインの知らないユーザは単にバウンスされます。 19991226 より新しい Postfix のバージョンを使っているのであれば、 そのままにすべきです。そうでなければ、バーチャルドメインを relay_domains に加える必要もあります。単に "$virtual_maps" を relay_domains 行に 加えてください。そしてバーチャル受信者を見つけるのに使うのと同じ マップを、ドメインが有効なバーチャルドメインでありリレーを許可すべき かどうかを決めるのに使うことができます。 まとめると、このように見えるバーチャルドメインの全てのアドレスを 受け入れるユーザを持つかもしれません: dn: cn=defaultrecipient, dc=fake, dc=dom objectclass: top objectclass: virtualaccount cn: defaultrecipient owner: uid=root, dc=someserver, dc=isp, dc=dom 1 -> mailacceptinggeneralid: fake.dom 2 -> mailacceptinggeneralid: @fake.dom 3 -> maildrop: realuser@real.dom 1: Postfix は fake.dom を探して何か (maildrop) が返ってきたときに これが有効なバーチャルドメインであることを知ります。 2: このことにより、fake.dom の知らないユーザ宛のいかなるメールもこの エントリに行きます... 3: ... そして maildrop に行きます。 普通のユーザは単に一つの mailacceptinggeneralid と maildrop、つまり "normaluser@fake.dom" と "normaluser@real.dom" を持つでしょう。 他の利用法 ---------- 他に一般的な LDAP 検索の利用法としては、例えばメールが "userid@site.dom" の代わりに "First.Last@site.dom" から来たように 見えるようにするための、Postfix の canonical 検索での送信者や受信者の 書き換えがあります。 注意点と考慮すべき点 ==================== - このドキュメントに使われているちょっとしたスキーマや属性名は 単なる例です。いくつかが LDAP 設定パラメータのデフォルトであるという 以外は特に意味がありません。好きなスキーマを使って、それに合わせて Postfix を設定してください。 - mailacceptinggeneralids がユニークであること、すなわち anyone だけが postmaster や root として指定できるわけではないことを確認したい かもしれません。 - 一つのエントリは一つの mailacceptinggeneralids または maildrops の 属性数を持つことができます。Maildrops はカンマで区切られたアドレスの リストも使えます。それらは全て検索により見つかり、返されます。 例えば、次のようなメーリングリストとして使うことを意図したエントリを 定義できます (警告! この例だけのために作られたスキーマです): dn: cn=Accounting Staff List, dc=my, dc=com cn: Accounting Staff List o: my.com objectclass: maillist mailacceptinggeneralid: accountingstaff mailacceptinggeneralid: accounting-staff maildrop: mylist-owner maildrop: an-accountant maildrop: some-other-accountant maildrop: this, that, theother - LDAP マップをエイリアス以外の検索に使うのであれば、検索に意味がある ことを確かめなければいけないかもしれません。virtual 検索の場合、 メールアドレス以外の maildrops は、Postfix がプログラムやファイル 配送の所有者をセットする方法を知ることが出来ないので、ほとんど 意味がありません。query_filter はおそらく次のようにすべきでしょう: virtual_query_filter = (&(mailacceptinggeneralid=%s)(!(|(maildrop="*|*")(maildrop="*:*")(maildrop="*/*")))) - そしてこの問題に関して、特にエイリアスに対しても、プログラムや include としてユーザが maildrops を指定できないようにしたいかも しれません。これは典型的には UNIX ローカルアカウントを持たずに LDAP と Cyrus だけにユーザが存在する、密閉されたサーバに 適切かもしれません。管理者アカウントが所有するディレクトリエントリ だけに楽しいことを許可したいかもしれません: local_query_filter = (&(mailacceptinggeneralid=%s)(|(!(maildrop="*|*")(maildrop="*:*")(maildrop="*/*"))(owner=cn=root, dc=your, dc=com))) その結果、仮にオブジェクトがそれ自身の maildrop としてのプログラムを 持っていて "cn=root" により所有されていないとしても、有効な ローカルユーザとして返されることはありません。このことにより、あなたの 部分に安全に実装するために、このタイプの配送から派生する問題に対して いくらかの考慮が必要です。LDAP 検索の無駄を許す煩わしさに価値がなく、 これを query_filter で禁止し、majordomo リストのローカルエイリアス データベースのように維持しようと決めるかも知れません。 - LDAP 検索はローカル DB や DBM よりも遅いです。ほとんどのサイトでは ボトルネックとはならないでしょうが、ディレクトリサービスをチューン する方法を知るのはよい考えでしょう。 フィードバック ============== 質問があれば、postfix-users@postfix.org に送ってください。それには あなたの Postfix セットアップに関連した情報を含めてください: postconf の LDAP 関連の出力、ビルドに使った LDAP ライブラリの種類、 使っているディレクトリサーバ。質問にディレクトリのコンテンツが 含まれるのであれば、いくつかのディレクトリエントリの当てはまる ものも含めてください。 クレジット ========== Manuel Guesdon: ldapsource_timeout の振る舞いに関するバグの発見。 John Hensley: 複数の LDAP のソースや設定可能な属性。 Carsten Hoeger: サーチスコープの扱い。 LaMont Jones: ドメイン制限、URL および DN のサーチ、複数の結果属性。 Mike Mattice: エイリアスの参照外しの制御。 Hery Rakotoarisoa: LDAPv3 へのアップデートのパッチ。 Prabhat K Singh: 初期の Postfix LDAP 検索および接続確保の記述。 Keith Stevenson: クエリでの RFC 2254 エスケープ。 Samuel Tardieu: サーチにワイルドカードが含まれる可能性に気づき、RFC 2254 の仕事を促した。バインディングのバグ発見。 Sami Haahtinen: Referral chasing と v3 サポート。 そしてもちろん Wietse。