AmazonLinux で メールサーバーを作る(その3)

今回は Postfix を設定し、virtualhost としてメールを受信するようにします。


・Postfix の設定
Postifx自身は既に yum でインストール済みなので、その設定ファイルを確認します。
/etc/postfix/main.cf ですね…。

Postfix が待ち受けするIPアドレス、あるいは名前を決定する必要があるのですが…。
以下のような理由で、
  • DynamicDNSを使用しており、今後 DDNSサービスを乗り換えるかもしれない(のでドメインを固定したくない)
  • virtualdomain に対応させるつもりなので、複数ドメインに対応させたい(かもしれない)
  • EIPを付け替える可能性があるので、IPアドレスでの指定は困難
…というわけで、IPアドレスや名前を特定せず、/etc/postfix/main.cf には以下のように設定します。
inet_protocols = all
※ここでIPアドレス(あるいは名前を指定しておかないと、指定されていないIPアドレスでPostfixが待ち受けしなくなります。外部から接続できなくなったりして、とても困るので忘れないように設定してください。

※mydestination に virtualdomain である「~.no-ip.biz」を追記しておく必要がある…のかと思いましたが、特に記述しておかなくても virtualdomain 宛のメイルが受信できるようですね。後述する virtual ファイルの設定を見て、受け入れ可能ドメインを決定しているのかと思われます。


他には……メールを受信するハズのLinuxアカウント側で .forward ファイルによる maildir とコマンド制御が使いたいので、以下のように/etc/postfix/main.cf へ追記します。
#allow_mail_to...
allow_mail_to_commands = alias,forward,include
allow_mail_to_files = alias,forward,include

ついでに、セキュリティ設定として、SMTPのVRFYコマンド等を禁止しておきます。
#for security
disable_vrfy_command = yes
これで、VRFY コマンドによる「指定されたメールアドレス(の受信者)が存在するか」という問い合わせが出来なくなります。



・virtualhost の設定
PHPプログラムで作成したいのはMLサービスで、任意のアカウントをPHP側で利用したいらしいです。
つまり、今回のEC2インスタンス割り当てられる ~.no-ip.biz というドメイン宛のメールは、特定のLinuxアカウント上で用意されるPHPプログラムで受信したいということになります。

postfix の virtualhost 設定を利用して、*@~.no-ip.biz 宛のメールを すべて 1つのlinux アカウント(今回は dev-user)に配送するように設定します。
/etc/postfix/main.cf の末尾あたりに、以下のように追記します。
#virtualdomians
virtual_maps = hash:/etc/postfix/virtual
追記出来たら、次に /etc/postfix/virtual というファイルを作成し、以下のような記述を追加します。
~.no-ip.biz          sub-domain
@~.no-ip.biz dev-user
一行目で ~.no-ip.biz が virtualdomain として扱われることを宣言し、二行目で ~.no-ip.biz ドメイン宛のすべてのメールを dev-user (linuxアカウント)に配送することを指定します。ファイルを作成したら、postmapコマンドを利用して virtualdomain 設定を postfix が読める形式に変換しておきます。
sudo postmap virtual
これを忘れると Postfix がSMTPで操作できなくなって意味不明になるので注意してください。

postmap を実行したら、Postfix を restart するか reload  しておきます。
$ sudo service postfix reload
Reloading postfix: [ OK ]


・セキュリティの確認
念の為、代表的なセキュリティ問題である「オープンリレイ」状態になっていないかどうか確認しておきます。
実験は、EC2インスタンスではなく、外部のサーバから実施してください。
outerPC$ telnet ~.no-ip.biz 25
Trying **.**.**.**...
Connected to ~.no-ip.biz.
Escape character is '^]'.
220 ip-**-**-**-**.localdomain ESMTP Postfix
HELO localhost.localdomain
250 ip-**-**-**-**.localdomain
RCPT TO: abc@example.com
503 5.5.1 Error: need MAIL command
MAIL FROM: abc@example.com
250 2.1.0 Ok
RCPT TO: abc@example.com
554 5.7.1 <abc@example.com>: Relay access denied

VRFY abc@example.com
502 5.5.1 VRFY command is disabled
少なくともオープンリレイ状態にはなっておらず、VRFYコマンドも拒否されているので、OKと言うことにしておきます。



・受信側の設定
..forward ファイルを用意して、すべてのメールを maildir 形式で保存するようにします。
ex2-user$ sudo su - dev-user

dev-user$ mkdir ~/maildir
dev-user$ cd =/maildir
dev-user$ mkdir new cur tmp
dev-user$ chmod -R u=rwx,og= .

dev-user$ cd ~/
dev-user$ echo '~/maildir/' > .forward
dev-user$ chmod og= .forward

dev-user$ exit
これで、dev-user 宛に送られたメイル(のすべて?)が maildir に保存されるようになります。


・実験
mail送信しようとしましたが…いつも使っているmailコマンドがインストールされてしません。
yum でインストールします。
sudo yum install mailx
パッケージ名末尾の x って何だろう…とか思いますが、あまり気にしないことにします。


インストールできたら、送信実験をします。
echo 'TEST!' | mail -s TEST-TITLE abcdefg@~.no-ip.biz
まず /var/log/maillog を確認してみます。
Aug  6 19:08:13 ip-10-150-161-211 postfix/pickup[1811]: 3A10C2099E: uid=0 from=<root>
Aug 6 19:08:13 ip-10-150-161-211 postfix/cleanup[1988]: 3A10C2099E: message-id=<20130806100813.3A10C2099E@ip-10-150-161-211.localdomain>
Aug 6 19:08:13 ip-10-150-161-211 postfix/qmgr[1812]: 3A10C2099E: from=<root@ip-10-150-161-211.localdomain>, size=486, nrcpt=1 (queue active)
Aug 6 19:08:13 ip-10-150-161-211 postfix/local[1990]: 3A10C2099E: to=<dev-user@ip-10-150-161-211.localdomain>, orig_to=<abcdefg@~.no-ip.biz>, relay=local, delay=0.07, delays=0.05/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Aug 6 19:08:13 ip-10-150-161-211 postfix/qmgr[1812]: 3A10C2099E: removed
キチンと配送されていますね。dev-user 側のmaildir ディレクトリも確認してみましょう。
dev-user$ cd maildir/new/
dev-user$ ls -la
total 16
drwx------ 2 dev-user dev-user 4096 Aug 6 19:08 .
drwx------ 5 dev-user dev-user 4096 Aug 6 18:55 ..
-rw------- 1 dev-user dev-user 622 Aug 6 19:08 1375783693.Vca01I2099dM273460.ip-10-150-161-211
こちらにもキチンとファイルが来ていることが分かります。

次に dev-user の ~/.forward を書き換えて プログラムに渡すようにしてみます。

dev-user$ cat .forward
| "cat - > /home/dev-user/mail.txt"
この状態で *@~.no-ip.biz にメールを送ると dev-user のホームディレクトリに mail.txt というファイルが作成され、そこにメールの中身が書き出されます。




Postfix の設定は以上で完了の予定。
必要であれば、もっとセキュリティをギチギチに固めてください。
どんなセキュリティ設定があるのか分かりませんが…。