Amazon Linux 2上のPostfixでローカルユーザにメール配送してみた

SMTPサーバの検証環境がほしく、独自ドメインを利用したSMTPサーバをPostfixで構築してみました。本エントリではSMTPリレーは行わず、Maildir形式でローカルユーザにメールを配送するまでをゴールにしています。
2020.03.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

環境/前提

  • Amazon Linux 2(ami-052652af12b58691f)
  • セキュリティグループInboundでSMTP(25番ポート)を開けています
  • 本文中に出てくるexample.jpは独自ドメインに読み替えてください

Route53設定

Route 53 にてexample.jpのHosted Zoneを作成します。AレコードのValueはSMTPサーバのEIP、MXレコードのValueは10 example.jp.を設定しました。

Postfix設定

サービス確認

Amazon Linux 2ではMTAがSendmailからPostfixに変更されており、デフォルトでサービスが起動されています。

$ sudo service postfix status
Redirecting to /bin/systemctl status postfix.service
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2020-03-16 09:04:14 UTC; 43min ago
  Process: 3105 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 3101 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 3097 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 3195 (master)
   CGroup: /system.slice/postfix.service
           ├─3195 /usr/libexec/postfix/master -w
           ├─3196 pickup -l -t unix -u
           └─3197 qmgr -l -t unix -u

 3月 16 09:04:13 ip-10-0-1-46 systemd[1]: Starting Postfix Mail Transport Agent...
 3月 16 09:04:14 ip-10-0-1-46 postfix/postfix-script[3193]: starting the Postfix mail system
 3月 16 09:04:14 ip-10-0-1-46 postfix/master[3195]: daemon started -- version 2.10.1, configuration /etc/postfix
 3月 16 09:04:14 ip-10-0-1-46 systemd[1]: Started Postfix Mail Transport Agent.
$ systemctl is-enabled postfix
enabled
$ sudo alternatives --display mta
mta -ステータスは自動です。
リンクは現在 /usr/sbin/sendmail.postfix を指しています。
/usr/sbin/sendmail.postfix - 優先度 30
 スレーブ mta-mailq: /usr/bin/mailq.postfix
 スレーブ mta-newaliases: /usr/bin/newaliases.postfix
 スレーブ mta-pam: /etc/pam.d/smtp.postfix
 スレーブ mta-rmail: /usr/bin/rmail.postfix
 スレーブ mta-sendmail: /usr/lib/sendmail.postfix
 スレーブ mta-mailqman: /usr/share/man/man1/mailq.postfix.1.gz
 スレーブ mta-newaliasesman: /usr/share/man/man1/newaliases.postfix.1.gz
 スレーブ mta-sendmailman: /usr/share/man/man1/sendmail.postfix.1.gz
 スレーブ mta-aliasesman: /usr/share/man/man5/aliases.postfix.5.gz
現在の「最適」バージョンは /usr/sbin/sendmail.postfix です。

SMTP認証に必要なパッケージをインストールし起動ました。

$ sudo yum install cyrus-sasl
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd

(省略)

完了しました!
$ sudo service saslauthd start
Redirecting to /bin/systemctl start saslauthd.service
$ sudo chkconfig saslauthd on
情報:'systemctl enable saslauthd.service'へ転送しています。
Created symlink from /etc/systemd/system/multi-user.target.wants/saslauthd.service to /usr/lib/systemd/system/saslauthd.service.
$ systemctl is-enabled saslauthd
enabled

設定ファイル編集

Postfixの設定ファイル/etc/postfix/main.cfを更新します。設定項目は多数ありますが、ここでは変更した設定のみ記載しています。

myhostname

SMTPサーバーのホスト名をFQDNで指定します。

myhostname = test.example.jp

mydomain

SMTPサーバーのドメイン名を指定します。

mydomain = example.jp

myorigin

ローカルから配送されたメールの送信元アドレスに付加するドメイン名を指定します。$mydomainに設定することでexample.jpのメールだと認識させます。

myorigin = $mydomain

inet_interfaces

SMTPサーバで待ち受けるネットワークアドレスを指定します。allを指定することで外部のSMTPサーバとやり取りできるようになり、ローカル以外から配信されたメールも配信することが可能になります。

inet_interfaces = all

mydestination

このSMTPサーバーが受信(ローカルに配送)するドメインを指定します。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

mynetworks

信頼できるネットワークを設定します。指定したネットワークに属しているクラインアントからは認証なしでメール送信が可能になりますので、不正中継に利用されないよう信頼できるネットワークのみ設定します。ここでは、VPC全体を信頼するネットワークとして指定しています。

mynetworks = 10.0.0.0/16, 127.0.0.0/8

home_mailbox

メールの保存形式を指定します。Maildir/を指定することでMaildir形式となりメールごとにファイルが生成されます。メールは宛先ユーザのホームディレクトリ配下のMaildirディレクトリに保存されます。

home_mailbox = Maildir/

smtpd_banner

バナー情報(ソフトウェア名など)の出力を指定します。ここでは非表示にしています。

smtpd_banner = $myhostname ESMTP unknown

SMTPサーバ認証設定

mynetworks指定したネットワーク以外からのメール送信に対してはメール認証をかけます。 ここでは認証にsaslauthdを利用していますが、必要に応じ/etc/sasl2/smtpd.conf等を更新し認証方法を変更してください。

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

設定を更新したら書式のチェックを行います。書式にエラーがなければ何も表示されずプロンプトが表示されます。

$ sudo postfix check
$

現在の設定などpostconfで確認することができますので、意図した設定になっているのか確認します。

$ postconf

(省略)

設定反映

$ sudo service postfix restart
Redirecting to /bin/systemctl restart postfix.service
$ sudo service postfix status
Redirecting to /bin/systemctl status postfix.service
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2020-03-23 08:53:23 UTC; 4s ago

(省略)

ローカルユーザ作成

メールアドレスとして利用するためのユーザを作成します。この時点ではホームディレクトリ配下にファイルはありません。

$ sudo useradd test
$ sudo passwd test
$ sudo ls -lR /home/test/
/home/test/:
合計 0

動作確認

動作確認のためtest@example.comにメールを送信します。

ローカルユーザへのメール配送が成功すると宛先ユーザのホームディレクトリ(ここでは/home/test)配下にファイルが作成されます。

$ sudo ls -lR /home/test/
/home/test/:
合計 0
drwx------ 5 test test 39  3月 17 04:21 Maildir

/home/test/Maildir:
合計 0
drwx------ 2 test test  6  3月 17 04:21 cur
drwx------ 2 test test 89  3月 17 04:21 new
drwx------ 2 test test  6  3月 17 04:21 tmp

/home/test/Maildir/cur:
合計 0

/home/test/Maildir/new:
合計 4
-rw------- 1 test test 2297  3月 17 04:21 1584418910.Vca01I400085M853282.ip-10-0-1-16.ap-northeast-1.compute.internal

/home/test/Maildir/tmp:
合計 0

メール配送の確認できない場合は、送信元にメールが戻ってきていないか、/var/log/maillogを確認しましょう。

さいごに

今回は検証用で一時的に利用したかったため、上記のような設定としています。この環境だけではメールが届かなかったり、スパム扱いされる可能性が高いため、実際のシステムで利用する際は25ポートの解除申請や、SPFレコード等送信ドメイン認証等が必要になるかと思います。ドメイン認証等については以下記事に詳細がありますので、メールサーバを構築する際は一読いただければと思います。