メールサーバーについて気になった事が有ったので、さくらVPS環境で、メールサーバー構築した際の備忘録です。
- バーチャルドメインで運用を想定している為、MySQLを利用して、管理はPostfixAdminで行えるようにします。
- 通信はTSLを利用します。
- アンチウィルス、スパムフィルタを利用します。
メールサーバー |
Postfix 2.6.6 |
POP、IMAPサーバー |
Dovecot 2.0.9 |
アンチウィルスソフトウェア |
ClamAV 0.97 |
スパムフィルタソフトウェア |
SpamAssassin 3.3.1 |
メールサーバー、アンチウィルスソフトウェア、スパムフィルタソフトウェアのインターフェースソフトウェア |
Amavised-new 2.8.0 |
メールアカウント管理 |
PostfixAdmin 2.3.6 |
PostfixAdminのインストールと設定
PostfixAdmin からソースをダウンロードして、解凍後、公開ディレクトリにFTPなどでアップロードします。今回は公開ディレクトリを下記のような形で設定し、PostfixAdminを配置しました。
/home/webadmin/public_html ← ドキュメントルート
/home/webadmin/public_html/postfixadmin
PostfixAdminで使用するDB、Userの作成
データベースをpostfix、ユーザーをpostfixで作成しました。
create database postfix GRANT ALL PRIVILEGES ON *.* TO 'postfix'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH GRANT OPTION;
PostfixAdminの設定
設定ファイルは、config.inc.phpですが、config.local.phpというファイルがある場合は、設定を上書きするので、config.local.phpを作成して、設定内容を記述します。
vi /home/webadmin/public_html/postfixadmin/config.local.php
<?php $CONF['configured'] = true;
$CONF['setup_password'] = 'changeme'; // ブラウザからアクセスした後に設定する
$CONF['default_language'] = 'ja';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'XXXXXXX';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';
$CONF['admin_email'] = 'postmaster@ドメイン名';
$CONF['encrypt'] = 'md5crypt'; // パスワードの暗号化方式
$CONF['page_size'] = '100';
$CONF['domain_path'] = 'YES'; // メールボックス用に、ドメインごとにディレクトリを作成する /home/virtual/virtualdomain.com/
$CONF['aliases'] = '100';
$CONF['mailboxes'] = '100';
$CONF['maxquota'] = '100';
$CONF['quota'] = 'YES';
$CONF['backup'] = 'NO';
$CONF['sendmail'] = 'NO';
$CONF['fetchmail'] = 'NO';
$CONF['new_quota_table'] = 'YES'; // dovecotのバージョンが1.2以下の場合はNOにする。
$CONF['user_footer_link'] = 'http://ドメイン名/postfixadmin/users/main.php';
// procmail使用時の設定
// メールディレクトリ自動作成
$CONF['mailbox_postcreation_script'] = 'sudo /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh';
// メールディレクトリ自動削除
$CONF['mailbox_postdeletion_script'] = 'sudo /usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh';
// ドメインディレクトリ自動削除
$CONF['domain_postdeletion_script'] = 'sudo /usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh';
?>
バーチャルドメインメールを保存しておくディレクトリ、ユーザーの作成
バーチャルドメインでは、メールボックスとUNIXユーザーは切り離されて、メールは指定したバーチャルドメイン用のメールボックスに配送されます。そのユーザーを作成します。
#groupadd -g 5000 virtual #useradd -g 5000 -u 5000 virtual
設定後、http://ドメイン/postfixadmin/setup.phpにアクセスします。
imap関数がないとWarningが出たので、
# yum install php-imap
としてインストールしました。インストール後はapacheを再起動します。
# /sbin/service/httpd restart
その後、http://ドメイン/postfixadmin/setup.phpにアクセスし、Warningが出ないことを確認したら、パスワードの設定をして、管理画面からドメイン、ユーザーを追加します。
セットアップが完了したら、セットアップ用のファイルを削除します。
# rm -f /home/webadmin/public_html/postfixadmin/setup.php
# rm -f /home/webadmin/public_html/postfixadmin/motd*
Postfixのインストールと設定
さくらVPSにははじめからPostfixがインストールされています。
インストール済みのPostfixが対応しているルックアップテーブルを表示して、MySQLに対応しているか確認します。
# postconf -m btree cidr environ hash ldap mysql nis pcre proxy regexp static unix
mysqlと表示されているのでMySQLに対応していることが確認できます。
PostfixからMySQLへアクセスする為のファイルを作成します。
# vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = XXXXXX
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
# vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = XXXXXX
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'
# vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = XXXXXX
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
# vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = XXXXXX
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
#additional_conditions = and active = '1'
Postfixの設定ファイルを編集します。
設定ファイルを変更する場合は全て、オリジナルのバックアップをとってから行いました。
# cp /etc/postfix/{main.cf,main.cf.org}
# vi /etc/postfix/main.cf
#inet_interfaces = localhost #コメントアウト
#inet_protocols = all #コメントアウト
#mydestination = $myhostname, localhost.$mydomain, localhost #コメントアウト
#最終行に追加
myhostname = wwwXXXXX.sakura.ne.jp #さくらのホスト名
inet_interfaces = all # 外部からのメールも受信する
inet_protocols = ipv4 mydestination = $myhostname, localhost
relay_domains = $mydestination
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown
# Virtual Domain w/MySQL
local_transport = local
virtual_transport = procmail # メールの配送はprocmail
procmail_destination_recipient_limit = 1
virtual_mailbox_base = /home/virtual
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 = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
maximal_backoff_time = 800s
minimal_backoff_time = 100s
bounce_queue_lifetime = 60m
maximal_queue_lifetime = 60m
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_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
# SpamAssasin
# procmailと連携するようにする。
mailbox_command = /usr/bin/procmail
# End SpamAssasin
# amavisd-new
# amavisd-newと連携するように設定
content_filter=smtp-amavis:[127.0.0.1]:10024
# End amavisd-new
新規ユーザーが追加されたらホームディレクトリに Mairdir/ を自動で作成されるようにする。
# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/
サブミッションポート587番ポートを利用する。
# cp /etc/postfix/{master.cf,master.cf.org}
# vi /etc/postfix/master.cf
#最終行に追加
submission inet n - n - - smtpd
# amavisd-new
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
# End amavisd-new
# procmail
procmail unix - n n - - pipe
flags=R user=virtual argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc
# End procmail
最後に自動起動の設定をして終了です。
# /sbin/chkconfig postfix on
dovecot2のインストールと設定
yumでインストールする。
# yum install dovecot dovecot-mysql
dovecot2の設定ファイルは/etc/dovecot/dovecot.confですが、/etc/dovecot/conf.d/以下に.confファイルを作成すれば自動で読みこんでくれるので、00-base.confというファイルを作成し設定を行います。
# vi /etc/dovecot/conf.d/00-base.conf
# debug
auth_debug_passwords = yes
auth_verbose = yes
auth_debug = yes
listen = *
disable_plaintext_auth = no
auth_mechanisms = plain login digest-md5 cram-md5
# mail dir
mail_location = maildir:/home/virtual/%d/%u
first_valid_uid = 5000
first_valid_gid = 5000
mail_plugins = quota
protocol imap {
imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
mail_plugins = $mail_plugins imap_quota
}
protocol pop3 {
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
passdb {
driver = sql
args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
}
}
plugin {
quota = maildir:User quota
}
次に、/etc/dovecot/conf.d/10-auth.confを編集します。
# cp /etc/dovecot/conf.d/{10-auth.conf,10-auth.conf.org}
# vi /etc/dovecot/conf.d/10-auth.conf
#auth_mechanisms = plain #コメントアウト
#!include auth-system.conf.ext #コメントアウト
次に、MySQLへの接続ファイルを作成します。
# vi /etc/dovecot/dovecot-postfixadmin-mysql.conf
driver = mysql
connect = host=/var/run/mysqld/mysqld.sock
dbname=postfix
user=postfix
password=XXXXXX
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/virtual/', maildir) AS home, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
次に、認証用ライブラリをインストールします。
# yum install cyrus-sasl-plain cyrus-sasl-md5
最後自動起動の設定をして終了です。
# /sbin/chkconfig dovecot on
ClamAVのインストールと設定
yumでインストール
# yum install clamd
バックアップを取って、設定(実行ユーザー(root)にする)
# cp /etc/{clamd.conf,clamd.conf.org}
# vi /etc/clamd.conf
#User clam #コメントアウト
起動と自動起動設定
# /etc/init.d/clamd start
# chkconfig clamd on
ウイルス定義ファイル更新機能を有効化と、定義ファイルの更新
# sed -i 's/Example/#Example/g' /etc/freshclam.conf
# freshclam
ClamAVとPostfixの連携設定
# vi /etc/clamd.conf
#TCPSocket 3310 #コメントアウト
/etc/init.d/clamd restart
Amavised-newのインストールと設定
yumでインストール
# yum install amavisd-new
バックアップを取って、設定
# cp /etc/amavisd/{amavisd.conf,amavisd.conf.org}
# vi /etc/amavisd/amavisd.conf
# COMMONLY ADJUSTED SETTINGS:
$undecipherable_subject_tag = ''; #←追加(パスワード付ZIPファイル受信時メール件名に「***UNCHECKED***」と付加されないようにする。)
@bypass_spam_checks_maps = (1); # controls running of anti-spam code #←コメントアウト解除(amavisd-newではスパムチェックは行なわないようにする。スパムチェックはprocmail経由でspamcコマンドで行なう)
$mydomain = 'wwwXXXXX.sakura.ne.jp'; # a convenient default for other settings #←コメントアウト解除してホスト名に変更する
#$QUARANTINEDIR = undef; # -Q #←コメントアウト(ウィルスメールは隔離しない)
#$virus_admin = undef; #←コメントアウト(ウィルス検知メールを管理者宛に通知しない)
### BLOCKED ANYWHERE
# qr'^UNDECIPHERABLE$', # is or contains any undecipherable components
# qr'^\.(exe-ms|dll)$', # banned file(1) types, rudimentary #←コメントアウト(exeファイルを受信できるようにする)
# qr'^\.(exe|lha|cab|dll)$', # banned file(1) types
# # this entry; when running chrooted one may prefer socket "$MYHOME/clamd".
# ↓追加(/var/run/clamav/clamd.sockはソケット名変更)
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
起動と自動起動設定
# /etc/init.d/amavisd start
# chkconfig amavisd on
SpamAssassin設定
起動と自動起動設定
# /etc/init.d/spamassassin start
# chkconfig spamassassin on
バックアップを取って設定
# cp /etc/mail/spamassassin/{v310.pre,v310.pre.org}
# vi /etc/mail/spamassassin/v310.pre
loadplugin Mail::SpamAssassin::Plugin::TextCat #←コメントアウト解除
rootユーザーでSpamAssassin設定ファイル最新化スクリプト作成
# cd ~
# vi spamassassin-update
#!/bin/bash
# SpamAssassin設定ファイル最新版ダウンロード
cd /etc/mail/spamassassin
wget -qN http://www.flcl.org/~yoh/user_prefs
# 設定ファイル更新時のみSpamAssassin再起動
diff user_prefs user_prefs.org > /dev/null 2>&1
if [ $? -ne 0 ]; then
cp user_prefs local.cf
# スパム判断したメールを添付形式にしないように設定
echo "report_safe 0" >> local.cf
# スパム判断したメールの件名に「***SPAM***」を付加するように設定※受信メールサーバーがPOPの場合のみ
echo "rewrite_header Subject ***SPAM***" >> local.cf
# SpamAssassin再起動
/etc/rc.d/init.d/spamassassin restart > /dev/null
fi
cp user_prefs user_prefs.org
実行権限追加
# chmod +x spamassassin-update
一度実行して、最新にする
# ./spamassassin-update
cronに登録する
# mv spamassassin-update /etc/cron.daily/
procmailの設定ファイルを新規作成する
# vi /etc/procmailrc
SHELL=/bin/bash
PATH=/usr/bin:/bin
DEFAULT=/home/virtual/$DOMAIN/$USER\@$DOMAIN/
LOCKFILE=/home/virtual/procmail.lock
LOGFILE=/home/virtual/procmail.log
#VERBOSE=ON
# SpamAssassin Spam Check
:0fw
|/usr/bin/spamc
:0
*^X-Spam-Flag: YES
$SPAM
ログの設定
# vi /etc/logrotate.d/procmail
/home/virtual/procmail.log {
missingok
nocreate
notifempty
}
メールディレクトリの自動作成・削除
PostfixAdminを使ってアカウント追加・削除する際に、ディレクトリを自動で作成・削除するようにスクリプトを作成する。
メールボックス作成・削除スクリプト用ディレクトリ作成
# mkdir /usr/local/bin/postfixadmin
PostfixAdminに有るスクリプトをコピー
# cp /home/webadmin/public_html/postfixadmin/ADDITIONS/postfixadmin-domain-postdeletion.sh /usr/local/bin/postfixadmin
# cp /home/webadmin/public_html/postfixadmin/ADDITIONS/postfixadmin-mailbox-postcreation.sh /usr/local/bin/postfixadmin
# cp /home/webadmin/public_html/postfixadmin/ADDITIONS/postfixadmin-mailbox-postdeletion.sh /usr/local/bin/postfixadmin
削除したメールボックスを保存するディレクトリを作成
# mkdir /home/virtual/.deleted-maildirs
# chmod 0700 /home/virtual/.deleted-maildirs
# chown virtual:virtual /home/virtual/.deleted-maildirs
スクリプトの編集(メールボックス作成)
# vi /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh
#basedir=/var/spool/maildirs #←コメントアウト
basedir=/home/virtual #←追加
# ↓コメントアウト
#maildirmake "$maildir"
#if [ ! -d "$maildir" ]; then
# echo "$0: maildirmake didn't produce a directory; bailing out."
# exit 1
#fi
exit 0の前に追加
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 virtual:virtual "$maildir"
chmod -R 700 "$maildir"
スクリプトの編集(メールボックス削除)
# vi /usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh
#basedir=/var/spool/maildirs
basedir=/home/virtual
#trashbase=/var/spool/deleted-maildirs
trashbase=/home/virtual/.deleted-maildirs
#subdir=`echo "$1" | sed 's/@.*//'`
subdir=$1
スクリプトの編集(ドメイン削除用)
# vi /usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh
#basedir=/var/spool/maildirs
basedir=/home/virtual
#trashbase=/var/spool/deleted-maildirs
trashbase=/home/virtual/.deleted-maildirs
実行権限追加
# chmod 0700 /usr/local/bin/postfixadmin/postfixadmin*
apacheがsudo出来るように設定する
# visudo
Defaults requiretty
Defaults:apache !requiretty #←追加
root ALL=(ALL) ALL
apache ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh #←追加
apache ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh #←追加
apache ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh #←追加
再起動して確認
/etc/init.d/postfix restart
/etc/init.d/dovecot restart
/etc/init.d/spamassassin restart
/etc/init.d/clamd restart
/etc/init.d/amavisd restart
TSLの設定追記…