■PostfixのLDAP対応
案件的にはあまり多くないのですが、大規模な組織となればユーザ認証は全て中央のLDAPサーバに任すというとこ ろもあります。ホスティングサーバや中小の規模だとメールのユーザはメールサーバのローカルアカウントを使用しているところが多いです。
ここでは認証にOpenLDAPを使った設定のメモ書きを残します。OpenLDAPは既にインストールされアカウントも登録されているという前提です。Postfixがインストールされていなければyumからインストールを行います。
# yum install postfix # rpm -qa | grep postfix postfix-2.6.6-2.2.el6_1.i686 |
/etc/postfix/main.cfが設定ファイルとなります。以下、基本設定の部分です。
# vi /etc/postfix/main.cf myhostname = mail.unix-power.net mydomain = unix-power.net myorigin = $myhostname #inet_interfaces = localhost inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 192.168.0.0/16, 127.0.0.1 home_mailbox = Maildir/ smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination |
続いてLDAP連携に関する設定をmain.cfの最後尾に追記します。
# vi /etc/postfix/main.cf virtual_transport = virtual # 下記設定はmydestinationとの重複はNG。複数ある場合はカンマで列挙する。 virtual_mailbox_domains = unix-power.net 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/ldap-alias.cfファイルとldap-mailbox.cf ファイルを新規作成します。まず大前提としてLDAP連携する場合、それはPostfix上ではバーチャルドメインの仮想ユーザとして扱われます。ldap-alias.cfファイルは仮想ユーザから実ユーザへのマッピング定義で あるのに対し、ldap-mailbox.cfファイルは仮想ユーザと実際のメールの配送先(ディレクトリ)を定義しています。
# vi /etc/postfix/ldap-alias.cf server_host = 127.0.0.1 search_base = ou=Users,dc=unix-power,dc=net bind = yes bind_dn = cn=Manager,ou=Users,o=unix-power,dc=net bind_pw = password scope = one query_filter = (mail=%s) result_attribute = mail |
# vi /etc/postfix/ldap-mailbox.cf server_host = 127.0.0.1 search_base = ou=Users,dc=unix-power,dc=net bind = yes bind_dn = cn=Manager,ou=Users,o=unix-power,dc=net bind_pw = password scope = one query_filter = (mail=%s) result_attribute = homeDirectory result_format = %s/Maildir/ |
上記で幾つかの設定を実施しておりますが、それぞれの意味は下記のようになります。
項 目 |
説明 |
server_host |
LDAPサーバのIPアドレスを指定します。 |
search_base |
その名の通り、検索の起点を指定します。 |
bind / bind_dn / bind_pw |
デフォルトだと匿名でLDAPサーバに接続するので 明示的に接続ユーザとパスワードを指定します。 |
scope |
ldapsearch の-sオプションであり検索範囲を指定します。 oneに指定することでBaseDN自身と直下のエントリに限定します。 |
query_filter |
検 索の条件式を指定します。基本的にはldapsearchと使い方は同じです。 特殊文字も利用可能であり、%uは@より前の部分、 %dは@より後の部分、%sはメールアドレスを指します。 |
result_attribute |
LDAPサーバから取得する属性です。 |
result_format |
実際の戻り値を整形します。%sはresult_attributeで得た値となります。 |
一旦、postfixを再起動します。
# /etc/rc.d/init.d/postfix start |
ここで実際にpostfixにパラメータを渡してLDAPから属性を取得できるか試してみます。
# postalias -q suzuki@unix-power.net ldap:/etc/postfix/ldap-mailbox.cf /home/suzuki/Maildir/ # postalias -q suzuki@unix-power.net ldap:/etc/postfix/ldap-alias.cf suzuki@unix-power.net |
上記のように正常な値を返してきていたらLDAP連携ともうまくいっていると思って良いと思います。あとはpostaliasコマンドでデーターベース化しておきます。
# postalias /etc/postfix/ldap-mailbox.cf # postalias /etc/postfix/ldap-alias.cf |
■PostfixのSMTP認証対応
各組織のローカルネットワークからのみメールが送信できるように設定するのが一般的ですが外部からも送信できたほうが便利です。但し、無条件に外部から送信できてしまうとこれを悪用されることがありSPAMメールの踏み台とされてしまいます。これを回避するため外部からのメール発信には必ず一度認証を通す必要があるよう設定します。これをSMTP認証と呼びます。
必要なソフトがインストールされていなければyumからインストールします。
# yum install cyrus-sasl cyrus-sasl-plain # rpm -qa | grep cyrus cyrus-sasl-2.1.23-13.el6_3.1.i686 cyrus-sasl-plain-2.1.23-13.el6_3.1.i686 cyrus-sasl-lib-2.1.23-13.el6_3.1.i686 |
LDAPに関する設定を行います。/etc/saslauthd.confに設定を行いますが、これはデフォルトで存在しないので新規作成 します。
# vi /etc/saslauthd.conf ldap_servers: ldap://localhost ldap_search_base: ou=Users,dc=unix-power,dc=net ldap_filter: (uid=%u) |
続いて/etc/sysconfig/saslauthdを編集します。
# vi /etc/sysconfig/saslauthd #MECH=pam MECH=ldap |
そしてpostfix側の設定を変更します。以下、編集部分のみ記載します。
# vi /etc/postfix/main.cf # smtpd_recipient_restrictions = permit_mynetworks # reject_unauth_destination smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated ※SMTP認証を行ったクライアントは許可 reject_unauth_destination # SASL認証を有効化する smtpd_sasl_auth_enable = yes # mynetworks以外で匿名での接続を拒否する smtpd_sasl_security_options = noanonymous # 規格外の動作に対応させる broken_sasl_auth_clients = yes |
サブミッションポート( TCP/587 )をオープンにしておき、これを経由する際はSMTP Authを必須とします。
# vi /etc/postfix/master.cf submission inet n - n - - smtpd # -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject |
ここまでで設定は完了なのでCyrusを起動しPostfixもリロードします。
# /etc/rc.d/init.d/postfix reload postfix を再読み込み中: [ OK ] # /etc/rc.d/init.d/saslauthd start saslauthd を起動中: [ OK ] |
コマンドラインから動作確認を行います。Cyrusにtestsaslauthdコマンドというのが用意されていますのでこれを利用しま す。
# testsaslauthd -u tanaka -p password 0: OK "Success." |
上記のように「OK “Success.”」と表示されれば認証は成功しています。さらにPostfixでSMTP認証が正常に機能しているのか下記のコマンドから確認可能です。
# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.unix-power.net ESMTP Postfix EHLO unix-power.net 250-mail.unix-power.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH LOGIN 334 VXNlcm5hbWU6 |
上記のAUTH LOGINを発行した際にエラーが出なければOKです。
■DovecotのLDAP対応
LDAPに対応するためのDovecotの設定を行います。基本設定を含めてそれぞれのファイルを編集 します。
# vi /etc/dovecont/conf.d/10-mail.conf mail_location = maildir:~/Maildir |
# vi /etc/dovecot/dovecot.conf #protocols = imap pop3 lmtp protocols = imap pop3 #listen = *, :: listen = * |
# vi /etc/dovecot/conf.d/10-ssl.conf ssl = no |
# vi /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = no !include auth-ldap.conf.ext |
auth-ldap.conf.extの中身は次のようになっています。編集箇所を太文字にしています。
# cat /etc/dovecot/conf.d/10-auth.conf # more auth-ldap.conf.ext # Authentication for LDAP users. Included from auth.conf. # # <doc/wiki/AuthDatabase.LDAP.txt> passdb { driver = ldap # Path for LDAP configuration file, see example-config/dovecot-ldap.conf.ext args = /etc/dovecot/dovecot-ldap.conf.ext } # "prefetch" user database means that the passdb already provided the # needed information and there's no need to do a separate userdb lookup. # <doc/wiki/UserDatabase.Prefetch.txt> #userdb { # driver = prefetch #} userdb { driver = passwd args = /etc/dovecot/dovecot-ldap.conf.ext } # If you don't have any user-specific settings, you can avoid the userdb LDAP # lookup by using userdb static instead of userdb ldap, for example: # <doc/wiki/UserDatabase.Static.txt> userdb { driver = static args = uid=10000 gid=10000 home=/var/spool/virtual/home/%u } |
上記のファイルの中で指定されている/etc/dovecot/dovecot-ldap.conf.extは存在しないので新規に作成す る必要があります。これはLDAP連携の設定であり、サンプルの設定ファイルがありますのでそれを流用します。以下は編集部分のみ記載致します。
# cp /usr/share/doc/dovecot-2.0.9/example-config/dovecot-ldap.conf.ext /etc/dovecot/ # vi /etc/dovecot/dovecot-ldap.conf.ext hosts = localhost auth_bind = yes base = ou=Users,dc=unix-power,dc=net scope = onelevel user_attrs = mail,homeDirectory user_filter = (&(objectClass=posixAccount)(uid=%u)) pass_attrs = mail,userPassowrd pass_filter = (&(objectClass=posixAccount)(uid=%u)) default_pass_scheme = LDAP-SHA |
各項目の意味は次のようになります。
項 目 |
説 明 |
hosts |
LDAP サーバの指定を行います。 |
auth_bind |
メールクライアントによって与えられたユーザ名とパスワードを使って LDAPサーバにログインします。 |
base |
アカウントを検索するディレクトリツリーの定義です。 |
scope |
ldapsearch の-sオプションにあたるもの。 base, onelevel, subtreeのいずれかから選択します。 |
user_attrs |
LDAPサーバから取得する属性でmailおよびhomeDirectoryの値を取得します。 |
user_filter |
ObjectClass にposixAccountが設定されているもので、 かつクライアントのアカウント名とuidが一致するもの |
pass_attrs |
LDAP サーバから取得する属性でmailおよびuserPasswordの値を取得します。 |
pass_filter |
user_filter と同等。 |
default_pass_scheme |
パスワードで使用しているハッシュ形式を指定します。 |
■動作確認
実際の動作確認をコマンドラインから行います。まだ一度もログインを行ったことのないユーザtanakaで試してみます。まず必要なディレクトリを予め作成し属性を変更しておきます。
# mkdir /var/spool/virtual # chown 10000.10000 /var/spool/virtual/ |
rootからユーザtanakaにメールを送信してみます。
# mail -v tanaka@unix-power.net Subject: test test . EOT Mail Delivery Status Report will be mailed to <root>. |
ディレクトリを確認し、自動作成されたことを確認します。
# ls -al /var/spool/virtual/home/tanaka/Maildir/new/ 合計 12 drwx------ 2 10000 10000 4096 1月 23 18:00 2013 . drwx------ 5 10000 10000 4096 1月 23 18:00 2013 .. -rw------- 1 10000 10000 540 1月 23 18:00 2013 1358931623.V802I603afM140971.xxxxx.yy.jp |
Dovecotで受信確認を行なってみます。
# telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Dovecot ready. user tanaka +OK pass password list +OK Logged in. +OK 1 messages: 1 556 . retr 1 +OK 556 octets Return-Path: <root@mail.unix-power.net> X-Original-To: tanaka@unix-power.net Delivered-To: tanaka@unix-power.net Received: by mail.unix-power.net (Postfix, from userid 0) id 11BD240C67; Wed, 23 Jan 2013 18:00:23 +0900 (JST) Date: Wed, 23 Jan 2013 18:00:23 +0900 To: tanaka@unix-power.net Subject: test User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20130123090023.11BD240C67@mail.unix-power.net> From: root@mail.unix-power.net (root) test . |
これで動作確認がとれました。