さくらインターネット VPS Ubuntu化と、機能インストールのメモ (3)

その2からの続きでございます。
メールサーバは未経験なので、慎重に行きます。。。

postfix + MySQL + postfixadmin + dovecot での、メールサーバ構築

などなど・・・

パッケージの導入は終わっているので、それぞれの設定になる。

postfixadminの初期設定

ブラウザで、初期設定画面(http://サーバアドレス/postfixadmin/setup.php)を開く。
[Change setup password]のタイトルでpasswordフォームがあるので、任意のパスワードを入力して、[Generate password hash]ボタンを押す。

ページが更新されて、管理者アカウントの作成画面になります。
生成したハッシュをconfig.inc.phpに書き込んでね!と書いてあるのを見落とすと、堂々巡りになります。
管理者アカウントを作る前に、ターミナル経由で、/etc/postfixadmin/config.inc.php に生成されたハッシュを書き込んでおきます。

/etc/postfixadmin/config.inc.php

root@www0000ua:~# diff /etc/postfixadmin/config.inc.php.org /etc/postfixadmin/config.inc.php
31c31
< $CONF['setup_password'] = 'changeme';
---
> $CONF['setup_password'] = '[生成されたハッシュ値]';
36c36
< $CONF['postfix_admin_url'] = '';
---
> $CONF['postfix_admin_url'] = 'http://[設定しているサーバアドレス]/postfixadmin/';
43c43
< $CONF['default_language'] = 'en';
---
> $CONF['default_language'] = 'ja';
root@www0000ua:~#

設定ファイルの修正後、続けて管理アカウントを作成します。
[Create superadmin account]フォームに、以下の内容を入力します。

Setup password ハッシュ値生成時に入力した、
セットアップ用パスワード
ドメイン管理者: 管理者アカウントのメールアドレス
このサーバで管理されないメールアドレスでもよい。
パスワード: 管理者アカウントのパスワード
メールアドレスのパスワードと一致する必要はない。
パスワード (確認): 上記の確認用

管理アカウントの作成後、http://サーバアドレス/postfixadmin/ からログインできることを確認したら、初期設定画面を殺します。

root@www0000ua:~# cd /usr/share/postfixadmin/
root@www0000ua:/usr/share/postfixadmin# mv setup.php setup.php.org
root@www0000ua:/usr/share/postfixadmin#

とりあえず、postfixadminが動くようにして、次へ。
postfixとdovecotが、postfixadminの管理するメールアカウントを参照して動くようにする。

postfixの設定

webminから、以下の設定でunixユーザを作成。postfixのwork userとする。
homeディレクトリを仮想ドメインのメールボックス領域として使う。

ユーザ名 vuser
ユーザID 10000
ホームディレクトリ /home/virtual
パスワード ログイン禁止
プライマリグループ 新しいグループをユーザ名と同じ名前で

PostfixからpostfixadminのDBへ接続する接続設定ファイルを準備します。
パッケージ postfix-mysql を導入していても、下記のファイルは存在しないので、manや資料を参照しながら新規作成。
postfixadminのインストール時に作成されたMySQLアカウント(postfixadmin)でDBに接続するので、パスワードを控えておく。
パスワード自動生成でインストールした場合には、/etc/postfixadmin/config.inc.php$CONF['database_password']を参照して確認。

/etc/postfix/mysql_virtual_alias_maps.cf

user = postfixadmin
password = xxxxxxxxxxxxxxx
hosts = localhost
dbname = postfixadmin
table = alias
select_field = goto
where_field = address

/etc/postfix/mysql_virtual_domains_maps.cf

user = postfixadmin
password = xxxxxxxxxxxxxxx
hosts = localhost
dbname = postfixadmin
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfixadmin
password = xxxxxxxxxxxxxxx
hosts = localhost
dbname = postfixadmin
table = mailbox
select_field = maildir
where_field = username

/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

user = postfixadmin
password = xxxxxxxxxxxxxxx
hosts = localhost
dbname = postfixadmin
table = mailbox
select_field = quota
where_field = username
#additional_conditions = and active = '1'

/etc/postfix/main.cfを編集して、virtual domain を使えるように設定する。
この設定では、以下の点も変更

  • 実体のあるアカウントへのメールサイズ上限を設定
  • smtpd_client_restrictions で SpamCopのRBLによるスパム対策
root@www0000ua:~# diff /etc/postfix/main.cf.org /etc/postfix/main.cf
34,35c34,35
< mydestination = www0000ua.sakura.ne.jp, localhost.sakura.ne.jp, , localhost
< relayhost =
---
> mydestination = $myhostname localhost.$mydomain localhost
> #relayhost =
39c39,43
< inet_interfaces = all
---
>
> # 物理サーバならALLでいいが、仮想サーバなので、自分のIFを明示指定する。
> # inet_interfaces = ALL
> inet_interfaces = 254.254.254.254
>
40a45,75
>
> ###########################
> # timeout and  quota
> maximal_backoff_time = 800s
> minimal_backoff_time = 100s
> bounce_queue_lifetime = 60m
> maximal_queue_lifetime = 60m
> message_size_limit = 20480000
>
> ############################
> # virtual mailbox settings
> virtual_minimum_uid = 10000
> virtual_uid_maps = static:10000
> virtual_gid_maps = static:10000
>
> local_transport = local
> virtual_transport = virtual
>
> 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_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
>
>
> # sasl
48c83,84
< smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
---
> # smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
> smtpd_recipient_restrictions = reject_rbl_client bl.spamcop.net, permit_mynetworks, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_sasl_authenticated, reject_unauth_destination

root@www0000ua:~#

上記のうち、inet_interfacesの設定で、debianのサーバではまりました。
どうも、ALLにしてあると、VPS側ではなくHOST server側のIPをIFにしている様な挙動がありました。
さしあたりこれで動きますが、いいのかなぁ…?

引き続き、/etc/postfix/master.cf を編集して、サブミッションポートとsmtpsを有効にします。

root@www0000ua:~# diff /etc/postfix/master.cf.org /etc/postfix/master.cf
12c12
< #submission inet n       -       -       -       -       smtpd
---
> submission inet n       -       -       -       -       smtpd
17c17
< #smtps     inet  n       -       -       -       -       smtpd
---
> smtps     inet  n       -       -       -       -       smtpd
root@www0000ua:~#

dovecotの設定

パッケージはインストールしてあるので、設定を進める。

debian 6.0 (squeeze) とubuntu 10.04 LTS の構成の違いとして、ubuntuにはパッケージ dovecot-postfix が提供されている。
導入すると、/etc/dovecot/conf.d に 01-dovecot-postfix.conf が追加されている。
これを編集。

root@www0000ua:~# diff /etc/dovecot/conf.d/01-dovecot-postfix.conf.org /etc/dovecot/conf.d/01-dovecot-postfix.conf
2,3c2,6
< protocols = imap pop3 imaps pop3s managesieve
< disable_plaintext_auth = yes
---
> #protocols = imap pop3 imaps pop3s managesieve
> protocols = imap pop3 imaps pop3s
> #disable_plaintext_auth = yes
> disable_plaintext_auth = no
>
8d10
< mail_location = maildir:~/Maildir
10a13,26
> # Location for users' mailboxes. This is the same as the old default_mail_env
> # setting. The default is empty, which means that Dovecot tries to find the
> # mailboxes automatically. This won't work if the user doesn't have any mail
> # yet, so you should explicitly tell Dovecot the full location.
> #mail_location = maildir:~/Maildir
> mail_location = maildir:%h
>
> # Valid UID range for users, defaults to 500 and above. This is mostly
> # to make sure that users can't log in as daemons or other system users.
> # Note that denying root logins is hardcoded to dovecot binary and can't
> # be done even if first_valid_uid is set to 0.
> first_valid_uid = 10000
> last_valid_uid = 10000
>

続いて、認証をDBの情報で行わせるための設定ファイルと、ユーザー認証で使用する暗号化方式を指定する設定ファイルを、/etc/dovecot/auth.d に置く。

/etc/dovecot/auth.d/dbconf.auth

# SQL database 
passdb sql {
  # Path for SQL configuration file
  args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}

# SQL database 
userdb sql {
  # Path for SQL configuration file
  args = /etc/dovecot/dovecot-postfixadmin-mysql.conf
}

/etc/dovecot/auth.d/mechanisms.auth

# Space separated list of wanted authentication mechanisms
# NOTE: See also disable_plaintext_auth setting.
mechanisms = digest-md5 cram-md5 login apop plain

認証処理でのDB接続設定で、設定ファイルを/etc/dovecot/dovecot-postfixadmin-mysql.confと定義した。
よって、このファイルを準備する。
DB接続文字列は、PostfixからpostfixadminのDBへ接続する接続設定ファイルを準備した際と同じものを使用します。

/etc/dovecot/dovecot-postfixadmin-mysql.conf

driver = mysql
connect = host=/var/run/mysqld/mysqld.sock dbname=postfixadmin user=postfixadmin
 password=xxxxxxxxxxxxxxx
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active =
 '1'
user_query = SELECT concat('/home/virtual/', maildir) AS home, 10000 AS uid, 1000
0 AS gid FROM mailbox WHERE username = '%u' AND active = '1'

動作のための設定と併せ、dovecotの再起動スクリプトを設定する。
VPSで動いているため、他のサーバの負荷によっては時計のずれが発生する可能性があり、その際にdovecotが終了する。
サービスが止まっていてはまずいので、確認させて、必要なら再起動させる。

/etc/dovecot/dovecot_check_restart.sh

#!/bin/sh
LSOF=/usr/bin/lsof
SERVICE=/usr/sbin/service
LOGGER=/usr/bin/logger

HOST='localhost'
PORT=110
#PORT=143
#HP=4TCP@$HOST:$PORT
HP=4TCP:$PORT
echo 'Checking to see if Dovecot is up...'
if ( $LSOF -Pni $HP -s TCP:LISTEN 2>&1 >/dev/null ); then
  echo 'Dovecot is up';
else
  echo 'Dovecot is down, restarting...';
  $SERVICE dovecot restart
  $LOGGER -p mail.info -t dovecot_check_restart.sh -i restarting Dovecot
fi

作成したスクリプトは、実行可能にしておく

root@www0000ua:~# chmod 750 /etc/dovecot/dovecot_check_restart.sh
root@www0000ua:~# ls -l /etc/dovecot/dovecot_check_restart.sh
-rwxr-x--- 1 root root 425 2011-11-22 14:25 /etc/dovecot/dovecot_check_restart.sh
root@www0000ua:~#

定期的に監視されるように、cronに登録しておく。

/etc/cron.d/dovecot_check_restart

#
# Regular cron jobs for gracefully check Dovecot and restart if necessary
#
# Every two minutes.
*/2 * * * root /etc/dovecot/dovecot_check_restart.sh 2>&1 > /dev/null

動作の確認

DNSの設定をしてからでないと確認できないなぁ(ぁ
さしあたり、postfixとdovecotを再起動して、エラーにならないか確認しておく。

root@www0000ua:~# /etc/init.d/postfix restart
 * Stopping Postfix Mail Transport Agent postfix                         [ OK ]
 * Starting Postfix Mail Transport Agent postfix                         [ OK ]
root@www0000ua:~# /etc/init.d/dovecot restart
 * Restarting IMAP/POP3 mail server dovecot                                     If you have trouble with authentication failures,
enable auth_debug setting. See http://wiki.dovecot.org/WhyDoesItNotWork
This message goes away after the first successful login.
                                                                         [ OK ]
root@www0000ua:~#

ここまでは無事、と。

bindの設定

webminにログインし、「サーバ」-> 「BIND DNS サーバ」を開き、マスターゾーンを新規に設定する。
ポイゾニングが怖いので、TTLとかは短めに設定するが、レコードファイルの編集の時に対応。
マスターサーバ名は、さくらインターネットから振られたホスト名にしておく。

新規のマスター ゾーン オプション
新規のマスター ゾーン オプション
ゾーンの種類 順引き (名前をアドレスに)
ドメイン名 / ネットワーク example.jp
レコード ファイル 自動
マスター サーバ www0000ua.sakura.ne.jp
E メール アドレス admin@manager.co.jp.tld
ゾーン テンプレートを使用しますか? いいえ
テンプレート レコードの IP アドレス (空白)
Add reverses for template addresses? はい
リフレッシュ時間 10800
転送再試行時間 3600
期限切れ時間 604800
TTL時間のデフォルト 38400

引き続き、「サーバ」-> 「BIND DNS サーバ」-> [既存の DNS ゾーン]の「example.jp」を開く。
レコード ファイルの編集を開き、定義を行う。
とりあえず、ttlはチキン設定で

$ttl 1800
example.jp.	IN	SOA	www0000ua.sakura.ne.jp. admin.manager.co.jp.tld. (
			1321941750
			1080
			3600
			604800
			3840 )
example.jp.		IN	NS	www0000ua.sakura.ne.jp.
example.jp.		IN	NS	ns.example.jp.
;
			IN	MX  50	example.jp.
;
example.jp.		IN	A	254.254.254.254
ns.example.jp.		IN	A	254.254.254.254
;
mail.example.jp.	IN	CNAME	example.jp.
www.example.jp.	IN	CNAME	example.jp.
;

設定を終えたら、Apply Zoneで適用する。
のちに、ドメインレジストラ側で、example.jpのネームサーバを、このサーバに指定する。

これでメール周りの確認ができるので、postfixadminでテストアカウントを作ってみたら、メールが送信できません!ですと?
一旦リブートしてから、もう一度確認。・・・NG!
ログを確認していると嫌なものが

root@www0000ua:/var/log# tail  mail.log
Nov 22 16:24:23 www0000ua postfix/trivial-rewrite[1468]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Nov 22 16:24:23 www0000ua postfix/trivial-rewrite[1468]: fatal: mysql:/etc/postfix/mysql_virtual_alias_maps.cf(0,lock|fold_fix): table lookup problem
Nov 22 16:24:24 www0000ua postfix/smtpd[1459]: warning: problem talking to service rewrite: Success
Nov 22 16:24:24 www0000ua postfix/master[1213]: warning: process /usr/lib/postfix/trivial-rewrite pid 1468 exit status 1
Nov 22 16:24:24 www0000ua postfix/master[1213]: warning: /usr/lib/postfix/trivial-rewrite: bad command startup -- throttling

一つは、MySQLのsocketを掴めていない模様。
もう一つは、/etc/postfix/mysql_virtual_alias_maps.cfでしているテーブル参照の問題。
一つ目を解決してからですな。
/var/run/mysqld/mysqld.sock はMySQLが動いていれば、存在するはずなので、試に。

root@www0000ua:~# ls -l /var/run/mysqld/mysqld.sock
srwxrwxrwx 1 mysql mysql 0 2011-11-22 16:47 /var/run/mysqld/mysqld.sock
root@www0000ua:~#

やっぱり、パーミッションですか、これは。

2案のほうでやってみる。以下、修正結果

root@www0000ua:~# grep proxy /etc/postfix/main.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
root@www0000ua:~#

MySQLのmapping file関係に "proxy:"の記載を追加。これで再起動して、リトライ。
結果、NG。MySQLのエラーは出なくなったが。
気になったので、postfixの設定を再度変更

root@www0000ua:~# diff /etc/postfix/main.cf.mod1  /etc/postfix/main.cf
41,42c41,42
< # inet_interfaces = ALL
< inet_interfaces = 254.254.254.254
---
> #inet_interfaces = ALL
> inet_interfaces = 254.254.254.254, 127.0.0.1
60c60,62
< local_transport = virtual
---
> local_transport = local
> virtual_transport = virtual
>
72d73
< smtpd_client_restrictions = reject_rbl_client bl.spamcop.net
73a75
> # sasl
81c83,84
< smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
---
> # smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
> smtpd_recipient_restrictions = reject_rbl_client bl.spamcop.net, permit_mynetworks, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_sasl_authenticated, reject_unauth_destination
root@www0000ua:~#

細々変わっているが、肝は赤字の部分。
inet_interfaces = ALL で設定すると、以下のメッセージを吐いて、postfixがabortする。

root@www0000ua:~# /etc/init.d/postfix restart
 * Stopping Postfix Mail Transport Agent postfix
postfix: fatal: parameter inet_interfaces: no local interface found for 192.168.111.111
                                                                                                    [fail]

これは、VPSのHOST側のIFを拾っているのが原因と推測されるため、inet_interfacesでは明示的にIPアドレスを指定した。
ただし、それでは設定が足りず、今度はlocal loopback に対して、listenしない状況になる。
対策として、local loopback のIPアドレスを併記した。
とりあえず、内側はこれでOKかと。

メーラから接続すると、

  • pop3 - 認証エラー
  • smtp - 認証が無効

で、共にエラー。(現状、SSL関係の作業を全くしていないので、pop3s, smtps, imapsは動かない。)
まずはdovecotを再設定。
webminから見ると・・・MySQLの接続設定が行方不明ですかorz
他の設定ファイルとの絡みをみると、/etc/dovecot/conf.d 内と /etc/dovecot/auth.d 内は、パッケージ dovecot-postfix が置いたファイル (/etc/dovecot/conf.d/01-dovecot-postfix.conf, /etc/dovecot/auth.d/01-dovecot-postfix.auth)以外は参照しない模様。
別ファイルとして作業した設定項目を、前述のファイルに取り込む。が、NG。
mail.logを見ると、ただの認証エラー扱いだが・・・
DBを確認すると、パスワードが暗号化されている。(md5crypt)
dovecotはplain 参照。
本来は、dovecotの参照を変えたほうがよいのだが、今回はpostfixadminの設定を修正する。

#$CONF['encrypt'] = 'md5crypt';
$CONF['encrypt'] = 'cleartext';

postfixadminでログインできなくなるので、DBのデータを直接触って、入れるようにする。(password関係)
同様に、mailbox関係も直して、確認。OK。

引き続き、smtp-authの設定。メーラから繋ぐと

503 5.5.1 Error: authentication not enable

ですと?

設定を一通り再確認。/etc/postfix/main.cf で2重定義してるorz
yesの後にnoでつぶしてました。
修正して一件落着

さて、認証局とかやらんとなぁ。。。