メールサーバ構築(Postfix +MySQL +Dovecot +postfixadmin)

メールサーバ構築(Postfix +MySQL +Dovecot +postfixadmin)

より新しい記事 2011-01-12
https://perl.no-tubo.net/2011/01/06/メールサーバ構築のまとめ(複数のバーチャルド/

CentOS5.3

いろいろ構築した結果、メールサーバは Postfix +MySQL +Dovecot +postfixadmin で構成する事に決めた。
postfixadminを使う利点は、

  • 複数のバーチャルドメインでの運用が可能&管理が楽
  • ドメインの追加やメールアドレスの追加がブラウザからGUIで出来る

さらに、procmailとspamassassin、Clam AntiVirusを使って、スパムメール対策とウィルス対策も行う。

バーチャルドメイン環境でprocmailとspamassassinを使うにコツがいる(らしい)

ネットでの情報が少ない(ヒットしない)のでメモ。

メールサーバの構築

メールサーバの構築は メールサーバー構築(Postfix+Dovecot) - CentOSで自宅サーバー構築 を参考に行った。

おやじさんのPostfixによるSMTPサーバの構築(RedHat標準版編)も参考になる。

ウィルス対策

ウィルス対策は アンチウィルスソフト導入(Clam AntiVirus) - CentOSで自宅サーバー構築 を参考に行った。

スパムメール対策

スパムメール対策は メールサーバーでウィルス&スパムチェック(Postfix+Clam AntiVirus+SpamAssassin) - CentOSで自宅サーバー構築 を参考に行った。

postfixのMySQL対応化とpostfixadminの導入

Postfixによるメールサーバ構築 (Postfix+MySQL+Dovecot+postfixadmin) を参考に行った。

MySQL対応は CentOS5.3 PostfixをMySQL対応にするで行った。

リンク先で作成した(cat となっているが vi 等で新規作成する事)

/etc/postfix/mysql_virtual_alias_maps.cf
/etc/postfix/mysql_virtual_domains_maps.cf
/etc/postfix/mysql_virtual_mailbox_maps.cf
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

のファイルにはMySQLのパスワードが含まれているのでパーミッションの変更を行う事。

chmod 640 /etc/postfix/mysql_*
chown root.postfix /etc/postfix/mysql_*

メールの保存は/mail 以下となる。

だいたいうまくいくのだが、多少の変更が必要。

spamassassinを有効にするにはprocmailでメールボックスに配送しなければならない。

バーチャルドメインの場合procmailが使えないという記事が多かったので心配だったが、

postfixのバーチャルドメイン管理でのspamフィルタについて

を読むとどうやら使えるらしい。

Postfixの設定

main.cfの設定。

http://centos.bungu-do.jp/2008/11/postfix_3_postfix.html のmain.cf 設定を少々変更。

cp /etc/postfix/main.cf /etc/postfix/main.cf.org
vi /etc/postfix/main.cf
-------------------------------------------------------------------------------
myhostname = mail.example.com ←自メールサーバFQDN
mydomain = example.com ←自サーバドメイン
#myorigin = $mydomain
myorigin = $myhostname

#inet_interfaces = localhost
inet_interfaces = all

#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydestination =

#relay_domains = $mydestination
relay_domains = $mydestination

home_mailbox = Maildir/

# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN
# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER.
#
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
 mailbox_command = /usr/bin/procmail ←追記

smtpd_banner = $myhostname ESMTP unknown

local_transport = virtual
# virtual_transport = virtual ←コメントアウト
virtual_transport = procmail ←追記
virtual_mailbox_base = /mail
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000

maximal_backoff_time = 800s
minimal_backoff_time = 100s
bounce_queue_lifetime = 60m
maximal_queue_lifetime = 60m

#mailbox_size_limit = 1024000000
message_size_limit = 20480000

#virtual_mailbox_limit = 51200000
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = yes
virtual_mailbox_limit_inbox = yes

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $myhostname
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
-------------------------------------------------------------------------------

master.cfの設定。

vi /etc/postfix/master.cf

最終行に追記
procmail unix - n n - - pipe
  flags=R user=vuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

procmailのルール、/etc/procmailrcを新規作成する。

vi /etc/procmailrc

SHELL=/bin/bash
PATH=/usr/bin:/bin
DEFAULT=/mail/$DOMAIN/$USER\@$DOMAIN/
#LOGFILE=/mail/procmail.log
LOGFILE=${DEFAULT}.procmail.log
#LOCKFILE=/mail/procmail.lock
LOCKFILE=/mail/$USER\@$DOMAIN.procmail.lock
VERBOSE=ON

:0fw
|/usr/bin/spamc

LOGFILEはテスト段階では/mail/procmail.logにしておくと楽。

VERBOSE=ON は詳細ログを記録する設定なので本格運用する際にはコメントアウトする。

また、LOCKFILEはユーザー数が増えた時の為に各ユーザーごとにロックファイルを使うようにしてみた。

ログの肥大化を防ぐため、ログローテーション設定ファイル新規作成する。

vi /etc/logrotate.d/procmail

/mail/*/*/.procmail.log {
    missingok
    nocreate
    notifempty
}

注意点として、バーチャルドメインでの運用の場合ローカルユーザーのメールボックスにメールが配信されない。root宛のメールも然り。

root宛のメールが普段使っているメールアドレス宛に配信されるようにしておく。

vi /etc/aliases

# Person who should get root's mail
#root:          marc
root:           myname@domain.com ←最終行に追加

newaliases

myname@domain.comにroot宛のメールが届くようになる。

テスト

メールを配信してみてヘッダ情報を見る。

spamasassinが適用されていれば

X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on xxx.xxxx.jp
X-Spam-Level:
X-Spam-Status: No, score=-0.1 required=13.0 tests=AWL,CONTENT_TYPE_PRESENT, ISO2022JP_BODY,ISO2022JP_CHARSET,X_MAILER_PRESENT autolearn=ham version=3.2.5

Clam AntiVirusが適用されていれば

X-Virus-Scanned: amavisd-new at xxxx.jp

がヘッダ情報に挿入されているはず。

その他のテスト方法は各リンクに掲載されていた通り。

ユーザーメールディレクトリが作成されない

・・・なぜかメールディレクトリが作成されない。

spamチェックのためメール配送をprocmailにするとディレクトリ作成されない事が判明。

メール用ディレクトリは /mail 以下で、ユーザーが vuser 、グループが vuser 、パーミッションは0771。

とりあえずユーザー postfix にセカンダリグループ vuserを追加してみたら既存のドメインには作成される。

新規にドメイン追加>メールアドレス追加の場合は作成されない。

この後したい事

postfixadminでドメイン、メールユーザー等を削除した場合は各ディレクトリが削除されない。

postfixadminのconfig.inc.phpにオプション設定があるが、シェルスクリプトで各動作が行えるようだ。

シェルスクリプト・・・書けねぇ。。。

postfixadminでメールボックスを削除する
PostfixAdminのイケてないところ

この辺に該当の対処が書かれている。

cronを使って削除する方法のようだ。

postfixadmin/ADDITIONS 内にある、

postfixadmin-domain-postdeletion.sh
postfixadmin-mailbox-postcreation.sh
postfixadmin-mailbox-postdeletion.sh

こいつらを使えば出来るかな?

以下は分かりにくいのでまとめてみた

postfixadmin +procmailな環境でメールディレクトリの作成・削除

自動メールボックス作成に挑戦

/usr/local/bin/postfixadmin あたりにコピーする。

mkdir /usr/local/bin/postfixadmin ←保存用ディレクトリ作成
cd /var/www/postfixadmin/ADDITIONS
cp postfixadmin-domain-postdeletion.sh /usr/local/bin/postfixadmin
cp postfixadmin-mailbox-postcreation.sh /usr/local/bin/postfixadmin
cp postfixadmin-mailbox-postdeletion.sh /usr/local/bin/postfixadmin
cd /usr/local/bin/postfixadmin
vi postfixadmin-domain-postdeletion.sh

# Change this to where you keep your virtual mail users' maildirs.
#basedir=/var/spool/maildirs ←コメントアウト
basedir=/mail ←追記
vi postfixadmin-mailbox-postcreation.sh

# Change this to where you keep your virtual mail users' maildirs.
#basedir=/var/spool/maildirs ←コメントアウト
basedir=/mail ←追記

コメントアウト
#maildirmake "$maildir"
#if [ ! -d "$maildir" ]; then
#    echo "$0: maildirmake didn't produce a directory; bailing out."
#    exit 1
#fi

追記
mkdir "$maildir"
if [ ! -d "$maildir" ]; then
echo "$0: mkdir didn't produce a directory; bailing out."
exit 1
fi

mkdir "${maildir}cur"
if [ ! -d "${maildir}cur" ]; then
echo "$0: mkdir didn't produce a directory; bailing out."
exit 1
fi

mkdir "${maildir}new"
if [ ! -d "${maildir}new" ]; then
echo "$0: mkdir didn't produce a directory; bailing out."
exit 1
fi

mkdir "${maildir}tmp"
if [ ! -d "${maildir}tmp" ]; then
echo "$0: mkdir didn't produce a directory; bailing out."
exit 1
fi

chown -R vuser:vuser "$maildir"
chmod -R 700 "$maildir"
vi postfixadmin-mailbox-postdeletion.sh

# Change this to where you keep your virtual mail users' maildirs.
#basedir=/var/spool/maildirs ←コメントアウト
basedir=/mail ←追記

実行権を与える

chmod 700 /usr/local/bin/postfixadmin/postfixadmin*

postfixadmin 設定ファイル修正

vi /var/www/postfixadmin/config.inc.php

// Optional:
// Script to run after creation of mailboxes.
// Note that this may fail if PHP is run in "safe mode", or if
// operating system features (such as SELinux) or limitations
// prevent the web-server from executing external scripts.
// $CONF['mailbox_postcreation_script']='sudo -u courier /usr/local/bin/postfixadmin-mailbox-postcreation.sh'; ←コメントアウト
$CONF['mailbox_postcreation_script']='sudo /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh'; ←追記

sudo変更
※ 終了するには esc の後に、大文字で ZZ

visudo

#
# Disable "ssh hostname sudo ", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo ".
#
#Defaults    requiretty ←コメントアウト

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
apache ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh ←追記