Postfix+Dovecot+OpenLDAPでメールサーバ

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

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

今回は、CentOS-6標準パッケージを利用しますので、それぞれ、Postfix-2.6.6、Dovecot-2.0.9、OpenLDAP-2.4.23 のバージョンを利用します。

 

メールサーバの概要

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

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

SMTP認証にはDovecotの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.3 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.4 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.5 NAME 'transport'
    DESC 'transport'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)

attributetype (1.1.2.1.1.6 NAME 'mailQuota'
    DESC 'Mail Home Directory Max byte'
    EQUALITY integerMatch    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE)

attributetype (1.1.2.1.1.7 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 'mailUser'
    DESC 'mail user Object'
    SUP inetOrgPerson
    MUST ( transport $ homeDirectory $ accountActive $ domainName $ userPassword $ mailQuota )
    MAY  ( mailForward $ mailAlias ))

objectClass (1.1.2.2.1.2 NAME 'mailGroup'
   DESC 'ML Group Account Object'
   SUP inetOrgPerson
   MUST ( accountActive $ domainName $ mailDrop ))

 

mail.schemaの解説

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

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

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

オブジェクトクラス

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

 

OpenLDAPの設定

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

cp mail.schema /etc/openldap/schema/

 

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

include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/java.schema
include         /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/openldap.schema
include         /etc/openldap/schema/ppolicy.schema
include         /etc/openldap/schema/collective.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

TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
TLSCertificateFile /etc/pki/tls/certs/slapd.pem
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem

database        bdb
suffix          "dc=mail,dc=unixlife,dc=local"
checkpoint      1024 15
rootdn          "cn=manager,dc=mail,dc=unixlife,dc=local"
rootpw		{MD5}lsKjid-Ji.sLjyd=sdfk

directory	/var/lib/ldap

index 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

# enable monitoring
database monitor

access to dn.subtree="dc=mail,dc=unixlife,dc=local" attrs=userPassword
	by self write
	by anonymous auth
	by * none
access to *
	by self write
	by * read

 

 

/etc/openldap/slapd.conf の作成が終わったら、slaptest コマンドで、/etc/openldap/slapd.d/以下に設定ファイルを変換・作成します。

 

・デフォルトの設定を削除

rm -rf /etc/openldap/slapd.d/*

 

・設定ファイルの作成

slaptest -f slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap.ldap /etc/openldap/slapd.d

 

・OpenLDAPを起動

/etc/init.d/slapd start

indexの再構築

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

slapindex -v -b dc=unixlife,dc=local -f slapd.conf

 

 

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

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

 

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

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

					----------------------------
					|rootdn:dc=unixlife,dc=local|
					----------------------------
						|
					-----------------------------
					|dc=mail,dc=unixlife,dc=local|
					-----------------------------
					|			|
	--------------------------------------------	----------------------------------------------
	|ou=unixlife.jp,dc=mail,dc=unixlife,dc=local|	|ou=examples.com,dc=mail,dc=unixlife,dc=local|
	-------------------------------------------- 	----------------------------------------------
					|			|
-------------------------------------------------  ---------------------------------------------------
|uid=user1@unixlife.jp,ou=unixlife.jp,dc=mail・・|  |uid=user1@examples.com,ou=examples.com,dc=mail・・|
-------------------------------------------------  ---------------------------------------------------
	|uid=user2@unixlife.jp,・・・・・・・・		|uid=user2@examples.com,・・・・・・・・・
	--------------------------------------		---------------------------------------
		|uid=user3@unixlife.jp,・・・・・・・		|uid=user3@examples.com,・・・・・・・・
		-------------------------------------		-------------------------------------

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

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

 

 

OpenLDAPへの登録データの作成

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

 

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

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

top.ldif

dn: dc=unixlife,dc=local <---LDAPのTOPツリー
dc: unixlife
objectClass: dcObject
objectClass: organization
o: unixlife

dn: dc=mail,dc=unixlife,dc=local <---Mailツリー
objectClass: dcObject
objectClass: organization
dc: mail
o: mail

 

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

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

domain.ldif

dn: ou=unixlife.jp,dc=mail,dc=unixlife,dc=local <---unixlife.jpドメイン
ou: unixlife.jp
objectClass: organizationalUnit

dn: ou=examples.com,dc=mail,dc=unixlife,dc=local <---examples.comのドメイン
ou: examples.com
objectClass: organizationalUnit

 

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

ユーザデータの作成

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

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

 

属性の詳細説明

・uid

ユーザ認証用にはメールアドレスと同一値を利用します。

・mailForword

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

・mailAlias

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

・accountActive

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

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

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

 

user.ldif

dn: uid=user1@unixlife.jp,ou=unixlife.jp,dc=mail,dc=unixlife,dc=local
objectClass: mailUser
cn:sakurai
sn:tomoya
uid: user1@unixlife.jp
userPassword: {MD5}kJ.HtIols6ks=
homeDirectory: /home/mailbox/unixlife.jp/user1
mail: user1@unixlife.jp
mailAlias: webmaster@unixlife.jp
accountActive: TRUE
domainName: unixlife.jp
mailQuota: 200
transport: dovecot

dn: uid=user2@unixlife.jp,ou=unixlife.jp,dc=mail,dc=unixlife,dc=local
objectClass: mailUser
cn:yamada
sn:taro
uid: user2@unixlife.jp
userPassword: {MD5}Jrtd.LouyTrf=
homeDirectory: /home/mailbox/unixlife.jp/user2
mail: user2@unixlife.jp
accountActive: TRUE
domainName: unixlife.jp
mailQuota: 100
transport: dovecot

dn: uid=user1@examples.com,ou=examples.com,dc=mail,dc=unixlife,dc=local
objectClass: mailUser
cn:ito
sn:jiro
uid: user1@examples.com
userPassword: {MD5}JROlkJ.Sdjk=
homeDirectory: /home/mailbox/examples.com/user1
mail: user1@examples.com
accountActive: TRUE
domainName: examples.jp
mailQuota: 100
transport: dovecot

 

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

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

TOPツリー用ldifの登録

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

ドメイン用ldifの登録

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

ユーザ用ldifの登録

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

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

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

 

 

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

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

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

メール配送ユーザの作成

グループの作成

groupadd -g 500 vmail

ユーザの作成

useradd -g 500 -s /sbin/nologin -u 500 -d /home/mailbox vmail

 

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

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

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

 

 

Postfix

CentOS-6では、Postfixが標準MTAになっていますので、そのまま利用します。

 

Postfixの設定

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

ここでは、メール配送に関する設定をmain.cfにしていきます。

また、メールボックスにメールを配送するのには、Dovecotのdeliverを利用しますので必要な設定をmaster.cfにも行います。

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

/etc/postfix/main.cf
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 = 512000000 <---メールボックスの最大容量(500MB)

dovecot_destination_recipient_limit = 1 <---Dovecot deliverを利用する場合に指定
transport_maps = ldap:/etc/postfix/transport.cf <---LDAPから取得、通常はdovecot
virtual_mailbox_domains =ldap:/etc/postfix/vdomain.cf<-処理ドメインをLDAPから取得
virtual_alias_maps = ldap:/etc/postfix/account.cf,ldap:/etc/postfix/group.cf <---LDAPからメールアドレスを取得

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

unknown_local_recipient_reject_code = 550

# SASL Enable <---Dovecot-SASLの有効化
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

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

 

/etc/postfix/master.cf

メールボックスにメールを配送するのには、Dovecotのdeliverを利用しますので、/etc/postfix/master.cfに以下の設定をします。

tlsmgr    unix  -       -       n       1000?   1       tlsmgr

# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
dovecot unix    -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

 

 

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

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

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

server_host = OpenLDAPのホストを指定

search_base = 検索dn:を指定

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

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

トランスポート値の取得

/etc/postfix/transport.cf

server_host = localhost
server_host = 192.168.1.1, 192.168.1.2 <---LDAPサーバが2台ある場合
search_base = dc=mail,dc=unixlife,dc=local
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 = dc=mail,dc=unixlife,dc=local
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 = dc=mail,dc=unixlife,dc=local
query_filter = (domainName=%s)
result_attribute = domainName

メールの配送アドレスを取得(グループアドレス用)

/etc/postfix/group.cf

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

これで、Postfixの設定は終了です。

 

 

Dovecot

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

ここでは、CentOS-6標準のDevocot-2.0.9をインストールします。

Dovecotをインストールします。

yum install dovecot

 

 

Dovecotの設定

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

ここでは、DovecotのQuotaプラグインも一緒に設定しています。

doveot.confの設定で変更箇所のみ記載します。

!include conf.d/*.conf

protocols = imap pop3 lmtp

 

dovecot-ldap.confの設定で変更箇所のみ記載します。

まず、dovecot-ldap.confを用意します。

cp /usr/share/doc/dovecot-2.0.12/example-config/dovecot-ldap.conf.ext /etc/dovecot/dovecot-ldap.conf
#hosts =
hosts = localhost

#auth_bind = no
auth_bind = yes

# LDAP protocol version to use. Likely 2 or 3.
#ldap_version = 3

# LDAP base. %variables can be used here.
# For example: dc=mail, dc=example, dc=org
base = dc=mail,dc=unixlife,dc=local

#user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid
user_attrs = homeDirectory=home,mailQuota=quota_rule=*:bytes=%$M

user_filter = (&(objectClass=mailUser)(uid=%u)(accountActive=TRUE))

#pass_filter = (&(objectClass=posixAccount)(uid=%u))
pass_filter = (&(objectClass=mailUser)(uid=%u)(accountActive=TRUE))

#default_pass_scheme = CRYPT
default_pass_scheme = MD5

 

次に、Dovecotの詳細設定を行います。

/etc/dovecot/conf.d/auth-ldap.conf.extの設定で変更箇所のみ記載します。

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

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

 

/etc/dovecot/conf.d/10-auth.confの設定で変更箇所のみ記載します。

disable_plaintext_auth = no
auth_cache_size = 10M
auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-ldap.conf.ext

 

/etc/dovecot/conf.d/10-logging.confの設定で変更箇所のみ記載します。

log_path = syslog
syslog_facility = mail

 

/etc/dovecot/conf.d/10-mail.confの設定で変更箇所のみ記載します。

mail_location = maildir:%h/Maildir
mail_uid = 500
mail_gid = 500
mail_plugins = $mail_plugins quota
mail_attachment_hash = %{md5}

 

/etc/dovecot/conf.d/10-master.confの設定で変更箇所のみ記載します。

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

 

/etc/dovecot/conf.d/10-ssl.confの設定で変更箇所のみ記載します。

ssl = no

 

/etc/dovecot/conf.d/15-lda.confの設定で変更箇所のみ記載します。

 postmaster_address = root@localhost
 hostname = mail.unixlife.jp
 protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins quota
}

 

/etc/dovecot/conf.d/20-lmtp.confの設定で変更箇所のみ記載します。

protocol lmtp {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins quota
}

 

/etc/dovecot/conf.d/20-imap.confの設定で変更箇所のみ記載します。

mail_plugins = $mail_plugins imap_quota

 

/etc/dovecot/conf.d/20-pop3.confの設定で変更箇所のみ記載します。

mail_plugins = $mail_plugins quota

 

/etc/dovecot/conf.d/90-quota.confの設定で変更箇所のみ記載します。

plugin {
  #quota = dirsize:User quota
  quota = maildir:User quota
  #quota = dict:User quota::proxy::quota
  #quota = fs:User quota
}

Dovecotの設定は以上です。

 

 

動作確認

ここでは、メールの配送、POPサーバへのログインなどの動作確認を行います。

 

メールの配送確認

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

メールの配送テストは、”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: user1@unixlife.jp <---メール送信元(mail from:)
250 Ok
rcpt to: user1@examples.com <---メール送信先(rcpt to:)
250 Ok
data  <---メール本文を入力するため"data"を入力
354 End data with .
Subject: TEST   <---メール件名を入力

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

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

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

 

 

SMTP認証の動作確認

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

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

 

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サーバを利用出来ない事を確認してください。

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

 

不正中継の確認

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

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

 

POP,IMAPの動作確認

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とDovecot,Dovecot-SASLにSSLの設定を入れて行きます。

 

SSL証明書の作成

自己証明書を作成し利用します。

自己証明書の作成

 cd /etc/pki/tls/certs/
make mail.pem
umask 77 ;
	PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ;
	PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ;
	/usr/bin/openssl req -utf8 -newkey rsa:1024 -keyout $PEM1 -nodes -x509 -days 365
	-out $PEM2 -set_serial 0 ;
	cat $PEM1 >  mail.pem ;
	echo ""    >> mail.pem ;
	cat $PEM2 >> mail.pem ;
	rm -f $PEM1 $PEM2
Generating a 1024 bit RSA private key
.............++++++
...........................................++++++
writing new private key to '/tmp/openssl.d32573'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP <---国名、通常は'JP'
State or Province Name (full name) [Berkshire]:Aichi <---都道府県名を指定
Locality Name (eg, city) [Newbury]:Nagoya <---組織の本拠地の市区町村名を指定
Organization Name (eg, company) [My Company Ltd]:UNIXLife <---組織名(法人名)を指定
Organizational Unit Name (eg, section) []: <---部署名を指定
Common Name (eg, your name or your server's hostname) []:mail.unixlife.jp <---FQDNを指定
Email Address []: <---連絡先E-Mailアドレスを指定

 

証明書を参照するグループを作成

証明書を参照出来るグループを作成し、postfixとdovecotユーザをこのグループに所属させます。

groupadd mailcerts
usermod -G mailcerts postfix
usermod -G mailcerts dovecot

 

証明書のオーナーとパーミッションの変更

先ほど作成したグループから証明書が参照出来るように、オーナーとパーミッションを変更します。

chown root.mailcerts mail.pem
chmod 640 mail.pem

 

 

PosfixのSSL対応

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

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

# SSL Configuration
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_session_cache_database = btree:/var/lib/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

 

設定が完了したら、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, ldap:/etc/postfix/vdomain.cf

message_size_limit = 51200000
mailbox_size_limit = 512000000

dovecot_destination_recipient_limit = 1
transport_maps = ldap:/etc/postfix/transport.cf
virtual_alias_maps = ldap:/etc/postfix/account.cf,ldap:/etc/postfix/group.cf

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

unknown_local_recipient_reject_code = 550

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# SSL Configuration
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_use_tls = yes

smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

 

 

DovecotのSSL対応

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

## Dovecot configuration file
ssl = yes <---SSLの設定を追加

ssl_cert =</etc/pki/tls/certs/mail.pem
ssl_key =</etc/pki/tls/certs/mail.pem

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

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

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

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

 

Postfixの Submission Port (587) 対応

/etc/postfix/master.cf を以下のように変更します。

smtp inet n - n - - smtpd
 -o smtpd_sasl_auth_enable=no
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
 -o milter_macro_daemon_name=ORIGINATING

smtpでのSASL認証(クライアント認証)は禁止 = -o smtpd_sasl_auth_enable=no

submission での認証にTLSを許可 *SMTP over SSL/TLS を有効にしてない場合はコメントに

 

簡易メーリングリスト機能

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

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

PostfixとOpenLDAPにはすでに設定してあるため、利用方法を解説します。

 

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

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

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

dn: uid=info@unixlife.jp, ou=unixlife.jp,dc=mail,dc=unixlife,dc=local
objectClass: mailGroup
mail: info@unixlife.jp
uid: info@unixlife.jp
cn: ml-group
sn: ml-group
domainName: unixlife.jp
accountActive: TRUE
mailDrop: user1@unixlife.jp
mailDrop: user2@unixlife.jp

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

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

 

 

Dovecot-Pigeonhole Sieveによるメール振り分け

Dovecot-PigeonholeのSieveプラグインを利用してメールの振り分けを行います。Sieveプラグインを利用する事により、バーチャルドメイン環境でもメールの振り分けが手軽に行えます。

 

Dovecot-Pigeonholeのインストール

Sieveプラグインを利用する為に、Dovecot-Pigeonholeパッケージをインストールします。

yum install dovecot-pigeonhole

 

Dovecot Sieveの設定

Dovecot Sieveを利用出来るようにを設定していきます。

/etc/dovecot/conf.d/20-managesieve.conf

protocols = $protocols sieve

 

/etc/dovecot/conf.d/90-sieve.conf

plugin {
  sieve = %h/.dovecot.sieve
  sieve_dir = %h/sieve
  #sieve_global_dir =
  sieve_global_path = /etc/dovecot/sieve/default.sieve
}

 

mkdir /etc/dovecot/sieve
echo "" > /etc/dovecot/sieve/default.sieve
chown -R vmail.vmail /etc/dovecot/sieve

 

/etc/dovecot/conf.d/15-lda.conf

protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins quota sieve
}

 

/etc/dovecot/conf.d/20-lmtp.confの設定で変更箇所のみ記載します。

protocol lmtp {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins quota sieve
}

これで、DovecotのSieveプラグインの設定は終了です。

 

振り分けの設定

メールの振り分け設定をするには、%h/.dovecot.sieveファイルに振り分けルールを記述します。

例えば、ヘッダーにX-Spam-Flag YESの文字が含まれるメールをJunkフォルダに振り分けるには以下のようにします。

require ["fileinto"];
# rule:[X-Spam]
if anyof (header :contains "X-Spam-Flag" "YES")
{
	fileinto "Junk";
	stop;
}

 

Sieveの設定には、PHP環境で動作するWebmailソフト、Roundcubeのmanagesieveプラグインを利用すると便利です。

なお、Roundcubeのインストールについては、こちらを参照ください。

 

 

参考資料:

http://www.dovecot.org/

Leave a comment ?

12 Comments.

  1. Roundcube webmailのインストールと設定 | UNIXLife - pingback on 2012/02/22 at 11:19 PM
  2. こんにちは。
    CentOS-6の環境です。
    こちらのページを参考に設定して、無事動作をしております。ありがとうございます。
    しかし、sieveのみうまく動きません。
    最後の”メールの振り分け設定をするには、%h/.sieveファイルに振り分けルールを記述します。”
    は%h/.dovecot.sieveではないでしょうか。
    %h/.dovecot.sieveに変更してsieveは動いていますが
    fileinto “Junk”が動作しません。mailbox doesnot existになります。
    どのようにすれば、正常に動作致しますでしょうか。
    ご教授頂ければ幸いです。

  3. 初めまして。
    こちらでも確認を行いました。
    ご指摘の通り、ルールの記述は、%h/.dovecot.sieve に行なってください。

    振り分けのエラーですが、ディレクトリはありますか?
    %h/Maildir/Junk/
    もしくは
    %h/Maildir/.Junk/

    私は、Roundcube から設定して %h/Maildir/.Junk/ が作られました。
    振り分けも問題なく動作していますので、今一度ご確認ください。
    よろしくお願いします。

  4. ご回答ありがとうございます。

    ディレクトリを作成し、
    %h/Maildir/Junk/
    もしくは
    %h/Maildir/.Junk/
    を両方試しましたが、ダメでした。
    以下ログです。

    -dovecot.sieve.log-
    error: msgid=: failed to store into mailbox ‘%h/Maildir/.Junk/’: Invalid mailbox name.

    -mail.log-
    May 5 12:07:24 mail dovecot: lda(aaa@xxxxx.jp): sieve: msgid=: stored mail into mailbox ‘INBOX’
    May 5 12:07:24 mail dovecot: lda(aaa@xxxxx.jp): Error: sieve: execution of script /home/mailbox/xxxxxx.jp/aaa/.dovecot.sieve failed, but implicit keep was successful (user logfile /home/mailbox/xxxxx.jp/aaa/.dovecot.sieve.log may reveal additional details)

    何かわかりますでしょうか。

  5. 新しいユーザーを作成し動作確認を行いましたが、同一のエラーが再現できませんでした。

    一応、手順だけ再度。
    cd /home/mailbox/xxxxx.jp/aaa/

    .dovecot.sieveを作成する。*中身は見本と一緒
    chown vmail.vmail .dovecot.sieve

    ディレクトリを作成する。
    mkdir Maildir/.Junk
    cd Maildir
    chown -R vmail.vmail .Junk

    これでダメなようなら、PostfixとDovecotの設定も見なおしてみてください。

    • ご回答ありがとう御座います。

      頂いた手順と同様に試してみたのですがダメでした。
      しかし、
      Roundcubeをインストールしmanagesieveで設定すると
      問題なく動作しました。
      元々、Roundcubeは入れるつもりでしたので問題なしです。
      いろいろとご対応ありがとうございました。

      • 追記です。
        managesieveで行なって変わった点が1点ありました。
        /home/mailbox/xxxxx.jp/aaa/
        lrwxrwxrwx 1 vmail vmail 23 May 5 14:41 .dovecot.sieve -> sieve/managesieve.sieve
        になっていました。
        問題ないでしょうか?

  6. Roundcubeで動作したようで何よりでした。
    でも何がダメだったか気になるところではありますが・・・。

    managesieveですが、そのファイル配置で問題ありません。

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="">