目次
Mail Server
Mail Serverと一括りに言うが、実際にサーバーとして作る場合、MTAとMDAを準備する必要がある。
InternetでMTAと言えば、SMTP Serverであり、これには様々なものがある。古くからあるsendmail、qmail、postfixやexim、courier-MTA等。
また、一般に広く利用されているMDAプロトコルには POP3/IMAP があり、それ様のサーバーも非常にたくさんある。Cyrus-IMAP/POP, Courier-IMAP/POP, Dovecot, UW-IMAP, Qpopper等。
今回はSMTP Serverとしてpostfixを選択、POP3/IMAP ServerとしてDovecotを利用することにしたので、そのメモを。
最近では、LinuxやMacOS-X等も含めてSMTP ServerにPostfixを利用しているOSが多い。これは、sendmailと比較して初心者でも設定が(比較的)簡単であるからだろうと思われる。
現時点(2010/04)で筆者の知っているSMTP Serverと言えば
- sendmail これが最も基本であり、最も古く、最も高機能であり、(恐らく)最も難しい
- qmail 一時期非常によく利用された(今は知らない)SMTPサーバー。今でもメンテナンスされているのかしらん?
- EXIM debianとubuntuの標準MTAらしい。これももう10年以上使われているような気がする。少なくとも1999年にはpkgsrcにあった。
- Courier-MTA 日本語でも情報が準備されています。imapやpop等と組み合わせて1setでシステム作る場合にはいいかも。
- postfix postfix-jp 今回のお題。BSD系やRedHatなど様々なシステムが標準に採用している。
ちなみに、POP3 ServerやIMAP Serverとなると更に多数あるので、ここでは取り上げない。
なお、Mail ServerはDNS Queryを多数発行するので、Mail ServerはDNS Cache Serverと同時に動かすことが望ましい。
MTA/SMTP Server
ここから、MTA/SMTP Serverに関する基本的な設定などを記載する。
Install
postfixを参照。
Configuration
個人ドメインでのMail Server運用なので、それに合わせた設定を行う。
細かい点はManualを参照のこと。差分のみ記載する。
myhostname = mail2.example.net ← 指定しなければ自動で設定される mydomain = example.net ← 同上 myorigin = $mydomain ← 同上 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain ← example.net向けのMailを受信するようにする。 mynetworks = $config_directory/mynetworks ← 無条件で信用するNetworkを記載するファイルを指定 home_mailbox = Maildir/ ← Maildir形式でメールを保存 debugger_command = ← Xとかとばしたくないので、こっちにする PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; echo where) | gdb $daemon_directory/$process_name $process_id 2>&1 >$config_directory/$process_name.$process_id.log & sleep 5 biff = no ← biffを止める mailbox_size_limit = 0 ← メールボックスのサイズ制限をなくす message_size_limit = 104857600 ← 個々のメッセージのサイズを10MByteまでに制限 allow_mail_to_commands = alias,include ← メーリングリスト管理用設定 disable_vrfy_command = yes ← SMTP VRFYコマンドを禁止 smtpd_helo_required = yes ← SMTP HELOを必須にする smtpd_client_restrictions = ← TCP接続時の制限 permit_mynetworks ← $mynetworksと一致していればOK check_client_access cidr:$config_directory/client ← 指定されたファイルに記載されているデータベースを確認 warn_if_reject reject_rbl_client all.rbl.jp ← RBL.jpを参照する。もし引っかかった場合、logに記載されるが、rejectはしない warn_if_reject reject_rbl_client zen.spamhaus.org ← SPAMHAUSを参照する。もし引っかかった場合、logに記載されるが、rejectはしない reject_unknown_client ← いわゆるParanoid Check. IP Address→PTR→Aで一致しなければ却下 permit ← あとは許可 smtpd_helo_restrictions = ← SMTP HELO時での制限 reject_unauth_pipelining ← 正しくないパイプを利用することを禁止 reject_invalid_hostname ← ホスト名が以上である場合却下 warn_if_reject reject_non_fqdn_hostname ← ホスト名がFQDNで記載されていなければlogに記載 warn_if_reject reject_unknown_hostname ← ホスト名がDNSで引けない場合logに記載 permit ← あとは許可 smtpd_sender_restrictions = ← SMTP MAIL FROM:時での制限 reject_unauth_pipelining ← 正しくないパイプを利用することを禁止 reject_non_fqdn_sender ← FQDN出なければ却下 reject_unknown_sender_domain ← ドメインがDNSで引けなければ却下 warn_if_reject reject_sender_login_mismatch ← クライアントがloginしていない場合にlogを出す。SASL/SMTP Auth等で有効 reject_unlisted_sender ← 受信者が特定できない場合に却下 warn_if_reject reject_unverified_sender ← 送信者が特定できない場合にlogを出す。通信量が増え、反応が鈍るので要注意。 permit ← あとは許可 smtpd_recipient_restrictions = ← SMTP RCPT TO:時での制限 reject_unauth_pipelining ← 正しくないパイプを利用することを禁止 permit_auth_destination ← 配信先が承認されている場合 OK warn_if_reject reject_non_fqdn_recipient ← 配信先がFQDNでない場合 log warn_if_reject reject_unknown_recipient_domain ← 配信先のアドレスに AもしくはMXレコードがない場合に log warn_if_reject reject_unverified_recipient ← 受信者が特定できない場合 log reject_unauth_destination ← 配信先が承認されていない場合却下 reject_multi_recipient_bounce ← Envelope FROMがNULLであり、Envelope RCPTが複数ある場合要求を拒否 permit ← あとは許可 smtpd_data_restrictions = ← SMTP DATA時での制限 reject_unauth_pipelining ← 正しくないパイプを利用することを禁止 reject_multi_recipient_bounce ← Envelope FROMがNULLであり、Envelope RCPTが複数ある場合要求を拒否 permit ← あとは許可
で、mynetworksを作成し以下の様に設定。
# ----- localhost [::1]/128 127.0.0.1/32 # ----- home network 10.11.12.0/26 # ----- Office network 192.168.128.0/25
次に、clientファイルを作成し、以下の様に記載。
# White List 10.11.12.0/26 OK 192.168.128.0/25 OK # Black List 10.11.12.64/26 NG 10.11.12.128/25 NG 192.168.0.128/25 NG
注意点
- OP25B に引っかからないようにする
- 今時、SMTPを単純に利用できないように、OP25Bが仕掛けられている。
- Mail Serverをこのような機能を持つISPの下部に置く場合、設定を変えて、submission portを利用し、メールを転送するように設定する必要がある。
- S25Bに引っかかっている場合
- Sender port 25 Blockingによって、IPアドレスベースでのフィルターが為されている場合がある。
- この場合は、残念ながら、受信側に「今は大丈夫だから空けて」と言うしかない。
- 特に、ISPの固定アドレスサービスなどを利用して、過去にSPAMを送信していたであろうところに関しては、Filter outされている可能性が高いので注意が必要。
- というか、SPF位見てくれよ。
- 既にpostfixがinstallされていて、システムが動いている場合に、postfixのversionを上げた場合
- とにかく変更点を確認する
- /usr/pkg/sbin/postfix upgrade-configurationを実行する
- postfixを再起動する
MDA/pop3,IMAP Server
次に、メール配送関連の設定を行う。要するにMDAとしてpop3やIMAPを設定する。
今回は、MDAにdovecotを利用する。
Install
Dovecot 参照。
加えて、SSLを利用するならOpenSSLで自己認証証明書(おれおれCA)を作成を参照。
設定
いくつか考慮する点がある。
- Mailの保存先をNFSにした
- dovecotでSSLを利用して通信を保護する
というわけで、そう言う設定を入れてある。
- dovecot.conf
protocols = imaps ← dovecotではimapsのみを提供 listen = *, [::] ← IPv4/IPv6の両方でLISTENする disable_plaintext_auth = no ← plaintextでの認証を許可する(system passwordを利用するため) ssl = yes ← SSLを利用する ssl_cert_file = /etc/dovecot/certs/serv.cert ← サーバー証明書ファイル名 ssl_key_file = /etc/dovecot/private/serv_key.pem ← サーバー秘密鍵のファイル名 # ssl_key_password = xxxxxxxx ← サーバー秘密鍵のパスワード。今回はパスワードをはずしてあるので設定不要 ssl_ca_file = /etc/dovecot/certs/CAs.pem ← サーバー証明書が利用するための中間証明書やroot証明書をcatしたファイル名 mail_location = maildir:~/Maildir ← mailが保存されているDirectoryが${HOME}/Maildirであり、その形式がMaildir形式である namespace private { ← IMAPにおける名前空間の定義(courierからの移行に伴う措置。移行ではない場合不要 separator = . ← courier-imapに合わせる prefix = INBOX. inbox = yes } mmap_disable = yes ← mmapを利用しない(NFS対策) fsync_disable = no ← fsyncを利用しない(NFS対策) mail_nfs_storage = yes ← mail保存先がNFSであることを明示(NFS対策) mail_nfs_index = yes ← mailのindex保存先がNFSであることを明示(NFS対策) protocol imap { ← imap関連の設定。今回は特に設定なし } protocol pop3 { ← pop3関連の設定。今回は特に設定なし } protocol lda { ← dovecotのlocal配送システムを利用する場合の設定(今回はない) } auth default { ← 認証関係の設定 mechanisms = plain login ← 認証メカニズム。今回はplainとloginだけ。CRAM-MD5とかを利用する方法は今のところ不明 passdb passwd { ← password情報はシステム標準のpasswdを利用する } userdb passwd { ← user情報はシステム標準のpasswdを利用する } user = root ← password databaseを検索する時のUserID } } dict { ← dovecotが利用する辞書に関する情報。pluginが利用する場合が多いらしい } plugin { ← dovecot pluginに関する設定。今回は設定しない }
MTA/MDA のSASL認証連携
postfixにはSASL機能がない。従って、SASLでの認証を行うには、Cyrus-SASLを利用するか、dovecotのSASL機能を利用する必要がある。
管理するアプリケーションが増えると運用が大変になるので今回はdovecotのSASL機能を利用する。
postfixのmain.cfに以下の設定を追加
# For SASL smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = /var/spool/postfix/private/auth smtpd_sasl_security_options = noanonymous
今回の環境では、systemのパスワードファイルを使って認証する関係で、noplaintextを指定してはいけない。これを指定すると認証方法がなくなる。 なお、Virtual Hosting/Domainを利用する際に、LDAPと連動させてSystemのアカウントとMailのアカウントを分離する方法を記載する。
main.cfの各restrictionに以下を加える
restriction | parameter |
---|---|
smtpd_helo_restrictions | permit_sasl_authenticated |
smtpd_recipient_restrictions | permit_sasl_authenticated |
dovecotのdovecot.confに以下を加える
ssl = yes ← SSLを生かす ssl_cert_file = /etc/dovecot/certs/serv.cert ← Server証明書を指定 ssl_key_file = /etc/dovecot/private/serv_key.pem ← Server証明書の鍵を指定 ssl_ca_file = /etc/dovecot/certs/CAs.pem ← Server証明書に署名している中間証明書ファイルをcatしたもの ....(省略).... auth default { ← 既に存在するはず # Postfix SMTP Auth socket listen { ← 存在しているかもしれない client { ← 追加 path = /var/spool/postfix/private/auth ← 追加。Directoryはpostfixの設定と合わせること mode = 0660 ← 追加 user = postfix ← postfixの実行時のUID group = postfix ← postfixの実行時のGID } ← 追加 } ← 存在しているかもしれない } ===== postfixでTLS ===== ここまでが全部設定できたら、MTAのTLS対応を行う。 機能を一つ一つじっくり試しながら実装しないと、結局最初からやり直しになってしまう事が多く、Debugもはかどらないので注意。 まず、main.cfにTLS関係の設定を入れる <code> # for TLS smtpd_use_tls = yes ← smtpdはTLSを許容する smtpd_tls_CAfile = /etc/dovecot/certs/CAs.pem ← Server証明書に署名している中間証明書ファイルをcatしたもの smtpd_tls_cert_file = /etc/dovecot/certs/serv.cert ← サーバー証明書ファイル smtpd_tls_key_file = /etc/dovecot/private/serv_key.pem ← サーバー秘密鍵ファイル smtpd_tls_session_cache_database = btree:/var/db/postfix/smtpd_scache ← TLS sessionのキャッシュデータ smtpd_tls_loglevel = 1 ← TLSのdebug用 logレベル #smtpd_tls_loglevel = 3 ← 細かいDebugをするなら、loglebelを3にする
今回は、Wildcard証明書を発行したので、証明書も共用する。しかし、証明書は本来ホスト毎、サービス毎に分けるのが筋なので、別々に証明書を作って利用しても良い。 その場合いには、証明書ファイルを適切な名前に置き換えること。
次に、OP25B対策として、submission関連の設定をする。また、smtpdに関する設定も行う。master.cfに以下の様な変更を加える。
- 標準では、submission portの設定はoffになっているので、これを生かす
- 標準ではsmtpsの設定はoffになっているので、これを生かす
- 標準ではtlsmgrのtimeoutが長いので変更
....(省略) .... smtp inet n - n - - smtpd ← 標準 submission inet n - n - - smtpd ← コメントを外して生かす(この行末のsmtpdをsmtpd -vに置き換えると、debugに便利) -o smtpd_enforce_tls=yes ← submissionでの通信では、TLSを強制する -o smtpd_sasl_auth_enable=yes ← SASL認証を生かす -o smtpd_client_restrictions=permit_sasl_authenticated,reject ← SASL認証を行ったclientに対してはClient確認を行わない smtps inet n - n - - smtpd ← コメントを外して生かす(この行末のsmtpdをsmtpd -vに置き換えると、debugに便利) -o smtpd_tls_wrappermode=yes ← smtpdがTLSをWrapperとして利用できるようにする -o smtpd_sasl_auth_enable=yes ← SASL認証を生かす # -o smtpd_client_restrictions=permit_sasl_authenticated,reject ← この行を生かせという記述が散見されるが、これを生かすとなぜかエラーになる。 #628 inet n - n - - qmqpd .... (省略) .... tlsmgr unix - - n 300 1 tlsmgr ← 1000?を300に置き換える .... (snip) ....
これでpostfixを再起動すると、postfixがTLSで通信するようになる。
Webmail
ここまで設定すると、Web Mailも利用できるようになると嬉しい。というわけで、Webmailに関する設定を行う。
今回はWeb MailのシステムとしてSquirrel Mailを利用する。
Install
Installはpkgsrcから行った。Squirrelmailを参照
設定
Squirrelmail側はほとんど設定することがない。こちら側の設定はSquirrelmailを参照。
今回は、dovecotとsquirrelmailを同じサーバーで動かしているので、IMAPsを利用する必要がない。これは、UNIX Domain Socket(localhost)を利用して通信するため。 そのため、dovecotに以下の設定を追加。
- localhostからの通信だけ、imapを許容する。
この設定は、dovecot.confに以下の行を追加することで設定できる。
protocols = imaps imap ← imapを追加 protocol imap { listen = 127.0.0.1:143 [::1]:143 ← 127.0.0.1/::1からだけimapでの通信を許可 ssl_listen = *:993 [::]:993 ← SSLでの通信はどこからでも許可 }
これで、SquirrelMailが利用できるようになる。
milter
postfixは、sendmail互換のMilterを利用できる。
milterは、Mailに対するFilterとして動作するため、これを利用することで様々な制御が行えるようになる。
今回は、j-checkmail(Mail Filter)とenma(SPF対応)を利用することにする。なお、将来dkimに対応するため、dkim-milterも入れてはあるのだが今回はまだ設定しない。
Debug
SSL/TLSは、本質的には暗号化をするので、Debugが大変である。また、SASLは認証なので、十分にテストすべきである。しかし、telnetだけでチェックをするのはなかなか難しかった。
今回はまったErrorに関して
cannot get RSA certificate from file
- よく見たら、
smtpd_tls_cert_file
で指定しているファイル名が間違っていた。当然SSL/TLS出来るわけがない。修正して問題は解決
Error: command not recognized
- SSLでうまく通信できていなかったので、postfixのmain.cfに
smtpd_tls_loglevel = 3
を加え、master.cfのsmtpdに-vを加えてみた - 原因がちっとも判らなかったのだが、色々ためしてみた結果、master.cfで
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
を指定しているとこのエラーになった。 - main.cfでsmtpd_client_restrictionsを設定しているので思い切って消したら正常に動作した。これはこれでBugのような気もするが、とりあえずOK
- 当然、SSLを使っている場合のRelay Checkも行う必要がある。
- この場合は、各Restrictionに定義してある permit_sasl_authenticatedをコメントアウトして、メールを送る際のFrom:行を適当に置き換えてCheckするなどしなければならない。
なおDebugの際、wiresharkを利用してtcp.port==25とかtcp.port==587とかでfilterしながらpacketを見ると、SSL通信しているかどうかが判る。
Virtual Hosting
Mail ServerでVirtual Hostingする場合の設定。
MailのVirtual Hostを提供する場合、ユーザー管理がまず問題になる。今回は、LDAPを利用してユーザー管理を行う事にする。
- OpenLDAP Open LDAPをInstallする
- MTA/SMTP Server SMTP Serverをとりあえず動かす
- MDA/pop3,IMAP Serverをとりあえず動かす
今回参考にしたページ
事前準備
* postfixの送受信に関するポリシーは、MTA/SMTP Serverと同じとする * POP/IMAPの利用に関するポリシーは、MDA/pop3,IMAP Serverと同じとする
LDAPを利用するので、以下の項目に関して事前に決めておく。
管理する仮想ドメイン | example.net , example.com |
メール管理アカウント(for postfix) | virtmail (UID: 900) |
メール保存ディレクトリ | /var/mail/example.net, /var/mail/example.com |
LDAP Data構造 | 図参照 |
LDAP suffix | o=example |
LDAP bind DN | cn=Manager, o=example |
LDAP bind passwd | ldap-pass |
また、LDAPの管理にはphpLDAPadminを利用する
OpenLDAPの設定
次にOpenLDAPの設定を行う。
- LDAP標準のschemaではpostfixを使う際に色々不足しているので、新たにschemaを作成する。ファイルは/usr/pkg/etc/openldap/schema/mail.schemaとする
- mail.schema
attributetype (1.1.2.1.1.1 NAME 'mailForward' DESC 'forward address' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype (1.1.2.1.1.2 NAME 'mailAlias' DESC 'alias address' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype (1.1.2.1.1.4 NAME 'mailDir' DESC 'path of maildir' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE) attributetype (1.1.2.1.1.7 NAME 'accountActive' DESC 'active or not active' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE) attributetype (1.1.2.1.1.8 NAME 'domainName' DESC 'domain name' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE) attributetype (1.1.2.1.1.10 NAME 'transport' DESC 'transport' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype (1.1.2.1.1.11 NAME 'mailDrop' DESC 'drop address' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) objectClass (1.1.2.2.1.1 NAME 'mailGroup' DESC 'ML Group Account Object' SUP inetOrgPerson MUST ( accountActive $ domainName $ mailDrop )) objectClass (1.1.2.2.1.2 NAME 'mailUser' DESC 'mail user Object' SUP inetOrgPerson MUST ( transport $ mailDir $ homeDirectory $ accountActive $ domainName $ userPassword ) MAY ( mailForward $ mailAlias ))
- slapd.confを修正し、mail.schemaを読み込むようにする。またindexの指定を行う
include /usr/pkg/etc/openldap/schema/mail.schema ← 追加 ....(省略).... index uid,mail eq,pres,sub ← もし指定されていなければ、追加
- 一度openldapを起動し、問題なく起動できたら再度停止する。
- openldapのindexファイルを作り直す
# /usr/pkg/sbin/slapindex
- slapdを起動
/etc/rc.d/slapd start
- 初期データを作成する。
- 大本のTopを作成する。
- Top.LDIF
# Root node dn: o=example ← dnの定義 objectClass: organization o: example ← dnで指定した値を記載 dn: ou=vmail,o=example ← vmailがexampleの配下にあることを示す(vmailコンテナーの作成) objectClass: organizationalUnit ou: vmail ← ou=vmailを定義
- 管理するドメインのTreeを作成する。
- Vdom.LDIF
# example.net dn: dc=example.net,ou=vmail,o=example ← example.netコンテナーの作成 objectClass: dcObject ← 必ずdcObjectであることを定義する objectClass: organization dc: example.net ← dcObjectであるので、dcを定義。 o: example ← Organization情報を記載。 # user container dn: ou=user,dc=example.net,ou=vmail,o=example ← User格納用コンテナーの作成 objectClass: organizationalUnit ou: User # example.com dn: dc=example.com,ou=vmail,o=example ← example.netコンテナーの作成 objectClass: dcObject ← 必ずdcObjectであることを定義する objectClass: organization dc: example.com ← dcObjectであるので、dcを定義。 o: example ← Organization情報を記載。 # user container dn: ou=user,dc=example.com,ou=vmail,o=example ← User格納用コンテナーの作成 objectClass: organizationalUnit ou: User
- それぞれのドメイン毎に利用者を作成する
- example.net.users.LDIF
# 実ユーザーの場合 # test1 メール転送無し dn: uid=test1,ou=User,dc=example.net,ou=vmail,o=example ←アカウントの情報 ou以下はコンテナー情報 objectClass: mailUser ← mail.schemaで定義したObject Classを記載 cn: TEST ← 一般には名字(Last name/Family name) sn: Test-1 ← 一般には名前(First name) uid: test1 ← UID (dnで定義した値) userPassword: himitu ← パスワード。ここではPlainで記載した。 homeDirectory: /home/vmail/example.net/test1 ← Home Directory mailDir: example.net/test1/Maildir/ ← Mail Directory mail: test1@example.net ← Mail address transport: virtual ← postfix用定義。virtual transportを利用する accountActive: TRUE ← Accountが有効かどうか domainName: example.net ← ドメイン名 # test2 メール転送あり dn: uid=test2,ou=User,dc=example.net,ou=vmail,o=example objectClass: mailUser cn: TEST sn: Test-2 uid: test2 userPassword: himitu homeDirectory: /home/vmail/example.net/test2 mailDir: example.net/test2/Maildir/ mail: test2@example.net mailForward: test2@example.com ← メールの転送先 transport: virtual accountActive: TRUE domainName: example.net # いわゆるalias。 # postmaster メール管理者。作成するべき dn: uid=postmaster,ou=User,dc=example.net,ou=vmail,o=example objectClass: mailGroup ← Alias定義 mail: postmaster@example.net ← Mail Address uid: postmaster ← UID cn: postmaster sn: ML User domainName: example.net accountActive: TRUE mailDrop: test1@example.net ← postmaster当てのメールを転送するユーザー mailDrop: test2@example.com # webmaster dn: uid=webmaster,ou=User,dc=example.net,ou=vmail,o=example objectClass: mailGroup mail: webmaster@example.net uid: webmaster cn: webmaster sn: ML User domainName: example.net accountActive: TRUE mailDrop: test2@example.net
- それぞれのファイルが作成できたら、LDAPに登録する
Topの作成 $ ldapadd -x -h ldap.server.hostname -D "cn=Manager,o=example" -w ldap-pass -f Top.ldif ドメインの登録 $ ldapadd -x -h ldap.server.hostname -D "cn=Manager,o=example" -w ldap-pass -f Vdom.ldiff ユーザの登録 $ ldapadd -x -h ldap.server.hostname -D "cn=Manager,o=example" -w ldap-pass -f example.net.ldif
- errorが出なければ登録されている。
mail.schemaの説明
今回の設定では、LDAPに登録するmail情報のために mail.schemaを利用している。
オブジェクトクラス
objectClass名 | 説明 |
---|---|
mailUser | ユーザ用メールアカウント |
スキーマのデータ属性(attributetype)
属性名 | 説明 | 参照先 |
---|---|---|
transport | SMTPのtransport設定(基本的に“virtual”で固定) | Postfix |
domainName | 所属ドメイン名 | Postfix |
mailDir | SMTPのメール配送先ディレクトリ | Postfix |
accountActive | アカウントの有効/無効をTRUE/FALSEで指定 | Postfix、Dovecot |
mailForward | 転送先メールアドレス | Postfix |
mailAlias | 別名メールアドレス(エイリアス) | Postfix |
今回登録されるユーザー情報構造
属性名 | 説明 | 値の例 | 必項属性 | |
---|---|---|---|---|
cn | ラストネーム | TEST | 必項 | |
sn | ファーストネーム | Test-1 | 必項 | |
uid | ユーザID | test | 必項 | 今回は必ずしも数字である必要はない |
userPassword | パスワード | HIMITSUNOMOJIRETU | 必項 | |
homeDirectory | ユーザのホームディレクトリ | /home/vmail/examplenet/[uid] | 必項 | |
mailDir | ユーザのMailDirディレクトリ(SMTPの配送先) | example.net/[uid]/MailDir/ | 必項 | |
ユーザのメールアドレス | test1.example.net | 必項 | ||
mailForword | 転送先メールアドレス | foo@some.domain | 任意 | |
mailAlias | 別名メールアドレス(Alias) | postmaster@example.net | 任意 | |
accountActive | アカウントの有効/無効をTRUE/FALSEで指定 | TRUE | 必項 | |
domainName | 所属ドメイン名(dn:のdc=の値) | example.net | 必項 |
- 属性の詳細
- uid
- 今回は利用しない。Unixへのlogin等を管理する場合には数字を入れておく。
- mailForword
- mail及びmailAlias宛に来たメールを転送する転送先。
- mail
- ユーザーのメールアドレス。今回は認証にこの情報を利用する
- mailAlias
- 設定されたメールアドレス宛のメールを受信する
- accountActive
- “FALSE”に設定すると、一時的にこのアカウントの利用を停止できる
postfix設定
ここまで設定できれば、あとは postfixがLDAPの情報を利用できるようにするだけである。
main.cfの更新
main.cfに以下の設定を加える
# for Virtual Domains with LDAP virtual_mailbox_limit = 104857600 ← 少なくともmessage_size_limit以上にすること transport_maps = ldap:/etc/postfix/transport.cf ← transportの検索(LDAP) virtual_alias_maps = ldap:/etc/postfix/account.cf,ldap:/etc/postfix/group.cf ← アカウントやグループデータの検索(LDAP) virtual_mailbox_base = /home/vmail ← メールボックスを置くディレクトリ virtual_mailbox_domains = ldap:/etc/postfix/VIRTUAL/vdomain.cf ← 仮想ドメインの検索(LDAP) virtual_mailbox_maps = ldap:/etc/postfix/VIRTUAL/maildir.cf ← Mail保存ディレクトリの検索(LDAP) virtual_uid_maps = static:900 ← 仮想メールボックスのUID(固定) virtual_gid_maps = static:900 ← 仮想メールボックスのUID(固定) local_transport = local ← 仮想domain出はない場合のtransport手法の指定
いくつかのファイルの追加
main.cfで定義したファイルの作成
- transport.cf
server_host = localhost #server_host = ldap1.some.domain, ldap2.some.domain ← サーバーが複数ある場合 search_base = ou=vmail,o=example query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE)) result_attribute = transport
- account.cf
server_host = localhost #server_host = ldap1.some.domain, ldap2.some.domain ← サーバーが複数ある場合 search_base = ou=vmail,o=example query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE)) result_attribute = mail, mailForward
- group.cf
server_host = localhost #server_host = ldap1.some.domain, ldap2.some.domain ← サーバーが複数ある場合 search_base = ou=vmail,o=example query_filter = (&(objectClass=mailGroup)(mail=%s)(accountActive=TRUE)) result_attribute = mailDrop
- vdomain.cf
server_host = localhost #server_host = ldap1.some.domain, ldap2.some.domain ← サーバーが複数ある場合 search_base = ou=vmail,o=example query_filter = (domainName=%s) result_attribute = domainName
- maildir.cf
server_host = localhost #server_host = ldap1.some.domain, ldap2.some.domain ← サーバーが複数ある場合 search_base = ou=vmail,o=example query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE)) result_attribute = mailDir
postfix再起動
通常どおり、postfixを再起動する。
テスト
通常どおり、メールの試験をする。特に、Mailの送受信に関しては、正しくメールが配送されているかを確認すること。 /var/log/maillogや、main.cfで指定したhome dir、mail dir等を見ながら、何が起こっているのか確認する必要がある。
dovecot設定
dovecotの設定を行う。これは非常に簡単。
auth defaultで、ldapでの認証を行う
auth default { <---認証の設定 mechanisms = plain passdb ldap { args = /usr/pkg/etc/dovecot-ldap.conf } userdb ldap { args = /usr/pkg/etc/dovecot-ldap.conf }
- dovecot-ldap.conf
# Debug #debug_level = 3 ← Debug用 hosts = localhost tls = no auth_bind=yes ldap_version = 3 base = ou=vmail,o=example deref = never scope = subtree user_attrs = homeDirectory=home user_filter = (&(objectClass=mailUser)(mail=%u)(accountActive=TRUE)) pass_attrs = uid=mail pass_filter = (&(objectClass=mailUser)(mail=%u)(accountActive=TRUE)) default_pass_scheme = PLAIN
これで設定は終了。通常どおりに再起動して、試験を行うこと。
phpLDAPadmin
Download
Downloadページから最新版のphpLDAPadminをダウンロードする。