Quantcast
Channel: さくらたんどっとびーず
Viewing all articles
Browse latest Browse all 21

PostfixとDovecotでさくらVPS上にバーチャルメールボックスが利用できるメールサーバを作る

$
0
0

Postfix と Dovecot でさくらVPS上にメールサーバを動かしてみましたので設定例を置いときます。

Postfix は SMTP サーバでメールを送る部分の担当、Dovecot は POP3/IMAP サーバでクライアントからメールを見る部分の担当です。完結したメールサーバとして動かすには両方必要になります。

設定方針は以下の3点です。

  1. バーチャルメールボックスの設定を行い Unix ユーザーを作らなくてもメールを受信できるように設定します。
  2. なるたけセキュリティ的に硬めにしたかったので、自サーバ宛のメールの配送と、サブミッションポート経由で SSL + SMTP AUTH で認証されたクライアントからの外部へのリレーのみを許可します。
  3. バーチャルメールボックスのパスワード管理は Dovecot で一元管理します。(Postfix での SMTP AUTH の認証時のアカウント管理に Dovecot を使うという意味です。Postfix と Dovecot で別々にパスワード管理する方法もありますがぶっちゃけ面倒くさいので。)

さくらVPSっつーか CentOS 上で Postfix と Dovecot を設定する例はググったら沢山でてきますので、違う方法の設定が必要な場合は適当にお調べください。つーことで本題に突入。

パッケージのインストール

yum から postfix と dovecot をインスコします。cyrus-sasl-md5 は SMTP 認証等で CRAM-MD5 による認証を有効にする場合に必要です。

$ yum install postfix dovecot cyrus-sasl-md5

sendmail とか他のメールサーバを外向けの設定で運用していない場合はいきなり postfix を有効にして問題ありませんので、その前提で話を進めます。

CentOS をインストールした状態では sendmail が動いていますので落とします。以下のように chkconfig で確認して on になっていたら、

$ chkconfig --list sendmail
sendmail        0:off   1:off   2:on    3:on    4:on    5:on    6:off

sendmail を止めてから postfix を起動します。ついでに chkconfig でサーバリブート時に postfix が起動するようにします。

$ /etc/init.d/sendmail stop
$ /etc/init.d/postfix reload
$ chkconfig sendmail off
$ chkconfig postfix on

続けて alternatives で(サーバからのメール送信に使われる) sendmail コマンドを postfix に変更します。

現代的な Unix 系のシステムでは sendmail というメールサーバと sendmail というコマンドは別物として扱われており(元々は sendmail メールサーバに sendmail コマンドが付いていたのですが、sendmail コマンドを呼び出しているアプリケーションプログラムが多々存在するためメールサーバを変更する際に都合が悪いので、コマンドを分けた形です)。

CentOS ではメールを送信するために使う sendmail コマンドは alternatives で指定されたコマンドへのシンボリックリンクとなっています。

以下のように alternatives を実行すると、sendmail コマンドを実行した際に sendmail.postfix (Postfix の sendmail コマンド)が実行されるようになります。

$ alternatives --config mta

There are 2 programs which provide 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number: 2

以上が終わったらローカル配送できてるかテストしてみます。(別にしなくても良いですけど早めに問題見つけといた方が楽ですし…)

てことで適当なユーザー(以下の例では root)でログインして適当なユーザーにメールを送ってみます。(シェルから sendmail コマンドを実行すればメールを送れます。sendmail コマンドを実行する際、”.” だけの行を入力するとメールが送信されます。)

$ sendmail root
From: root
To: root
Subject: test

test
.

送ったメールは(宛先のユーザーでログインして)mail コマンドで見れます。

$ mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root@www9999u.sakur  Fri Dec 16 00:33  14/466   "test"
&
Message 1:
From root@www9999u.sakura.ne.jp  Fri Dec 16 00:33:13 2011
X-Original-To: root
Delivered-To: root@www9999u.sakura.ne.jp
From: root@www9999u.sakura.ne.jp
To: root@www9999u.sakura.ne.jp
Subject: test
Date: Fri, 16 Dec 2011 00:33:00 +0900 (JST)

test

& q
Saved 1 message in mbox

メールが届いてなかったら /var/log/maillog を見て問題を探してください。(上記の設定内容でローカル配送のメールが届くのが遅れたりすることは基本的にありませんので「届いてなかった=問題がある」と判断してもらって結構です。)

Postfix と Dovecot の設定

パスワード管理を共有する関係上、両方とも動いてから動作確認する方が速いと思いますので、一気に Postfix と Dovecot の設定を行います。

例示のため、バーチャルメールボックスに使用するドメインを example.com、バーチャルメールボックスに追加するメールアドレスを test@example.com として記述しています。実際の環境に合わせて読み替えてください。

バーチャルメールボックス管理ユーザーの作成

最初にバーチャルメールボックスを読み書きするための Unix ユーザーを作ります。(以下の例では vmail ユーザーを使います。)

$ groupadd -g 10000 vmail
$ useradd -u 10000 -g 10000 -d /var/spool/vmail -r -s /sbin/nologin vmail
$ mkdir /var/spool/vmail
$ chown vmail:vmail /var/spool/vmail
$ chmod 700 /var/spool/vmail

UID/GID は 10000 以外でも構いませんが、Postfix/Dovecot を設定する際に ID を指定する必要があるので UID/GID の番号を覚えておいてください。

SSL 自己証明書と秘密鍵の作成

Postfix/Dovecot ともに SSL を有効にするため、自己証明書と秘密鍵を作成します。(Dovecot に example.com の自己証明書と秘密鍵が付いてるのですが一応自サーバ用に作ります。)

/etc/pki/tls/certs ディレクトリの Makefile で秘密鍵を含む自己証明書を簡単に作れるのですが、後述する DER 形式ファイルを作成するため openssl コマンドを直接実行して作成します。

コマンドを実行すると証明書のパラメータを質問されますが、Common Name に VPS サーバのサーバ名(以下の例では www9999u.sakura.ne.jp)を入力し、それ以外の項目はデフォルトで構いません(ちゃんと入力しても良いですけど)。

$ cd /etc/pki/tls/certs
$ openssl req -new -x509 -nodes -days 365 -out mail.crt -keyout mail.key
Generating a 1024 bit RSA private key
....++++++
.......................................................++++++
writing new private key to 'mail.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:
State or Province Name (full name) [Berkshire]:
Locality Name (eg, city) [Newbury]:
Organization Name (eg, company) [My Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www9999u.sakura.ne.jp
Email Address []:
$chmod 600 mail.key

mail.crt が証明書ファイル、mail.key が秘密鍵ファイルです。証明書の有効期限は365日となっています。もっと長くしたい場合は -days オプションで増やしてください。

Outlook Express や Entourage、AppleMail などのクライアントを使っている場合、証明書をクライアントにインストールしないと警告が表示されるらしいので、インストール用の DER 形式の証明書を作成します。以下のコマンドで作成される mail.der をインストールしたら良いらしいです。(が、この辺は試してないのでうまくいかなかったら証明書のインポート – メール(Postfix) – 自宅サーバーの構築 – 自宅サーバーでやってみよう!!等を参考にしてください。)

$ openssl x509 -inform pem -in mail.crt -outform der -out mail.der

Dovecot の設定

Dovecot 側でパスワードを一元管理する関係上、こちらの設定を先に行います。Dovecot の設定ファイル /etc/dovecot.conf を編集し、アカウント管理用の /etc/dovecot-passwd ファイルを作成します。

まず Dovecot の設定ファイル /etc/dovecot.conf を編集します。ssl_cert_file と ssl_key_file は先ほど作った自己証明書と秘密鍵ファイルです。その他の設定は auth default セクション中に足します。

ssl_cert_file = /etc/pki/tls/certs/mail.crt
ssl_key_file = /etc/pki/tls/certs/mail.key

auth default {
  mechanisms = cram-md5 digest-md5 plain login
  passdb passwd-file {
    args = /etc/dovecot-passwd
  }
  socket listen {
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
  userdb static {
    args = uid=10000 gid=10000 home=/var/spool/vmail/%d/%n
  }
}

実際の dovecot.conf にはコメントが大量に入ってて修正箇所を探すのが面倒かもしれませんが、ssl_cert_file、ssl_key_file、mechanisms は元からありますので書き換え、その他は auth default セクションの最後の方に足してもらうのが速いと思います。

設定ファイルの詳細については Dovecot Wiki をご覧ください。


dovecot.conf の編集が終わったら /etc/dovecot-passwd ファイルを作成します。Dovecot をインストールした状態ではこのファイルは存在しませんので新規作成します。

test@example.com:{HMAC-MD5}dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3
test2@example.com:{HMAC-MD5}dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3

dovecot-passwd ファイルには、ユーザー名と暗号化されたパスワードを “:” で区切って記述します。「ユーザー名=メールアドレス」にした方がメールクライアントの設定が楽なのでそうしてますが、ユーザー名部分はメールアドレスでないとダメって訳ではありません。

暗号化されたパスワードは dovecotpw コマンドで取得できますのでコピペします。

$ dovecotpw
Enter new password:
Retype new password:
{HMAC-MD5}dcbe8064d829ee98ad16817611150a6c7ee5fe1c9dfd79f5395be892f162bfd3

dovecot-passwd ファイルにはユーザーIDやホームディレクトリなど passwd ファイルと似たような項目を指定することもできるのですが、Postfix と連携するだけなら userdb static で指定した方が速いと思いますので省略します。詳しくは AuthDatabase/PasswdFile – Dovecot Wiki をご覧ください。


設定が終わったら dovecot サーバを起動します。ついでに chkconfig でサーバリブート時に dovecot が起動するように設定しておきます。

$ /etc/init.d/dovecot start
$ chkconfig dovecot on

Postfix の設定

Postfix の設定では、Postfix 全体の設定ファイル /etc/postfix/main.cf とサブプロセス別の設定ファイル /etc/postfix/master.cf を編集し、バーチャルメールボックス管理用ファイル /etc/postfix/vmailbox を作成します。

まず /etc/postfix/main.cf を修正します。

inet_interfaces = all

# SASL
#smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
#broken_sasl_auth_clients = yes

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous

# TLS
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/pki/tls/certs/mail.key
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.csr

# Virtual
virtual_mailbox_domains = example.com
virtual_mailbox_base = /var/spool/vmail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_alias_maps = hash:/etc/postfix/virtual

inet_interfaces は main.cf に元から設定が存在するので書き換えてください。他の項目は存在しないと思いますので、適当な場所に追加してください。

#smtpd_sasl_auth_enable = yes の行はコメントアウトしたままにしておいてください。後ほど master.cf を編集する際に、サブミッションポートからの接続時のみ smtpd_sasl_auth_enable = yes になるように設定します。設定ファイルを見たとき分かりにくいと思いますので、あえてコメントアウトで残しておいてもらった方が良いと思います。(まあコメントアウトせずに何も書かなくても結構ですけど。)

古い Outlook を使っている場合は、broken_sasl_auth_clients = yes を有効にする必要があります。SMTP AUTH に関するバグがあるそうです。うちでは Outlook は使ってないのでコメントアウトしてます。

バーチャルメールボックスのメールアドレスに使用するドメインは virtual_mailbox_domains に指定します。上の例では example.com になっていますので、実際に使用するドメインを記述してください。カンマ区切りで複数指定することもできます。

virtual_mailbox_domains に指定するドメインは mydestination と重複しないようにしてください。デフォルトで mydestination は $myhostname, localhost.$mydomain, localhost になっており、さくら VPS の場合 myhostname は www9999u.sakura.ne.jp とかになります。

myhostname を example.com にして mydestination を空にすることもできますが、cron 等システム内部からのメールはバーチャルメールボックスではなくローカル配送にした方が良いと思いますので、mydestination や myhostname はデフォルトのままの方が良いと思います。それとメールサーバの DNS の逆引き設定を行っていないと受信を拒否するサーバもあり、sakura.ne.jp のホストは逆引き可能ですので、その辺のトラブルを避けるためにもこの設定の方が楽だと思います。まあこの辺に色々うんちくのある方はご自由にどうぞ、っつーかそういう人はこんなブログ見ながら設定してはいけませんw

virtual_mailbox_base を別の場所に変えてもオッケーですが、あらかじめディレクトリが存在している必要があり、virtual_uid_maps で指定されるユーザーから制御可能である必要があります。この辺の設定は先ほど vmail ユーザーを作った際に行っていますが、変更する際は Postfix の要求を満たすよう適宜設定を行ってください。

smtpd_tls_key_file と smtpd_tls_cert_file には先ほど作った自己証明書と秘密鍵ファイルを指定します。


main.cf の設定が終わったら /etc/postfix/master.cf を編集します。

以下の submission ポートの設定がコメントアウトされてると思いますので、有効にします。

submission inet n       -       n       -       -       smtpd
  -o smtpd_enforce_tls=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination

最後に /etc/postfix/vmailbox を編集して Postfix の設定は終わりです。Postfix をインストールした状態ではこのファイルは存在しませんので新規作成します。

test@example.com        example.com/test/Maildir/
test2@example.com       example.com/test2/Maildir/

vmailbox ファイルにはバーチャルメールボックスのメールアドレスとメールボックスのパスを空白(タブ)区切りで記述していきます。

メールボックスのパスは virtual_mailbox_base からの相対パスを指定します。上の例ですと、test@example.com 宛てのメールは /var/spool/vmail/example.com/test/Maildir/ に Maildir 形式で保存されます。

Postfix はメールボックスのパスの末尾を / で終えると Maildir 形式、/ 無しで終えると mbox 形式で保存します。何言ってるか分からない人はとりあえず Maildir 形式でえーと思います。

編集が終わったら postmap コマンドでデータベースに変換します。これを実行しないと Postfix が起動しません。virtual ファイルは転送設定用のファイルで、こちらもデータベースが必要ですので一緒に postmap します。

$ postmap /etc/postfix/vmailbox
$ postmap /etc/postfix/virtual

設定が終わったら postfix をリブートします。

$ /etc/init.d/postfix reload

DNS

メールサーバを運用する際は、DNS に MX レコードを用意しておいた方が良いです。

A レコードだけでも運用できますが、DNS の二度引きが発生したりするので、バーチャルメールアドレスでの送受信に使用する MX レコードを作成します。

ドメインの登録を Value Domain で行っている場合は、以下のように設定してください。ドメインが example.com、サーバの IP アドレスが 192.0.2.1、メール送信用のホストが mail.example.com、の場合の設定例です。mail.example.com ではなく example.com を MX に指定しても良いのですが、メールサーバだけ移転とかする際にこの方が楽なので別ホスト扱いにしておいた方が良いと思います。

a @ 192.0.2.1
a mail 192.0.2.1
mx mail.example.com. 10

なお、新規にメールサーバを立てる(誰にもメールアドレスを教えていない状態の)場合は、メールサーバの設定より先に DNS の設定を行っておいても構いません。

クライアントからの送信

以上でメールサーバの設定は完了です。あとはクライアントの設定をして終わりです。

クライアントの設定ですが、以下のような感じになります。(メールサーバを mail.example.com、メールアドレスを test@example.com にした場合。)

SMTP
ホスト mail.example.com
ポート 587
SMTP AUTH ユーザー test@example.com
SMTP AUTH パスワード dovecot-passwd のパスワード
その他 STARTLS を使用して SSL を有効にする必要あり
POP3
ホスト mail.example.com
ポート 110 (POP3S を使用する場合は 995)
ユーザー test@example.com
パスワード dovecot-passwd のパスワード
IMAP
ホスト mail.example.com
ポート 143 (IMAPS を使用する場合は 993)
ユーザー test@example.com
パスワード dovecot-passwd のパスワード

クライアント別の設定例はちょっと書ききれませんので、サブミッション・ポートを利用してメールを送信する - @ITメールの送受信でSSLを利用して暗号化する- @IT を参考にお試しください。

実運用に際して

ほったらかしの運用だとじきにクラックされる可能性もありますので、実際に運用する際はログ監視ぐらいは最低限行っておいた方が良いと思います。

今日のネタはメールサーバの設定っつーことですのでログ監視ツールの使い方は説明しませんが、swatch とか使ったら良いと思います。

んでわ


Viewing all articles
Browse latest Browse all 21

Latest Images

Trending Articles





Latest Images