メールサーバの移行の前に、現状の構成の整理
受信については、各プロバイダのメールを全て、独自ドメインのサーバに転送するよう設定している。
サーバのアプリケーションは Postfix。
SASL などを使用できるよう、NetBSD 付属のではなく、
pkgsrc で mk.conf に以下のオプションを指定して作成したものを使用している。
PKG_OPTIONS.postfix = sasl pcre
IMAPサーバは Dovecot で運用。
Postfix の main.conf に以下を記述し、
ローカル配送に Dovecot の配送プログラムを使用するようにしている。
/usr/pkg/etc/postfix/main.conf
mailbox_command = /usr/pkg/libexec/dovecot/delive
送信は、独自ドメインのサーバ(Postfix)で全てを一旦受け取る。
ここは、Postfix でいう smtpd の担当。
送信の場合のメールクライアントからの受付は submission port (587) で、
STARTTLS、認証必須。
認証は Dovecot の認証用のソケット(ここでは /var/run/dovecot/auth-client)を利用。
STARTTLS で使用するサーバ証明書は、openssl で第四種オレオレ証明書を作成。
/usr/pkg/etc/postfix/master.cf
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
/usr/pkg/etc/postfix/main.cf
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
smtpd_tls_cert_file = /etc/openssl/certs/mailservercert.pem
smtpd_tls_key_file = /etc/openssl/private/serverkey.pem
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client
Dovecot の認証用ソケットの設定(IMAP用も兼用)は以下。
認証は、UNIX のパスワード認証(passdb passwd)と
パスワードファイルによる認証 (passdb passwd-file)を使用可能とし、
パスワードファイルによる認証スキームとして CRAM-MD5 を指定している。
/usr/pkg/etc/dovecot.conf
auth default {
mechanisms = plain cram-md5
passdb passwd {
}
passdb passwd-file {
args = scheme=cram-md5 /usr/pkg/etc/cram-md5.pwd
}
userdb passwd {
}
user = root
socket listen {
client {
path = /var/run/dovecot/auth-client
mode = 0660
group = mail
}
}
}
Dovecot での CRAM-MD5 のパスワードは以下のようにして作成する。
$ dovecotpw -s CRAM-MD5
Enter new password: XXXXXX
Retype new password: XXXXXX
{CRAM-MD5}00747cf2ffaf11c5ea4a64979c3901fc1d20dee13f480bb598f7d8575b23e61b
“{CRAM-MD5}” より後の部分が CRAM-MD5 のパスワードのデータである。
これを切り取って、ユーザ名、”:”、パスワードデータ の形式で cram-md5.pwd に記述すればよい。
cram-md5.pwd は先の dovecot.conf 中で指定したファイルである。
/usr/pkg/etc/cram-md5.pwd
hoge:00747cf2ffaf11c5ea4a64979c3901fc1d20dee13f480bb598f7d8575b23e61b
fuga:4b05653a6b48eeeb7ef25800a514e2fe6d6ea31ff6d3a17bd2f4ac7cad390426
CRAM-MD5 だと MD5 の計算途中のデータを保存するので、
生のパスワードを保存するよりは安全らしい。
受け取ったメールは envelope sender の値に応じて、
送信する SMTP サーバを切り替える。
直接相手先には送らない。
独自ドメインを取得してはいるが、プロバイダのメールアドレスを使用して送るメールについては、
できるだけ一般のクライアントと同様となるように経路を選択するポリシーを適用する。
たとえば、 メールの envelope sender がプロバイダ A 所属のアドレスが記述されていれば
A の送信用サーバに、
プロバイダ B 所属のアドレスが記述されていれば
B の送信用サーバにメールを転送するといった具合である。
送信用サーバごとに切り替える情報は以下のとおり。
- SMTPサーバのアドレスとポート (25 または 587)
- 認証用IDとパスワードのセット
envelope sender で切り替えを行う設定は、以下のとおり。
/usr/pkg/etc/postfix/main.cf
sender_dependent_default_transport_maps =
hash:$config_directory/sender_transport
/usr/pkg/etc/postfix/sender_transport
@プロバイダAのドメイン smtp:[Aの送信用サーバ]:587
@プロバイダBのドメイン smtp:[Bの送信用サーバ]:587
@gmail.com smtp:[smtp.gmail.com]:587
プロバイダの送信用サーバは認証が必要(とくにそのプロバイダを接続業者としていない場合は)なので、
送信用サーバとその認証情報を関連付ける。
/usr/pkg/etc/postfix/main.cf
smtp_tls_security_level = may
smtp_sasl_auth_enable = yes
smtp_sasl_type = cyrus
smtp_sasl_password_maps = hash:$config_directory/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
/usr/pkg/etc/postfix/sasl_passwd
[Aの送信用サーバ]:587 AのID:Aのパスワード
[Bの送信用サーバ]:587 BのID:Bのパスワード
[gmail.com]:587 gmailのID:gmailのパスワード
プロバイダへの送信時に使用する認証IDは、
メールを送信したユーザに関係なく共通になってしまうが、
ここは気にしないことにする。
あと、sender_transport や sasl_passwd は postmap を使って hashed database にしておく。
駆け足で、これまでの構成を記述したが、
あらためて読み返すとずいぶん複雑なものになってしまっている。
メールサーバを移行してしまった後は、これらは全て不要となるわけだが…。