Postfix+Dovecot+OpenLDAPでメールサーバ Type-1

Postfix + Dovecot + OpenLDAPによるメールサーバ構築です。

構築環境は、CentOS-5を前提にしてますが、他のデェストリビューションでも差異は少ないと思います。

それぞれのバージョンは、Postfix-2.3.3、Dovecot-1.0.7、OpenLDAP-2.3.43を利用しました。

 

なお、ここでは、バーチャルドメインでMailboxはMaildir形式を採用していますが、この組み合わせだと、PostfixでQuotaが正確に動作しません。

これを回避するには、PostfixにPostfix VDAのパッチを当てる必要があります。

今回は、VDAパッチが適応されているPostfixのRPMを利用しました。

 

 

Postfix+Dovecot+OpenLDAP構成のシステム設定例

当サイトでは現在3パターンのシステム構成例を掲載しています。

Postfix+Dovecot+OpenLDAPでメールサーバ Type-1

Postfix+VDAパッチでQuota管理、SMTP認証にはCyrus-SASLを利用した例

 

Postfix+Dovecot+OpenLDAPでメールサーバ Type-2
Dovecot-1.0系を利用しQuotaを管理し、Dovecot Sieveパッチでメール振り分けを実施。SMTP認証にはDovecot-SASLを利用した例

 

Postfix+Dovecot+OpenLDAPでメールサーバ Type-3
Dovecot-2.0系を利用しQuotaを管理し、Dovecot-Pigeonhole sieveでメール振り分けを実施。SMTP認証にはDovecot-SASLを利用した例

 

 

メールサーバの概要

今回構築するのは、バーチャルドメインのメールサーバで、以下のプロトコルをサポートしています。

SMTP、SMTPS、POP、POPS、IMAP IMAPSです。

SMTP認証にはCyrus-SASLで実装します。

また、メールボックスはMailDir形式とします。

ユーザー管理はOpenLDAPに一元化し、認証には、ユーザIDとパスワードを利用します。

送受信の概要は以下のようになります。

 

 

OpenLDAP

今回の構成では、ユーザ管理にOpenLDAPを利用します。

なお、OpenLDAPを用いる場合は、キャッシュ機能を提供する、nscdを実行される事をお勧めします。

 

OpenLDAPのインストール

OpenLDAPのインストールと初期設定が必要ですが、ここでは割愛させていただきます。

OpenLDAPのインストールと設定については、こちらを参照ください。

 

メール用スキーマの作成

OpenLDAPのデータ定義はスキーマファイルによって決められています。

今回構築するシステムでは、標準のスキーマだけでは足りないため、独自に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.12 NAME 'mailQuota'
    DESC 'Mail Home Directory Max byte'
    EQUALITY integerMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE)

objectClass (1.1.2.2.1.2 NAME 'mailUser'
    DESC 'mail user Object'
    SUP inetOrgPerson
    MUST ( transport $ mailDir $ homeDirectory $ accountActive $ domainName $ userPassword $ mailQuota )
    MAY  ( mailForward $ mailAlias ))

 

mail.schemaの解説

スキーマにはメールシステムで利用する要素とオブジェクトクラスが定義してあります。

スキーマのデータ属性(attributetype)

属性名 説明 参照先
transport SMTPのtransport設定(基本的に”virtual”で固定) Postfix
domainName 属ドメイン名 Postfix
mailDir SMTPのメール配送先ディレクトリ Postfix
accountActive アカウントの有効/無効をTRUE/FALSEで指定 Postfix、Dovecot,Cyrus-SASL
mailForward 転送先メールアドレス Postfix
mailAlias 別名メールアドレス(エイリアス) Postfix
mailQuota メールボックスのQuota Postfix

オブジェクトクラス

objectClass名 説明
mailUser ユーザ用メールアカウント

 

OpenLDAPの設定

mail.schemaを、OpenLDAPのschemaファイルの保存先にコピーします。

cp mail.schema /etc/opemldap/schema/

 

OpenLDAPのslapd.confでmail.schemaのinclude、index、アクセス制限などの設定を行います。

include		/etc/openldap/schema/core.schema
include		/etc/openldap/schema/cosine.schema
include		/etc/openldap/schema/inetorgperson.schema
include		/etc/openldap/schema/nis.schema
include		/etc/openldap/schema/mail.schema

# Allow LDAPv2 client connections.  This is NOT the default.
allow bind_v2

pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

database	bdb
suffix		"o=unixlife,c=JP"
rootdn		"cn=Manager,o=unixlife,c=JP"
rootpw		{MD5}lsKji-Ji.Ljyd=

directory	/var/lib/ldap

ndex objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

access to dn.subtree="ou=Mail,o=unixlife,c=JP" attrs=userPassword
	by self write
	by anonymous auth
	by * none
access to *
	by self write
	by * read

 

OpenLDAPの起動確認

slapd.confの設定をしましたので、OpenLDAPが正常に起動するか確認します。

OpenLDAPを起動後、以下のコマンドを発行してください。

ldapsearch -x -b '' -s base +

ずらずらずら、とメッセージがでれば取りあえず起動は成功です。

ldap_bind: Can’t contact LDAP serverって出たら、残念、起動に失敗してますので、設定ファイルを見直してください。

 

indexの再構築

slap.confでindexの設定をしましたので、indexの再構築も実施しておきます。

slapindex -v -b o=unixlife,c=JP -f slapd.conf

 

 

メールシステム用登録データの作成

OpenLDAPにメールシステム用のldifを流し込みデータを登録します。

 

メールシステム用LDAPツリーの設計

メールシステム用で利用するツリー構成です。

				------------------------
				|rootdn:o=unixlife,c=JP|
				------------------------
					|
				-------------------------
				|ou=Mail,o=unixlife,c=JP|
				-------------------------
				|			|
----------------------------------------	----------------------------------------
|dc=unixlife.jp,ou=Mail,o=unixlife,c=JP|	|dc=examples.com,ou=Mail,o=unixlife,c=JP|
----------------------------------------  	-----------------------------------------
				|			|
-------------------------------------------------  ---------------------------------------------------
|uid=u001,dc=unixlife.jp,ou=Mail,o=unixlife,c=JP|  |uid=ex001,dc=examples.com,ou=Mail,o=unixlife,c=JP|
-------------------------------------------------  ---------------------------------------------------
	|uid=u002,・・・・・・・・・・・・・		|uid=ex002,・・・・・・・・・・・・・・
	--------------------------------------		---------------------------------------
		|uid=u003,・・・・・・・・・・・・・・		|uid=ex003,・・・・・・・・・・・・・
		-------------------------------------		-------------------------------------

バーチャルドメインでの利用を前提としたツリー構成としました。

ここでは、unixlife.jpとexamples.comの2つのドメインを管理し、そのドメイン配下にユーザーを追加する形としました。

 

 

OpenLDAPへの登録データの作成

OpenLDAPへのデータ登録はldifファイルを作成し行います。ファイルは文字コードをUTF-8で作成してください。

 

TOPツリーデータの作成(top.ldif)

まずは、最低限必要なLDAPのTOPとMail用データを作成します。

top.ldif

dn: o=unixlife,c=JP <---LDAPのTOPツリー
objectClass: organization
o: unixlife

dn: ou=Mail,o=unixlife,c=JP <---Mailツリー
objectClass: organizationalUnit
ou: Mail

 

ドメインのデータ作成(domain.ldif)

ドメインのデータを作成します。ここでは、unixlife.jpとexamples.comを作成します。

domain.ldif

dn: dc=unixlife.jp,ou=Mail,o=unixlife,c=JP <---unixlife.jpドメイン
objectClass: dcObject
objectClass: organization
dc: unixlie.jp
o:  unixlife

dn: dc=examples.com,ou=Mail,o=unixlife,c=JP <---examples.comのドメイン
objectClass: dcObject
objectClass: organization
dc: examples.com
o:  unixlife

 

ユーザデータの作成

メールユーザ用データを作成しますが、ここには多くの設定項目がありますので、まずは項目別の表を参照してください。

属性名 説明 値の例 必項属性
cn ラストネーム tomoya 必項
sn ファーストネーム sakurai 必項
uid ユーザID u001 必項
userPassword パスワード {MD5}kd.ssjdytTrg= 必項
homeDirectory ユーザのホームディレクトリ /home/vmail/unixlife.jp/u001 必項
mailDir ユーザのMailDirディレクトリ(SMTPの配送先) unixlife.jp/u001/MailDir/ 必項
mail ユーザのメールアドレス to_sakurai@unixlife.jp 必項
mailForword 転送先メールアドレス hogehoge@hogehoge.com 任意
mailAlias 別名メールアドレス(Alias) webmaster@unixlife.jp 任意
accountActive アカウントの有効/無効をTRUE/FALSEで指定 TRUE 必項
domainName 所属ドメイン名(dn:のdc=の値) unixlife.jp 必項
mailQuota メールQuotaの容量設定(例:20MB)。0=無制限 20480000 必須
transport transport基本的にvirtualで固定 virtual 必須

 

属性の詳細説明

・uid

ユーザ認証用にUIDを利用しています。認証のIDにメールアドレスを利用する事も多いですが、メールアドレスは一般に広く公開する物のため、認証用IDには向かないと判断している為です。

・mailForword

mail及びmailAlias宛に来たメールを、ここに設定されたメールアドレスへ転送します。

・mailAlias

設定されたメールアドレス宛のメールも受信します。

・accountActive

“FALSE”に設定すると、一時的にこのアカウントの利用を停止できます。

では、実際にメールユーザ登録用ldifファイル(user.ldif)を作成します。

 

ユーザデータの作成(user.ldif)

ここでは、unixlife.jpに2名、examples.comに1名作成します。

user.ldif

dn: uid=u001,dc=unixlife.jp,ou=Mail,o=unixlife,c=JP
objectClass: mailUser
cn:sakurai
sn:tomoya
uid: u001
userPassword: {MD5}kJ.HtIols6ks=
homeDirectory: /home/vmail/unixlife.jp/u001
mailDir: unixlife.jp/u001/MailDir/
mail: to_sakurai@unixlife.jp
mailAlias: webmaster@unixlife.jp
accountActive: TRUE
domainName: unixlife.jp
mailQuota: 20480000
transport: virtual

dn: uid=u002,dc=unixlife.jp,ou=Mail,o=unixlife,c=JP
objectClass: mailUser
cn:yamada
sn:taro
uid: u002
userPassword: {MD5}Jrtd.LouyTrf=
homeDirectory: /home/vmail/unixlife.jp/u002
mailDir: unixlife.jp/u002/MailDir/
mail: ta_ito@unixlife.jp
accountActive: TRUE
domainName: unixlife.jp
mailQuota: 20480000
transport: virtual

dn: uid=ex001,dc=examples.com,ou=Mail,o=unixlife,c=JP
objectClass: mailUser
cn:ito
sn:jiro
uid: ex001
userPassword: {MD5}JROlkJ.Sdjk=
homeDirectory: /home/vmail/examples.com/ex001
mailDir: examples.com/ex001/MailDir/
mail: ji_ito@examples.com
accountActive: TRUE
domainName: examples.jp
mailQuota: 10240000
transport: virtual

 

メールデータ用ldaifデータの登録

ようやくデータファイルの作成が終了しましたので、これをLDAPに登録して行きます。

TOPツリー用ldifの登録

ldapadd -x -h localhost -D "cn=Manager,o=unixlife,c=JP" -w パスワード -f top.ldif

 

ドメイン用ldifの登録

ldapadd -x -h localhost -D "cn=Manager,o=unixlife,c=JP" -w パスワード -f domain.ldif

 

ユーザ用ldifの登録

ldapadd -x -h localhost -D "cn=Manager,o=unixlife,c=JP" -w パスワード -f user.ldif

 

これで必要なデータはLDAPに登録されました。

登録データの検索や更新などの実験をアクセス権限の確認も含めやってみてください。

 

 

Postfix

PostfixにはCyrus-SASLによるSMTP認証とTLS/SSLでの通信暗号化も行いますが、これは次節以降に順次設定していきます。

まずは、PostfixとOpenLDAPの連係とバーチャル環境でのメール配送の動作を確認していきます。

 

Postfixのインストール

Postfixをインストールして、デフォルトのMTAに設定します。

Postfixは本サイトで公開しているVDAパッチ適用済みのRPMを利用します。

 

RPM取得用のリポジトリを設定

リポジトリ設定用RPMの取得とインストール

・i386(32bit)用パッケージの取得とインストール

wget http://unixlife.jp/rpmrepos/centos/5/unixlife/i386/unixlife-release-0.1.0-1UL01.i386.rpm
rpm -ivh unixlife-release-0.1.0-1UL01.i386.rpm

 

・x86_64(64bit)用パッケージの取得とインストール

wget http://unixlife.jp/rpmrepos/centos/5/unixlife/x86_64/unixlife-release-0.1.0-1UL01.x86_64.rpm
rpm -ivh unixlife-release-0.1.0-1UL01.x86_64.rpm

 

リポジトリを更新します。

yum update

 

インストール

VDAパッチ適用版のPostfixをインストールします。

yum install postfix

 

PostfixをデフォルトのMTAに変更します。

alternatives --config mta

 

バーチャル環境の配送ユーザと配送先ディレクトリの作成

バーチャル環境では、実際にメール配送するユーザアカウントは1つです。

そこで、このメール配送用アカウントとメールの配送先ディレクトリを先に作成します。

メール配送ユーザの作成

グループの作成

groupadd -g 500 vmail

 

ユーザの作成

useradd -g 500 -s /sbin/nologin -u 500 vmail

 

配送先ディレクトリの作成

ここでは、2つのドメインを扱うため、それぞれのディレクトリを作成します。

mkdir -p /home/vmail/unixlife.jp
mkdir -p /home/vmail/examples.com
chmod -R 700 /home/vmail
chown -R vmail.vmail /home/vmail

 

 

Postfixの設定

Postfixの設定は、master.cfとmain.cfで行います。

ここでは、メール配送に関する設定をmain.cfにしていきますが、SMTP認証の設定がまだですので、ローカルでしかメールの配送が出来ない設定にしてあります。

main.cfは、最下行に以下の内容を追加する形で設定していきます。

なお、今回利用するドメインは、OpenLDAPに登録した”unixlife.jp”と”examples.com”です。

/etc/postfix/main.cf

#inet_interfaces = localhost <---コメントにする
myhostname = mail.unixlife.jp
mydomain = unixlife.jp
mynetworks = 127.0.0.0/8
mydestination = $myhostname, localhost.$mydomain, localhost		

message_size_limit = 10240000 <---1メッセージの最大容量(10MB)
mailbox_size_limit = 51200000 <---メールボックスの最大容量(50MB)

transport_maps = ldap:/etc/postfix/transport.cf <---LDAPから取得、通常はvirtual

virtual_alias_maps = ldap:/etc/postfix/account.cf <---LDAPからメールアドレスを取得

virtual_mailbox_domains = ldap:/etc/postfix/vdomain.cf <---LDAPからドメインを取得
virtual_mailbox_base = /home/vmail <---メールボックスのベースディレクトリ
virtual_mailbox_maps = ldap:/etc/postfix/maildir.cf <---LDAPから配送ディレクトリを取得
virtual_mailbox_limit_override = yes <---mailbox_size_limitよりvirtual_mailbox_limitを優先させる
virtual_mailbox_limit = 0 <---メールボックスの最大容量(リミット無し)
virtual_mailbox_limit_maps = ldap:/etc/postfix/quota.cf <---LDAPからQuota値を取得
virtual_overquota_bounce = yes <---Quotaを超えた場合、送信者にメッセージを送信する
virtual_mailbox_limit_inbox = no <---Quotaの対象をinBoxに限定する(用途により使い分けください)
virtual_uid_maps = static:500 <---メール配送時のユーザ
virtual_gid_maps = static:500 <---メール配送時のグループ

local_transport = local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

unknown_local_recipient_reject_code = 550

# Relay Settings  <---アクセス制限
smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination

OpenLDAPからデータを取得するための設定ファイルを作成していきます。

main.cf内には、OpenLDAPよりデータを取得するための設定ファイルが読み込まれています。

このファイルの書式は以下の通りです。

server_host = OpenLDAPのホストを指定

search_base = 検索dn:を指定

query_filter = 検索条件を指定(%sはメールアドレス)

result_attribute = 検索後に取得したい値を持つ、属性を指定

例えば、Postfixのバーチャル環境での配送先ディレクトリの設定は、”virtual_mailbox_maps = “に指定します。

設定ファイルを/etc/postfix/maildir.cfに設定し、main.cfに”ldap:/etc/postfix/maildir.cf”と指定すると、maildir.cfの”result_attribute = mailDir”の帰り値を利用できます。

以下で、必要なファイルを作成していきます。

 

トランスポート値の取得

/etc/postfix/transport.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = ou=Mail,o=unixlife,c=JP
query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE))
result_attribute = transport

 

メールの配送アドレスを取得

/etc/postfix/account.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = ou=Mail,o=unixlife,c=JP
query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE))
result_attribute = mail, mailForward

メールの所属ドメインを取得

/etc/postfix/vdomain.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = ou=Mail,o=unixlife,c=JP
query_filter = (domainName=%s)
result_attribute = domainName

 

メールの配送先ディレクトリを取得

/etc/postfix/maildir.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = ou=Mail,o=unixlife,c=JP
query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE))
result_attribute = mailDir

quota.cf値の取得

/etc/postfix/quota.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = ou=Mail,o=unixlife,c=JP
query_filter = (&(objectClass=mailUser)(|(mail=%s)(mailAlias=%s))(accountActive=TRUE))
result_attribute = mailQuota

 

これで、ひとまずPostfixの設定は終了ですので、Postfixを再起動します。

/etc/init.d/postfix restart

 

 

メールの配送確認

設定が終了したら、メール配送のテストをしてください。

メールの配送テストは、”telnet”コマンドを利用すると良いでしょう。

なお、Postfixでは、配送時に配送ディレクトリが無ければ、Postfixが作成してくれます。

telnetコマンドを利用したメール配送テストは以下の用に利用します。

%telnet localhost 25 <---telnetでSMTP(25)へ接続
Trying 127.0.0.1...
Connected to rx7 (127.0.0.1).
Escape character is '^]'.
220 mail.unixlife.jp ESMTP Postfix
helo examples.com  <---helo 接続元ドメイン
250 mail.unixlife.jp
mail from: ji_ito@examples.com <---メール送信元(mail from:)
250 Ok
rcpt to: to_sakurai@unixlife.jp <---メール送信先(rcpt to:)
250 Ok
data  <---メール本文を入力するため"data"を入力
354 End data with .
Subject: TEST   <---メール件名を入力

Test Mail.  <---メール本文を入力
.   <---"."で入力終了

250 Ok: queued as D47GB7A2172
quit   <---telnet終了
220 Bye

これで、配送の確認ができればOKです。

 

 

Cyrus-SASLを利用したSMTP認証

メールサーバの不正中継を防止するために、SMTP認証を導入します。SMTP認証には、Cyrus-SASLを利用します。

設定ポリシとしては、自ホストからのSMTP接続には認証を除外しますが、それ以外は全て認証が必要とします。

なお、TLS/SSLはここでは設定しませんが、最終的にTLS/SSLの実装を行います。

と言うのは、認証方式にLogin/Plainを利用します。すなわちこれは、ログイン時のユーザIDとパスワードがネットワークを平分で流れて行くことを意味しています。したがって、TLS/SSL対応はできる限り実装してください。

 

Cyrus-SASLのインストール

今回は2つのパッケージを利用します。

yum install cyrus-sasl cyrus-sasl-plain

 

SMTP認証の設定

Cyrus-SASLの設定

/etc/saslauthd.confを以下の内容で作成

ldap_servers: ldap://localhost
ldap_servers: ldap://192.168.1.1, ldap://192.168.1.2 <---LDAPサーバが2台ある場合
ldap_search_base: ou=Mail,o=unixlife,c=JP
ldap_filter: (&(uid=%u)(accountActive=TRUE))

 

/etc/sasl2/smtpd.confを以下の内容で作成

pwcheck_method: saslauthd
mech_list: plain login

 

/etc/syscofnig/saslauthdを以下のように変更

# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/var/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
#MECH=pam
MECH=ldap <---ここ

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=

 

Postfix側の設定

Postfixのmain.cfで、Cyrus-SASLの有効かと、先ほど行っていたアクセス制限の設定を書き換えます。

# Relay Settings <---旧アクセス制限
#smtpd_recipient_restrictions = permit_mynetworks,permit_unauth_destination

# Cyrus-SASL Enable <---Cyrus-SASLの有効化
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd

# Relay Settings on Cyrus-SASL <---新アクセス制限(Cyrus-SASLを追加)
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

 

 

SMTP認証の動作確認

SMTP認証と機構が想定通り機能しているか試します。

これは、SMTPサーバが不正中継などに利用されない為にも、必要な作業です。

 

Cyrus-SASLとOpenLDAPとの連係確認

まずはCyrus-SASLがきちんとOpenLDAPを利用した認証ができるか試します。

Cyrus-SASLの認証テストには、”testsaslauthd”コマンドが 利用できます。

testsaslauthdの使い方は

testsaslauthd -u ユーザID -p パスワード

0: OK “Succes.”と出力されれば、Cyrus-SASLとOpenLDAPの連係はOKです。

 

SMTP認証機構の確認

SMTP認証が機能しているか確認します。これは”telnet”から行います。

%telnet localhost 25 <---ローカルホストの25番ポートに接続
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.example.jp.
Escape character is '^]'.
220 mail.unixlife.jp ESMTP Postfix
ehlo unixlife.jp <---ehloを発行
250-mail.unixlfie.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-XVERP
250 8BITMIME
auth plain <---認証方式を指定
334

250-AUTH LOGIN PLAINが出力されれば、SMPT-AUTHは動作しています。

 

SMTP認証確認の動作確認

実際にSMTP認証を有効にしてSMTPサーバに接続できるか試してください。

また、SMTP認証を利用しない場合、SMTPサーバを利用出来ない事を確認してください。

これには、適当なメールクライアントを利用するのが最もお手軽です。

 

不正中継の確認

不正中継も確認しておきましょう。

いくつかのサイトに、メールの不正中継チェックをしてくれる所がありますので、それを利用すると良いでしょう。

 

 

Dovecot

今回は、POP、IMAPサーバにDovecotを利用します。RedHatやCentOSでは5系から、標準パッケージとして提供されています。

インストールは、以下のコマンドで。

yum install dovecot

 

Dovecotの設定

Dovecotの設定は、基本設定の/etc/dovecot.confとLDAP連携用の/etc/dovecot-ldap.confで行います。

doveot.confの設定

## Dovecot configuration file

protocols = imap pop3 <---利用プロトコルを指定
mail_location = maildir:~/Maildir

syslog_facility = mail <---ログをsyslogで管理
#auth_verbose = yes
#auth_debug = yes
#auth_debug_passwords = yes

ssl_disable = yes

protocol imap { <---プロトコル毎の設定
}
protocol pop3 { <---プロトコル毎の設定
	pop3_uidl_format = %v-%u
}

auth default { <---認証の設定

 mechanisms = plain

 passdb ldap {
	args = /etc/dovecot-ldap.conf
 }
 userdb ldap {
	args = /etc/dovecot-ldap.conf
 }
}

 

dovecot-ldap.confの設定

# This file is opened as root, so it should be owned by root and mode 0600.
hosts = localhost <---LDAPサーバを指定
hosts = 192.168.1.1,192.168.1.2 <---LDAPサーバが2台ある場合

# Use TLS to connect to the LDAP server.
tls = no <---LDAP接続時にTLSを利用するかどうか指定
auth_bind = yes <---LDAPサーバにbindし利用する

# LDAP protocol version to use. Likely 2 or 3.
ldap_version = 3 <---LDAPのバージョンを指定

# LDAP base. %variables can be used here.
base = ou=Mail,o=unixlife,c=JP <---LDAPのベースDNを指定

# Dereference: never, searching, finding, always
deref = never

# Search scope: base, onelevel, subtree
scope = subtree

# User attributes are given in LDAP-name=dovecot-internal-name list. The
# internal names are:
#   uid - System UID
#   gid - System GID
#   home - Home directory
#   mail - Mail location
#
user_attrs = homeDirectory=home

# Filter for user lookup. Some variables can be used (see
# http://wiki.dovecot.org/Variables for full list):
#   %u - username
#   %n - user part in user@domain, same as %u if there's no domain
#   %d - domain part in user@domain, empty if user there's no domain
user_filter = (&(objectClass=mailUser)(uid=%u)(accountActive=TRUE))

# If you wish to avoid two LDAP lookups (passdb + userdb), you can use
# userdb prefetch instead of userdb ldap in dovecot.conf. In that case you'll
# also have to include user_attrs in pass_attrs field prefixed with "userdb_"
# string. For example:

# Filter for password lookups
pass_filter = (&(objectClass=mailUser)(uid=%u)(accountActive=TRUE))

#default_pass_scheme = MD5

user_global_uid = 500 <---Postfixで配送するユーザを指定
user_global_gid = 500 <---Postfixで配送するユーザを指定

Dovecotの設定は以上です。

 

POP、IMAPとも設定は終了していますので、動作確認を行ってください。

なお、認証の確認はtelnetで行う事ができます。

telnet localhost 110 <---telnetでPOPに接続
rying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Dovecot ready.
user ユーザID <---ユーザIDを入力
+OK
pass パスワード <---パスワードを入力
+OK Logged in.
quit <---接続を切断
+OK Logging out.
Connection closed by foreign host.

ここでは、POPS、IMAPSの設定は行っていませんが、これは後ほど追加します。

 

 

SSLの設定

ここでは、SMTP、SMTP-AUTH、POP、IMAPをSSLに対応させます。

具体的には、PostfixとCyrus-SASL、DovecotにSSLの設定を入れて行きます。

 

SSLに必要なファイル

SSLの設定をするのに必要なファイルを列挙します。

サーバの証明書

サーバの秘密鍵

CAの証明書

なお、証明書の作成方法は、こちらをご覧ください。

 

 

PosfixとCyrus-SASLのSSL対応

PostfixとCyrus-SASLのSSL対応用の設定をしていきます。

/etc/postfix/main.cfに以下を追加

# SSL Configuration
smtpd_tls_cert_file = /etc/pki/SERVER/cert.pem
smtpd_tls_key_file = /etc/pki/SERVER/serverkey.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_use_tls = yes

 

/etc/postfix/master.cfで以下の行のコメントを外します。

smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
tlsmgr    unix  -       -       n       1000?   1       tlsmgr

設定が完了したら、Postfixを再起動します。

 

なお、Postfixの設定はこれで終了ですので、main.cfの設定を掲載します。

#inet_interfaces = localhost
myhostname = mail.unixlife.jp
mydomain = unixlife.jp
mynetworks = 127.0.0.0/8
mydestination = $myhostname, localhost.$mydomain, localhost		

message_size_limit = 10240000
mailbox_size_limit = 51200000

transport_maps = ldap:/etc/postfix/transport.cf

virtual_alias_maps = ldap:/etc/postfix/account.cf

virtual_mailbox_domains = ldap:/etc/postfix/vdomain.cf
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = ldap:/etc/postfix/maildir.cf
virtual_mailbox_limit_override = yes
virtual_mailbox_limit = 0
virtual_mailbox_limit_maps = ldap:/etc/postfix/quota.cf
virtual_overquota_bounce = yes
virtual_mailbox_limit_inbox = no
virtual_uid_maps = static:500
virtual_gid_maps = static:500

local_transport = local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

unknown_local_recipient_reject_code = 550

# SSL Configuration
smtpd_tls_cert_file = /etc/pki/SERVER/cert.pem
smtpd_tls_key_file = /etc/pki/SERVER/serverkey.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

# Cyrus-SASL Enable
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd

# Relay Settings on Cyrus-SASL
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

 

 

DovecotのSSL対応

/etc/dovecot.confに以下の行を追加、変更します。

## Dovecot configuration file

protocols = imap imaps pop3 pop3s <---imaps pop3sを追加
mail_location = maildir:~/Maildir

ssl_disable = no <---SSLの設定を追加
ssl_cert_file = /etc/pki/SERVER/cert.pem
ssl_key_file = /etc/pki/SERVER/serverkey.key
ssl_ca_file = /etc/pki/CA/cacert.pem
ssl_verify_client_cert = no
----------- 以下略 ---------------

Dovecotを再起動すれば、POPS、IMAPSも利用出来るようになっています。

これで、Postfix+Dovecot+OpenLDAPによるメールサーバの構築は終了です。

なお、追加でウィルス対策やスパムメール対策も行う事が可能です。

その場合は、Postfix+Clamav+Spamassassinの設定を参照ください。

 

 

簡易メーリングリスト機能の追加

OpenLDAPを利用して簡易メーリングリスト機能を追加する方法を記載します。

簡易メーリングリストとは、Mailmanなどの一般的なメーリングリストサーバの様な多機能な物ではなく、あるメールアドレス宛のメールを複数のメールアドレス宛に送信するだけの物ですが、以外と重宝します。

これを、PostfixとOpenLDAPに設定を追加し実現して行きたいと思います。

 

OpenLDAPのschema設定

まずは、簡易メーリングリストで利用するスキーマ設定を追記します。

追記するのは、先ほど作成したmail.schemaファイルです。

このファイルに、必要なデータ型とオブジェクトクラスの設定を行います。

データ型の定義(ML参加者のメールアドレスを格納する)
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)

オブジェクトクラス(inetOrgPersonも利用する)
objectClass (1.1.2.2.1.1 NAME 'mailGroup'
   DESC 'ML Group Account Object'
   SUP inetOrgPerson
   MUST ( accountActive $ domainName $ mailDrop ))

追記が終了したら、OpenLDAPを再起動します。

 

 

Postfixの設定

Postfixでは、virtual_alias_maps = で、簡易メーリングリストのデータを参照出来るようにします。

そのために、OpenLDAPからデータを検索する為のgroup.cfファイルを作成し設定します。

/etc/postfix/group.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = ou=Mail,o=unixlife,c=JP
query_filter = (&(objectClass=mailGroup)(mail=%s)(accountActive=TRUE))
result_attribute = mailDrop

ファイルを作成したら、Postfixが読み込めるように設定します。

 

設定は、main.cfのvirtual_alias_maps =に追加します。

transport_maps = ldap:/etc/postfix/transport.cf

virtual_alias_maps = ldap:/etc/postfix/account.cf,ldap:/etc/postfix/group.cf
virtual_mailbox_base = /home/vmail

設定が終了したら、Postfixを再起動しておきます。

 

 

簡易メーリングリスト用LDIFの作成

簡易メーリングリストを利用するための、OpenLDAPに登録するLDIFファイルの設定例です。

オブジェクトクラスのgroupUserでは、mailDropの他にinetOrgPersonのデータが必要になります。

dn: uid=ug001, dc=unixlife.jp,ou=Mail,o=unixlife,c=JP
objectClass: mailGroup
mail: info@unixlife.jp
uid: ug001
cn: ml-group
sn: ml-group
domainName: unixlife.jp
accountActive: TRUE
mailDrop: to_sakurai@unixlife.jp
mailDrop: ta_ito@unixlife.jp
mailDrop: ji_ito@examples.com

これを、OpenLDAPに登録し設定は終了です。

簡易メーリングリストでは、属性mailの値にあるアドレスにメールを送信すると、属性mailDropに設定されているアドレスにメールを配送します。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">