PostfixでMTA間のSMTP認証をしてみた
2024年08月20日 火曜日
CONTENTS
はじめに
はじめまして。IIJにてメールサービスの運用をしている芹澤です。
開発のYASがSendmailでのMTA間SMTP認証を試してみたとのことで、自分はPostfixを用いたMTA間のSMTP認証を試してみたいと思います。
SMTP認証とはSMTPの拡張であり、MTAに接続したユーザが正規なものであることを認証するだけでなく、MTAに接続したMTAが正規なものであることを認証するためにも用いられています。イメージとしては下図のとおりです。個人で建てたメールサーバからプロバイダのメールサーバを経由してメールを送信する際に、プロバイダのメールサーバに対してSMTP認証を行うことで、正しいMTAであることを証明することができます。
PostfixはSendmailの後発として開発されたMTAであり、Sendmailと比較して設定ファイルの記述が簡単であるため、利用しているユーザも多いのではないでしょうか。
以下、RockyLinux8、Ubuntu22.04.4、openSUSE15.6を用いて検証した結果となります。なお、PostfixがMTAとして動いており、オープンリレー対策等の基本的設定が済んでいる環境に、新たにSMTP認証の設定を追加することを想定しています。
PostfixでのSMTP認証設定
-
- 必要なパッケージのインストール
SMTP認証を行うために必要なパッケージをインストールします。
Postfixが動いているサーバのターミナルで、以下のコマンドを叩きます。
- 必要なパッケージのインストール
RockyLinuxの場合
$ su - # dnf update # dnf install cyrus-sasl cyrus-sasl-plain
Ubuntuの場合
$ su - # apt update # spt install libsasl2-2 libsasl2-modules
openSUSEの場合
$ su - # zypper update # zypper install cyrus-sasl cyrus-sasl-plain
- 認証情報を記載したファイルの作成
Postfixの設定ファイルがあるディレクトリ(/etc/postfix/)に、認証情報を記載したファイルを作成します。このファイルにはSMTP認証に必要なID、パスワードが平文で記載します。そのため、他のユーザに見られたり、編集されたりしないよう、適切な権限を設定する必要があります。以下のように空のファイルを作り、rootユーザのみ読み書きができるような権限設定を行ってから編集に入ります。# cd /etc/postfix # touch authinfo # chmod 600 authinfo # vi authinfo
以下の内容は、SMTP認証に対応した接続先サーバのドメインがrelay.example.jp、接続先ポートが25番、SMTP認証のIDがid-smtpauth、パスワードがpassword-smtpauthの場合の例です。
環境に合わせて変更してください。authinfoの内容
[relay.example.jp]:25 id-smtpauth:password-smtpauth
上記の内容を記載して保存した後、Postfixが読める形式にするためにpostmapコマンドを用いてファイルを変換します。
# postmap authinfo
postmapコマンドを実行すると、Postfixのバージョンによってauthinfo.db もしくは authinfo.lmdb というファイルが作成されます。このファイルの拡張子を覚えておきましょう。
- main.cf の編集
Postfixの設定ファイルであるmain.cfを編集します。# vi main.cf
そして、以下の内容を追記します。今回の例もSMTP認証に対応した接続先サーバのドメインがrelay.example.jp、接続先ポートが25番のときのものです。環境に合わせて変更してください。
relayhost = [relay.example.jp]:25 smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous
また、postmapコマンドで作成されたファイルの拡張子によって、以下を追記します。
authinfo.db ファイルであった場合
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
authinfo.lmdbファイルであった場合
smtp_sasl_password_maps = lmdb:/etc/postfix/authinfo
- Postfixの再起動
main.cfを保存したら、準備は完了です。以下のコマンドを叩いてPostfixの設定を反映させます。これで、Postfixから外部のSMTP認証対応サーバを利用してメールを送ることができるようになります。# systemctl reload postfix
SMTP認証対応サーバへの接続を確認したいときは
これまでの手順で、Postfixを介してMTAへの認証ができるようになりました。しかし、うまく動かないこともあるかもしれません。
そのような際に問題切り分け手順として、以下のスクリプトを実行することでPostfixを介さずに接続先MTAサーバへの認証とメール送信を試すことが出来ます。
Postfixを介さずにSMTP認証とメール送信ができればPostfixの設定の問題、できなければサーバの設定の問題の可能性が高いです。
以下のスクリプトをtest_smtpauth.shとして任意の場所に保存します。1~6行目は例となります。環境にあわせて変更してください。
USER="id-smtpauth" # SMTP認証のID PASS="password-smtpauth" # SMTP認証のパスワード MYDOMAIN="mydomain.example.jp" # テストメールの送信元サーバドメイン FROM="mailfrom@example.jp" # テストメールの送信元メールアドレス RCPT="mailrcpt@example.jp" # テストメールの送信先メールアドレス RELAY="relay.example.jp" # テストメールの送信先サーバドメイン AUTH="`echo -ne "${USER}\x00${USER}\x00${PASS}"|base64 -w 0`" ( echo -en "EHLO ${MYDOMAIN}\r\n" sleep 1 echo -en "AUTH PLAIN ${AUTH}\r\n" sleep 1 echo -en "MAIL FROM:<${FROM}>\r\n" sleep 1 echo -en "RCPT TO:<${RCPT}>\r\n" sleep 1 echo -en "DATA\r\n" echo -en "From: <${FROM}>\r\n" echo -en "To: <${RCPT}>\r\n" echo -en "\r\n" echo -en "smtp-auth test\r\n" echo -en ".\r\n" sleep 1 echo -en "QUIT\r\n" ) | nc ${RELAY} 25
その後、以下のように実行することでPostfixを介さないメール送信を試すことができます。
$ bash test_smtpauth.sh
実行後、テストメールの送信先メールアドレスにて受信メールの確認を行い、本文に「smtp-auth test」と書かれたメールが届いていれば、Postfixを介さない認証とメール送信が出来ていることがわかります。また、本テスト手順ではパスワードを平文で送っているため、テスト実行後の本番環境では別のID、パスワードに変更することをおすすめします。もしIDやパスワードを用意に変えられない場合、OpenSSLを利用するなど、経路暗号化を行った状態でテストすることをおすすめします。
また、環境によっては接続先のメールサーバで25番ポートがブロックされている(OP25B)ことがあります。その場合は、記事内の設定例(25番ポート)からSubmissionポート(587番ポート)へ書き換えて試してみてください。
おわりに
メールサービスに携わり2年目な自分ですが、改めてPostfixの設定パラメータを学ぶ良い機会になりました。これからも日々学び、成長していきたいです。
また、記載の内容でうまく動作をしない場合、各ディストリビューションの商用サポートへ頼ってみてはいかがでしょうか。今回利用したディストリビューションについて、下記にまとめてありますので参考にしてください。
- RockyLinux
- Ubuntu
- Canonical社(https://jp.ubuntu.com/contact-us)
- openSUSE
- SUSE社(https://scc.suse.com/home)