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

第16回FDSとDovecot

最初に

例のとごく、前回の記事から少し時間が経ってしまいましたが、今回と次回でDovecotによりPOP3/IMAP4サービスを構築することで、一連のFDSのお話はいったん終了する予定です。

まずは前回同様、それぞれの設定ファイルやデータについて整理しておきましょう。

リスト1 /etc/postfix/master.cfの一部
smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
リスト2 /etc/postfix/main.cfの一部
# Postfixで管理するバーチャルドメイン
# 宛先がこれ以外のドメイン名であれば、MX検索より外部に配送する。
virtual_mailbox_domains = ldap:/etc/postfix/domains.cf

# 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

# メール転送用
virtual_alias_maps = ldap:/etc/postfix/forward.cf

# メールサーバが所属するネットワーク
mynetworks = 127.0.0.0/8, 10.0.100.0/24
smtpd_recipient_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  reject
リスト3 /etc/postfix/domains.cf
# LDAPサーバの基本情報
server_host = localhost
search_base = dc=bluecoara,dc=net

# 該当するドメイン名が見つかった場合は、バーチャルドメインとして扱う
query_filter = (mailAccessDomain=%s)

# なんでも良いので、適当な値を返すようにする
result_attribute = ou

# パフォーマンスを考慮し、子ツリー以下は検索しない
scope = one
リスト4 /etc/postfix/forward.cf
# LDAPサーバの基本情報
server_host = localhost
search_base = dc=bluecoara,dc=net

# 検索フィルタ(%sがメールアドレスに置き換わる)
query_filter = (mail=%s)

# エントリが見つかった場合はmail, mailFOrwardingAddressの両方へメールを配送 
result_attribute = mail, mailForwardingAddress
リスト5 /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/
リスト6 /usr/lib/sasl2/smtpd.conf
# プラグインの定義
auxprop_plugin: giengerldap

# LDAPサーバの場所
gl_uri: ldap://localhost

# バインドDN、パスワード、検索ベース
gl_binddn: cn=Directory Manager
gl_bindpw: dssecret
gl_basedn: dc=bluecoara,dc=net

# 検索フィルタ。メールアドレスをSMTP Auth時のユーザ名とする
gl_search: (mail=%s)

# 認証方式の定義
mech_list: LOGIN PLAIN CRAM-MD5 DIGEST-MD5
リスト7 LDAPエントリ
# Mail, bluecoara.net
dn: ou=Mail,dc=bluecoara,dc=net
ou: Mail
description: Postfix/Dovecot
objectClass: top
objectClass: organizationalunit
objectClass: mailRecipient
mailAccessDomain: bluecoara.net
mailAccessDomain: example.co.jp

# HNAKAMITSU, Mail, bluecoara.net
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
mailForwardingAddress: forward@example.com
mailMessageStore: /home/mail/bluecoara.net/hnakamitsu
userPassword: hnakamitsu

Dovecotのインストール

Dovecotとは、近年ずいぶんメジャーになってきたオープンソースのPOP3/IMAP4サーバです。数年前までPOP3サーバといえば、QpopperやCourier-imapが有名でしたが、Dovecotはシンプルな作りであるにもかかわらず高機能、セキュア、開発も活発に行われていることから、さまざまな点でお勧めできるソフトウェアです。

では、ここで簡単にDovecotの機能を紹介しておきます。Dovecotは本当に高機能で設定もシンプルなので、繰り返しになりますが、ぜひこの機会に乗り換えを検討してみてください。

  • 高速で安全
  • POP3/POP3S/IMAP/IMAPS対応
  • LDAP/SQLなどさまざまな認証サービスに対応
  • (Cyrus-saslとは異なる)独自SASLサポート
  • バーチャルドメイン・バーチャルユーザサポート
  • APOP/CRAM-MD5/DIGEST-MD5のようなチャレンジ・レスポンス認証に対応
  • プラグインなどを活用することで、Sieve(IMAP4時のメール振り分け)やソフトウェアQuotaに対応
  • MDA等の機能も付属
  • mboxやMaildirのメールボックスをサポート
  • 豊富なドキュメント

Fedora CoreやCentOSでは標準のリポジトリにも登録されているため、yumから簡単に導入することができます。

図1 Dovecotのインストール
# yum -y install dovecot

Dovecotの設定ファイルは/etc/dovecot.confですが、Apacheの設定ファイルなどにInclude構文があるのと同様、DovecotでもLDAP用の設定ファイルは/etc/dovecot-ldap.confのような別ファイルとして管理します。

デフォルトのdovecot.confの中にはさまざまな設定サンプルが記述されているため、とくに他のドキュメントを参照せずとも、直感的に設定を行うことができると思います。その中でも認証関連の設定となるのは、

auth default {
}

で囲まれた部分です。Dovecotはさまざまな認証をサポートしているため、/etc/passwd形式のパスワードファイルを認証用データとすることができますし、PAMに認証を委任することもできます。その他もちろんSQLサーバや今回のようなLDAPサーバにも対応しています。

簡単な例を挙げて、まずはOSの認証データベース(/etc/passwd, /etc/shadow)とは異なる、テキスト形式のパスワードファイルを使用したいとします。この場合の設定は次のようになります。

リスト8 /etc/dovecot.confの一部
auth default {
《省略》
  # パスワード情報検索
  passdb passwd-file {
    args = /tmp/mypasswd
  }
  # ユーザ情報検索
  userdb passwd-file {
    args = /tmp/mypasswd
  }
《省略》
}

次にパスワードファイルは/etc/passwd同様、おなじみのフォーマットになります。

リスト9 /tmp/mypasswd
user:{plain}password:5000:5000:gecos:/home/mail/bluecoara.net/hnakamitsu:/bin/sh: 

設定ファイルの準備が終わったら、デーモンを再起動して接続テストを行ってみます。

図2 Dovecotの再起動
# /etc/init.d/dovecot restart
図3 POP3接続テスト
% telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Dovecot ready.
USER user       ←─── ユーザ名を入力
+OK
PASS password   ←─── パスワードを入力
+OK Logged in.
QUIT            ←─── QUITで終了
+OK Logging out.
図4 IMAP4接続テスト
% telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
* OK Dovecot ready.
1 LOGIN user password  ←─── ユーザ名とパスワードを入力
1 OK Logged in.
1 LOGOUT               ←─── LOGOUTで終了
* BYE Logging out
1 OK Logout completed.

うまく接続できたでしょうか?

LDAP向けの設定

先ほどの簡単な例をふまえて、LDAP用のdovecot.confの設定は次のようになります。単に別ファイルを定義しているだけです。

リスト10 /etc/dovecot.confの一部
auth default {
《省略》
  # パスワード情報検索
  passdb ldap {
    args = /etc/dovecot-ldap.conf
  }
  # ユーザ情報検索
  userdb ldap {
    args = /etc/dovecot-ldap.conf
  }
《省略》
}

次に、肝となるdovecot-ldap.confの設定例は次の通りです。

リスト11 /etc/dovecot-ldap.conf
# LDAPサーバ
hosts = localhost

# パスワード検索用のバインドDN,パスワード。実際には管理者ではない専用ユーザを使用するように! 
dn = cn=Directory Manager
dnpass = dssecret

# 検索ベースとスコープ
base = ou=Mail,dc=bluecoara,dc=net
scope = subtree

# ユーザを識別するための検索フィルタ
user_filter = (mail=%u)
# mailMessageStore属性をホームディレクトリとみなす
user_attrs = mailMessageStore=home

# パスワードを識別するための検索フィルタ
pass_filter = (mail=%u)
# mail属性をユーザ名、userPassword属性をパスワードとみなす
pass_attrs = mail=user,userPassword=password

# 認証スキーマ。LDAPサーバ側で平文パスワードを保持するため、PLAINと設定
default_pass_scheme = PLAIN

# メールボックスにアクセスする時のUID/GID(Postfix側の設定とあわせる)
user_global_uid = 5000
user_global_gid = 5000

設定を順番に見ていくと、まずはいつものようにLDAPサーバのアドレスやバインド情報を設定しています。今回も便宜上、管理者であるDirectory Managerを用いていますが、実際の環境では必ず閲覧専用のDNを作成して設定するようにしてください。

基本設定の後は、user_filter, user_attrs, pass_filter, pass_attrsでそれぞれユーザ、パスワード検索用の設定を行っています。たとえば、POP3セッションで

  • ユーザ名: foo@example.com
  • パスワード: bar

という情報が入力された場合、これだけの情報ではLDAPサーバから何を検索し、ユーザから受け取った値と何を比較すれば良いのかわかりません。そのためにPOP3/IMAP4時のユーザ情報は

リスト12 /etc/dovecot-ldap.conf
(mail=%u)

※ %uにはPOP3セッション時に入力されたユーザ名が代入されます。

という検索を行った結果から取得する、さらにパスワードはuserPassword属性に格納されており、ホームディレクトリ取得のためにmailMessageStore属性を参照する、といった形の設定を行っています。

設定が完了したら再びプロセスを再起動し、LDAP上に保存されているメールアドレスとパスワードでログインできるかを確認してください。もしうまくいくようであれば、メールソフトの設定を行ってみましょう!

長い道のりでしたがお疲れさまでした! もし接続できないようであれば、DovecotやFDSのログファイルなどを確認してみてください。

次回は、引き続きDovecotでのPOP/IMAP認証の最適化について説明します。

おすすめ記事

記事・ニュース一覧