転載・引用について

ユーザ用ツール

サイト用ツール


サイドバー

Site Contents Index

転載・引用について

RSS

serverapp:mail

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を上げた場合
    1. とにかく変更点を確認する
    2. /usr/pkg/sbin/postfix upgrade-configurationを実行する
    3. 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を利用してユーザー管理を行う事にする。

  1. OpenLDAP Open LDAPをInstallする
  2. MTA/SMTP Server SMTP Serverをとりあえず動かす
  3. MDA/pop3,IMAP Serverをとりあえず動かす

今回参考にしたページ

  • 今回のL4構成
  • 今回のLDAPの構造

事前準備

* 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の設定を行う。

  1. 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 ))
  2. slapd.confを修正し、mail.schemaを読み込むようにする。またindexの指定を行う
    include         /usr/pkg/etc/openldap/schema/mail.schema		← 追加
    ....(省略)....
    index   uid,mail	eq,pres,sub					← もし指定されていなければ、追加
  3. 一度openldapを起動し、問題なく起動できたら再度停止する。
  4. openldapのindexファイルを作り直す
    # /usr/pkg/sbin/slapindex
  5. slapdを起動
    /etc/rc.d/slapd start
  6. 初期データを作成する。
    • 大本の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/ 必項
mail ユーザのメールアドレス 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

phpLDAPadminは、WubGUIでLDAPのデータを管理するための管理ツールである。

Download

Downloadページから最新版のphpLDAPadminをダウンロードする。

このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
serverapp/mail.txt · 最終更新: 2018/05/14 13:12 (外部編集)