トップ  »  Tech  »  CentOS

Postfixを使ったメールサーバを構築します。構築する仕様は次の通り。

  • バーチャルドメイン対応
    • アカウントと転送先の定義にはDBファイルを使用(PostfixAdminではない)
  • Quotaを利用しない
  • Maildir形式とする
  • POP3サーバにDovecotを使う

試した環境。

OS CentOS5.2(i386)
Postfix postfix-2.3.3(RPM)
Dovecot dovecot-1.1.2(ソース)

アカウントの収容方式について。

  • メールアカウントはドメインを含まない形で収容する
    • /home/mailuser/UserName/Maildir/ というディレクトリ
    • メールアカウントは UserName@DomainName の形式
    • @より前の部分をサーバ内でユニークなものにする
  • メールアカウントはUNIXユーザでは無く、Dovecot専用アカウントとする
    • メールボックスも専用の領域に置く
  • PostfixではVirtualDomain設定をし、メールアドレスをDovecotのアカウントにマッピングする

PostfixとDovecotのMaildir構成図。

http://satospo.sakura.ne.jp/tech_image/centos/postfix_virtual04.png

  • Postfix側は/etc/postfix/vmailboxファイルでMaildirの場所を定義する
  • Dovecot側は/user/local/etc/dovecot.conf、dovecot-passwdファイルで定義する

Postfixのインストール

今回は、Quotaを利用しないので、CentOSのRPM版Postfixをそのまま利用します。


下準備

メールボックスを保存するためのディレクトリ、およびメールボックス用のLinuxアカウントを作ります。


ここでは、メールディレクトリのオーナーをmailuserとして作りました。

[root]# groupadd -g 10000 mailuser
[root]# useradd -u 10000 -g 10000 -d /home/mailuser -s /sbin/nologin mailuser

[root]# id mailuser
uid=10000(mailuser) gid=10000(mailuser) groups=10000(mailuser)

メールディレクトリは次の場所に作成されていきます。

  • /home/mailuser/UserName/Maildir/

Postfixの設定

バーチャルドメイン対応の設定をします。設定ファイル名と役割。

/etc/postfix/main.cf Postfixのメイン設定ファイル
/etc/postfix/vmailbox バーチャルドメインのメールディレクトリの定義
/etc/postfix/virtual バーチャルドメインの転送先の定義

master.cfは変更ありません。


main.cfの変更箇所。

myhostname = mail.example.jp
mydomain = example.jp
myorigin = $mydomain
mydestination =
mynetworks = 127.0.0.0/8

alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases

home_mailbox = Maildir/

smtpd_banner = $myhostname ESMTP unknown

## Addtional --------------------------------------------------
## POP before SMTP support
smtpd_recipient_restrictions = permit_mynetworks,
    reject_unauth_destination

## Virtual Domain support
virtual_mailbox_base = /home/mailuser
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = $mydomain,
                          example.com,
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_mailbox_limit = 512000000

## Other configuration
maximal_queue_lifetime = 2d
bounce_queue_lifetime = 1d
disable_vrfy_command = yes
message_size_limit = 512000000

## End --------------------------------------------------------------------

ここでは、virtual_mailbox_domains で example.jp と example.com を定義しています。


バーチャルドメインの設定

virtual_mailbox_maps用のファイルを作ります。内容は、メールサーバが受信するメールアドレスおよび、メールを保存するディレクトリ名を記述します。


ファイル名 /etc/postfix/vmailbox

# virtual mailbox
# mailaddress maildir
# virtual_mailbox_base = /home/mailuser

# example.jp
postmaster@example.jp p_master1/Maildir/
test.user@example.jp test.user/Maildir/

# example.com
postmaster@example.com p_master2/Maildir/
user1@example.com user1/Maildir/

virtual_alias_maps用のファイルを作ります。内容は、メールサーバが受信するメールアドレスおよび、転送先のメールアドレスを記述します。書式はPostfixのvirtualに従います。


ファイル名 /etc/postfix/virtual

# example.jp
webmaster@example.jp  postmaster@example.jp

# example.com
webmaster@example.com user1@example.com

# 複数の転送先を設定するには、「,」で区切ります。

# 転送しつつMaildirに残したい場合は、自分のアドレスを書きます。
#  user1@example.com  user1@example.com,user1@example.org

それぞれのファイルを編集した後は postmap コマンドで DBファイルを更新します。

[root]# postmap /etc/postfix/vmailbox
[root]# postmap /etc/postfix/virtual

※Postfixの再起動は不要です。

バーチャルドメイン用のメールアカウントをvmailboxに定義した後に、該当アカウント宛てにテストメールを送信します。メールサーバのコマンドラインから実施しておきます。

[root]# mail -s "testmail" user1@example.com

Postfix側ではメールを受信した後にMaildirを自動生成します。Maildirが生成されていない

状態では、以下でPOPアカウントを作成してもログイン時にエラーになってしまいます。そのため、メールボックスを定義した後で必ずMaildirを作成しておきましょう。


PostfixでVirtualドメイン構成をする場合の、設定ファイル構成図。

http://satospo.sakura.ne.jp/tech_image/centos/postfix_virtual01.png


参考サイト

Postfixのバーチャルドメインについて。


Dovecotのインストール

POP3/IMAPサーバとしてDovecotをインストールします。Dovecotはソースコードで配布されているものをコンパイルして利用します。


インストール

Dovecot公式サイトよりソースコードのアーカイブを入手します。

アーカイブを展開し、configureを実施します。オプションは次のとおり。不要なモジュールを全てwithoutにします。ここではDovecot独自のユーザ/パスワードを利用します。

./configure \
--disable-ipv6 \
--without-vpopmail \
--without-sql \
--without-pgsql \
--without-mysql \
--without-sqlite \
--without-passwd \
--without-nss \
--without-shadow \
--without-pam \
--without-checkpassword \
--without-gssapi \
--without-ldap \
--without-db \
--without-sql \
--with-passwd-file \
--with-static-userdb

あとは make~make installを実行することで /usr/local/sbin にインストールされます。


設定

Dovectoを実行するためのユーザをLinux上に作成しておきます。

[root]# useradd -c Dovecot -s /sbin/nologin -d /var/empty/dovecot -m -u 93 dovecot

Dovecotの設定ファイルは /usr/local/etc/dovecot.conf になります。POPユーザのpasswdファイルも同じ場所に置きます。


ファイル dovecot.conf の編集後の状態。

#
# dovecot.conf - for dovecot-1.1.2
# -2008/09/16-

# Protocol , listen if/port
login_greeting = POP3 ready.
protocols = pop3 imap
listen = *
ssl_disable = yes
disable_plaintext_auth = no

# logfile to syslog
#log_path = /var/log/dovecot.log
#log_timestamp = "%b %d %H:%M:%S "
syslog_facility = local6

# auth debug mode
auth_verbose = no
#auth_debug = no
#auth_debug_passwords = no

#default_mail_env = maildir:/home/maildir/%d/%u/Maildir

protocol imap {
    listen = *:143
}
protocol pop3 {
    listen = *:110
}

mail_location = maildir:/home/mailuser/%u/Maildir
mail_uid = 10000
mail_gid = 10000

auth default {
  mechanisms = plain login digest-md5 cram-md5
  passdb passwd-file {
    args = /usr/local/etc/dovecot-passwd
  }
  #userdb static {
  #  args = uid=10000 gid=10000 home=/home/mailuser/%u/Maildir
  #}
}

dict {
}

plugin {
}

設定概要

  • POP3,IMAPサーバを有効
  • Dovecotのログをsyslog経由でlocal6に出力
  • Maildirの場所を maildir:/home/mailuser/%u/Maildir と指定
    • %uにはPOP/IMAPで認証されたユーザ名が入る
    • このサーバの仕様ではPOP/IMAPのユーザIDはメールアドレスとは独立して設定している
    • POP/IMAPログイン時は Username / Password のみを用いる。メールアドレスは使わない。
  • Maildirのuid/gidを10000に指定。これは、ディレクトリのオーナーのものを使う。
  • 認証用パスワードファイルを /usr/local/etc/dovecot-passwd と指定。

Dovecotのログをsyslogで保存するために/etc/syslog.confを編集します。

# Log anything (except mail) of level info or higher. → local6.noneを追加
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local6.none	/var/log/messages

# pop/imap log → 以下2行を追加
local6.*                                                /var/log/poplog

また、poplogをローテートするように/etc/logrotate.d/syslogも編集しておきます。最後にsyslogdを再起動して完了です。


POPアカウントの作成

次にPOP/IMAPアカウントを作成します。これは ユーザID:パスワード 形式の文字列をDovecotのパスワードファイルに記載します。

  • パスワードファイル /usr/local/etc/dovecot-passwd

まず、パスワードを決めてdovecotpwコマンドで暗号化します。

[root]# dovecotpw -s HMAC-MD5 -p hogehoge
{HMAC-MD5}dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3

・暗号化方式は適当に選択します。
・メールクライアント側でAPOPやIMAP(CRAM-MD5)を利用する場合は、パスワードを Cleartext形式にします。

生成されたパスワードを、dovecot-passwd ファイルに追加します。1行に1ユーザ分を書きます。

# username:password
daresore:{HMAC-MD5}dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3

dovecot-passwdファイルの変更では dovecotプロセスを再起動する必要はありません。


設定ファイル類のパーミッション

dovecot.confとdovecot-passwdファイルは、オーナーをdovecot:rootにしておき、一般ユーザが閲覧できないようにしておくべきでしょう。

[root] ls -l /usr/local/etc
-rw-r----- 1 dovecot root  860 Jul  1 13:18 dovecot.conf
-rw-r----- 1 dovecot root   50 Jul  1 13:22 dovecot-passwd

自動起動スクリプト

Dovecotのソースコードには自動起動スクリプトが含まれていないようなので、SRPM版から拝借します。

#!/bin/bash
#
#       /etc/rc.d/init.d/dovecot
#
# Starts the dovecot daemon
#
# chkconfig: - 65 35
# description: Dovecot Imap Server
# processname: dovecot
# Source function library.
. /etc/init.d/functions

test -x /usr/local/sbin/dovecot || exit 0

RETVAL=0
prog="Dovecot Imap"

start() {
        echo -n $"Starting $prog: "
        daemon /usr/local/sbin/dovecot
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dovecot
        echo
}

stop() {
        echo -n $"Stopping $prog: "
        killproc /usr/local/sbin/dovecot
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/dovecot
        echo
}

#
#       See how we were called.
#
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload|restart)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/dovecot ]; then
            stop
            start
        fi
        ;;
  status)
        status /usr/local/sbin/dovecot
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {condrestart|start|stop|restart|reload|status}"
        exit 1
esac

exit $RETVAL

以上で準備ができれば、Dovecotを起動します。


参考サイト