今回は、Postfix+Dovecotで構築されたメールサーバで、ActiveDirectory連携についてを行う。 なお、当たり前だがメールサーバ側からADサーバと通信できる必要があるので、DMZ領域にいる場合でもそこの通信を開けないといけなかったり、クラウド上にメールサーバが建ってる場合はVPNで接続したりする必要がある。 ネットワーク周りから考えないとならず、諸々面倒くさいことこの上ない。

小規模なグループで用いるメールサーバであれば少人数なので普通にpamでローカルユーザで管理してID統合は行わないか、おとなしくGSuiteやOffice 365を使ったほうがいいだろう(これらにはローカルADと同期するツールが公式で提供されているので)。

前提として、すでにADおよびメールサーバ(Postfix+Dovecot)は構築済みであり、AD接続用のユーザなども作成済みとする(今回の例では「ldap」というユーザを使用)。 また、ユーザの認証情報についてはメールサーバ側で持たないものとし、メールデータはメールサーバ側に作成。ADユーザのディレクトリは自動的に作成するようにする。

1. Postfixの設定ファイルを編集する

もうすでにメールサーバ自体は構築済なのでPostfixの設定ファイル末尾に以下の内容を追記する。

/etc/postfix/main.cf
virtual_transport = virtual virtual_mailbox_domains = $mydomain virtual_mailbox_base = /var/spool/virtual virtual_alias_maps = ldap:/etc/postfix/ldap-alias.cf virtual_mailbox_maps = ldap:/etc/postfix/ldap-mailbox.cf virtual_uid_maps = static:10000 virtual_gid_maps = static:10000 local_recipient_maps = proxy:unix:passwd.byname $alias_maps $virtual_mailbox_maps

また、「/etc/postfix/main.cf」内で「mydestination」を定義している場合は、そのままだとエラーになるので以下のように空にする。

/etc/postfix/main.cf
mydestination =

追記した内容にある「/etc/postfix/ldap-alias.cf」「/etc/postfix/ldap-mailbox.cf」ファイルをそれぞれ新規で作成する。

/etc/postfix/ldap-alias.cf
server_host = ActiveDirectoryサーバのホスト名orIPアドレス(複数ある場合はカンマ区切り) search_base = cn=Users,dc=adtest,dc=local bind = yes bind_dn = ldap@adtest.local bind_pw = パスワード scope = one query_filter = (mail=%s) result_attribute = mail
/etc/postfix/ldap-mailbox.cf
server_host = ActiveDirectoryサーバのホスト名orIPアドレス(複数ある場合はカンマ区切り) search_base = cn=Users,dc=adtest,dc=local bind = yes bind_dn = ldap@adtest.local bind_pw = パスワード scope = one query_filter = (mail=%s) result_attribute = mail result_format = /home/%u/Maildir/

以下のコマンドを実行して無事AD認証が行えることを確認する。

postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-mailbox.cf
postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-alias.cf

[root@BS-PUB-POSTFIX-01 ~]# postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-mailbox.cf
/home/adtest/Maildir/
[root@BS-PUB-POSTFIX-01 ~]# postalias -q adtest@adtest.local ldap:/etc/postfix/ldap-alias.cf
adtest@adtest.local

上記テストコマンドを実行して問題がなければ、Postfixを再起動し(設定ファイル中で定義した)ディレクトリを作成する。

systemctl restart postfix
mkdir -p /var/spool/virtual
chown 10000.10000 /var/spool/virtual/

この状態で、mailxコマンドでコンソールからActiveDirectoryユーザにメールを送信して、無事所定のディレクトリ(この場合、「/var/spool/virtual/」配下)に置かれることを確認する。

[root@BS-PUB-POSTFIX-01 ~]# mailx adtest2@adtest.local
Subject: test
test
.
EOT
[root@BS-PUB-POSTFIX-01 ~]# ls -al /var/spool/virtual/home/adtest2/Maildir/new/
合計 8
drwx------ 2 10000 10000   62 12月  4 23:28 .
drwx------ 5 10000 10000 4096 12月  4 23:26 ..
-rw------- 1 10000 10000  592 12月  4 23:28 1480861684.Vfd00Ic0b3568M934659.BS-PUB-POSTFIX-01

2. Dovecotの設定ファイルを編集する

次に、Dovecotの設定ファイルを編集する。 まず、「/etc/dovecot/conf.d/10-auth.conf」に以下のコマンドを実行し、「/etc/dovecot/conf.d/auth-ldap.conf.ext」ファイルの読み込みを行わせるようにする。

sed -i '/auth-ldap.conf.ext/s/^#//' /etc/dovecot/conf.d/10-auth.conf

「/etc/dovecot/conf.d/auth-ldap.conf.ext」ファイルで読み込まれている「/etc/dovecot/dovecot-ldap.conf.ext」ファイルを新規作成し、そこにActiveDirectoryへの接続情報を記載する。

/etc/dovecot/dovecot-ldap.conf.ext
hosts = ActiveDirectoryサーバのホスト名orIPアドレス base = cn=Users,dc=adtest,dc=local ldap_version = 3 auth_bind = yes auth_bind_userdn = adtest\%u pass_filter = (&(objectclass=person)(uid=%u))

以下のコマンドで、IMAPサーバにログインできることを確認する。

[root@BS-PUB-POSTFIX-01 ~]# telnet localhost imap
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
<span style="color: #ff0000;">. login adtest2 P@ssw0rd</span>
. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in

ひとまずこれで、IMAPサーバとしてAD連携して動作するようになった。 SMTPサーバとしてもAD連携する場合はSMTP-Authについてsaslauthの設定を変えてやる必要があるのだが、今回はそこまでは行わないことにする。


参考