PostfixAdminでバーチャルメールの構築

postfix/dovecotのメールサーバーで、従来の方式「FTPユーザーがメール受信ユーザー」という環境からバーチャルメール環境に切り替える方法について書きます。
バーチャルメールの運用ツールは PostfixAdmin 1択です。
他によいツールを知りません。
そして、PostfixAdminを使用するにはデータベース MySql が必要です。

前提条件としてpostfix/dovecotでメールを送受信できる環境まで設定済みとします。
postfix/dovecotのインストールと設定については postfix 2.3.x の設定dovecot ver.1系と2系の違い を参照してください。

■ PostfixAdmin インストール

(0) 事前準備

mysql に postfixデータベース、専用のpostfixユーザーを作成しておく必要があります。
(データベースは空でよいです)

データベース名: postfix
ユーザー名    : postfix
パスワード    : xxxxxxxxxxxx

メールボックスにアクセスするバーチャルユーザーを作成します。
後でいくつかの設定ファイルにユーザーID、グループIDを記述するため、ここで決めておきます。
使っていない番号なら何でもよいのですが、ここでは ユーザーID = 600、 グループID = 600 とします。

# mkdir /home/vmailbox
# groupadd -g 600 vuser
# useradd -g vuser -u 600 -d /home/vmailbox -s /sbin/nologin vuser
# chown vuser:vuser /home/vmailbox
# chmod 771 /home/vmailbox

(1) PostfixAdmin インストール

# cd /usr/local/src
# 
# wget http://jaist.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.5/postfixadmin-2.3.5.tar.gz
# 
# tar xzvf postfixadmin-2.3.5.tar.gz
# mv postfixadmin-2.3.5 /var/www/postfixadmin
# cd /var/www/postfixadmin
# chown -R apache *
#

(2) PostfixAdmin 設定

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


//$CONF['configured'] = false;
$CONF['configured'] = true;

$CONF['setup_password'] = 'changeme'; // setup後に画面に表示されたものを設定

//$CONF['default_language'] = 'en';
$CONF['default_language'] = 'ja';

$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'xxxxxxxxxxxx';
$CONF['database_name'] = 'postfix';

$CONF['encrypt'] = 'md5crypt';	// DBにはMD5ハッシュを格納
$CONF['encrypt'] = 'cleartext';	// APOPが必要なら平文で格納

//$CONF['page_size'] = '10';
$CONF['page_size'] = '100';

//$CONF['domain_path'] = 'NO';	//  NO の場合 maildir:/home/vmailbox/%n@%d
$CONF['domain_path'] = 'YES';	// YES の場合 maildir:/home/vmailbox/%d/~

//$CONF['domain_in_mailbox'] = 'YES';	// YES の場合 maildir:/home/vmailbox/%d/%n@%d
$CONF['domain_in_mailbox'] = 'NO';	//  NO の場合 maildir:/home/vmailbox/%d/%n

$CONF['aliases'] = '100';
$CONF['mailboxes'] = '100';
$CONF['maxquota'] = '100';

$CONF['quota'] = 'NO'; 

$CONF['alias_control'] = 'YES';	// エイリアス(転送先などの作成)を自分で制御

$CONF['alias_control_admin'] = 'YES';

$CONF['backup'] = 'NO'; 
$CONF['sendmail'] = 'NO'; 
$CONF['fetchmail'] = 'NO';

$CONF['user_footer_link'] = "main.php";

//$CONF['show_footer_text'] = 'YES';
$CONF['show_footer_text'] = 'NO';

//$CONF['emailcheck_resolve_domain']='YES';
$CONF['emailcheck_resolve_domain']='NO';

// 管理者メールドレス
$CONF['admin_email'] = 'admin@運用ドメイン名';

$CONF['default_aliases'] = array (
    'admin' => 'admin@運用ドメイン名'
);

/var/www/postfixadmin/backup.php

session_cache_limiter('public'); // IE & SSLサイト用の設定を追加します
require_once('common.php');

Apache alias設定

/etc/httpd/conf.d/postfixadmin.conf

Alias /postfixadmin "/var/www/postfixadmin"

<Directory "/var/www/postfixadmin">
    Order allow,deny
    Allow from all
</Directory>

Apache再起動

# apachectl configtest
# apachectl restart

ブラウザで初期設定

http://xxxxxxxxxxxx/postfixadmin/setup.php
Setup password を設定した後
ドメイン管理者メールアドレス xxxx@xxxx.xxxx ※特権管理者のログイン名
ドメイン管理者パスワード     xxxx

画面に setup_password のハッシュが表示されるので config.inc.php に記述します。

■ postfixの postfixadmin対応

/etc/postfix/main.cf

myorigin = $myhostname

inet_interfaces = all

home_mailbox = Maildir/

# SMTP-Auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

# dovecot-sasl
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# for broken
broken_sasl_auth_clients = yes

# hashバーチャルドメイン設定を使わない
#virtual_alias_maps = hash:/etc/postfix/virtual

# バーチャルドメイン設定
virtual_transport = virtual
virtual_mailbox_base = /home/vmailbox
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
# 事前準備で用意したユーザID,グループID
virtual_minimum_uid = 600
virtual_uid_maps = static:600
virtual_gid_maps = static:600

# メールボックスサイズ制限
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = yes

以下のパスワード部分は、事前準備で作成したmysqlのpostfixデータベースのパスワードを設定します。

/etc/postfix/mysql_virtual_alias_maps.cf

user = postfix
password = xxxxxxxxxxxx
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address

/etc/postfix/mysql_virtual_domains_maps.cf

user = postfix
password = xxxxxxxxxxxx
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfix
password = xxxxxxxxxxxx
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

user = postfix
password = xxxxxxxxxxxx
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username

■ dovecotの postfixadmin対応

dovecot-mysqlドライバーが必要です
dovecot-mysqlドライバーをインストールします。

# yum -y install dovecot-mysql

/etc/dovecot/dovecot-mysql.conf

driver = mysql
#default_pass_scheme = MD5-CRYPT
default_pass_scheme = PLAIN
connect = dbname=postfix user=postfix host=/var/lib/mysql/mysql.sock password=xxxxxxxxxxxx
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/vmailbox/', maildir) as home, 600 as uid, 600 as gid FROM mailbox WHERE username = '%u' AND active = '1'

/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/home/vmailbox/%d/%n

first_valid_uid = 600
first_valid_gid = 600

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

protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}

/etc/dovecot/conf.d/10-auth.conf

#disable_plaintext_auth = yes
disable_plaintext_auth = no

#auth_mechanisms = plain
auth_mechanisms = plain login

#!include auth-system.conf.ext
!include auth-mysql.conf.ext

/etc/dovecot/conf.d/10-master.conf

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

★新規作成
/etc/dovecot/conf.d/auth-mysql.conf.ext

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

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

蛇足ですがpostfixデータベースのパスワードxxxxxxxxxxxxを書いておいたファイルをFTPでアップロードして置換すれば一発です。

sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_alias_maps.cf
sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_domains_maps.cf
sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_mailbox_maps.cf
sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
sed -i "s/xxxxxxxxxxxx/パスワード/g" /etc/dovecot/dovecot-mysql.conf

自動起動の設定、再起動など

chkconfig dovecot on
chkconfig postfix on

/etc/init.d/dovecot restart
/etc/init.d/postfix restart

tail -30 /var/log/maillog

(おまけ)postfixadmin メールボックス自動削除

postfixadminでメールアドレス削除してもメールボックスのディレクトリは削除されないので、それをcronで削除する仕組みを作ります。

/var/www/postfixadmin/ADDITIONS/mailbox_remover.pl


# メールボックス削除後のアーカイブフォルダ
my $archdir="/home/vmailbox_archives";

# z option があるアーカイブ圧縮コマンド
my $archcmd="/bin/tar";

# メールボックスのベースフォルダ
my $maildir_path="/home/vmailbox";

# サブフォルダを探索する必要がある場合に config.inc.php が必要
# $CONF['domain_path'] = 'YES';
my $pfadmin_config="/var/www/postfixadmin/config.inc.php";

# database information
my $host="localhost";
my $port="3306";
my $userid="postfix";
my $passwd="xxxxxxxxxx";
my $db="postfix";
##########

#print "Ctrl-C in 5 seconds to abort before removal starts...\n";
#sleep 5;

120行目 行末セミコロンを追加 ;
	system(@args) == 0 or die "Creating archive for $maildir failed: $?";

実行可能にして

# chmod 755 /var/www/postfixadmin/ADDITIONS/mailbox_remover.pl

本当に削除じゃなくて移動するので、移動先アーカイブフォルダ作成

# mkdir /home/vmailbox_archives

cron登録
/etc/cron.d/postfixadmin

0 4 * * * root /var/www/postfixadmin/ADDITIONS/mailbox_remover.pl

これで毎朝4時にチェックして、データベースから無くなってるメールアドレスのデータを /home/vmailbox_archives へ移動します。
本当に要らない場合は時々自分で削除するか、または別のcron仕込む等で。

コメントを残す