こんにちは
また、Postfixの記事になります。
今回は SMTP認証を設定してみたので、それの備忘録です。
ちなみに、なぜこんなにPostfixの記事ばかり書いているかというと、これまでこのあたりの設定を何となくしか触ってこなかったので、ちゃんと手を動かして覚えたいと思ったからです。
なお、今回の構成は以前書いたこの記事と基本的には同じですが、メールリレーサーバーを1台追加し、メールの送信はリレーサーバーを経由するようにしています。
また、Dovecotを利用しないため、認証にはSASLを利用します。
▼SMTP認証について
リンク様のこの記事が大変参考なりますので、ご一読くださいませ
▼構成
※OSはすべて AlmaLinux9 です
サーバー1:メール送信側、IP:192.168.33.95、ドメイン名:mail01.mailtest.com
サーバー2:メール受信側、IP:192.168.33.96、ドメイン名:mailclient01.mailtest.com
サーバー3:メールリレー、IP:192.168.33.97、ドメイン名:mailrelay01.mailtest.com
ローカル環境でメールの送受信を可能にするため、各サーバーで下記のように /etc/hosts を設定しています
なお、見ていただいたらわかるように、サーバー1からサーバー2へは直接メールを配送することはできず、サーバー1からサーバー3へ一度リレーした後、サーバー3からサーバー2へメールを配送します
サーバー1
192.168.33.95 mail01.mailtest.com 192.168.33.97 mailrelay01.mailtest.com
サーバー2(受信サーバーなので、こちらはなくてもOKですが一応設定しています)
192.168.33.95 mail01.mailtest.com 192.168.33.96 mailclient01.mailtest.com 192.168.33.97 mailrelay01.mailtest.com
サーバー3
192.168.33.97 mailrelay01.mailtest.com 192.168.33.96 mailclient01.mailtest.com
▼メール送信経路
サーバー1のPostfixからメール送信
↓
サーバー1の /etc/hosts で名前解決
↓
サーバー3のPostfixでメールリレー
↓
サーバー3の /etc/hosts で名前解決
↓
サーバー2のPostfixでメール受信
▼手順
1. SASLパッケージのインストール(サーバー1, 3)
まずはSASLでSMTP認証を利用するためのパッケージをインストールします
dnf install cyrus-sasl cyrus-sasl-plain
→ Complete! がでればOKです
2. SMTP認証用ユーザーの作成(サーバー3)
最初に SMTPクライアントとサーバーの認証時の挙動について簡単に説明します
SMTP認証(SASL認証)では、SMTPクライアントからSMTPサーバーに対して認証ユーザーの情報を提示し、
SMTPサーバー側で自サーバー内のOSユーザーの情報を確認し、そこに提示された認証情報を保有しているユーザーが存在すれば、認証を通すようになっています
そのため、SMTPサーバーに存在している共通ユーザーを利用するなイメージとなり、SMTPクライアント内のどのユーザーがメールを送信しても、
SMTPサーバー側では事前に設定されている認証情報を保有しているユーザーでの認証となります
今回の場合だと、まずはサーバー3で認証情報を保有するOSユーザーを作成し、サーバー1でそのOSユーザー名とパスワードを記載した認証用ファイルを作成する必要があります
それでは、まずはサーバー3でOSユーザーを作成します
useradd {user}
passwd {user}
3. SMTP認証の設定(サーバー1)
サーバー1のmain.cfにてSMTP認証を設定していきます
今回は下記を設定します
vi /etc/postfix/main.cf
relayhost = [mailrelay01.mailtest.com]:25 smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_sasl_mechanism_filter = plain,login smtp_sasl_password_maps = hash:/etc/postfix/smtp_user
relayhost = [mailrelay01.mailtest.com]:25
→ 25番ポートでリレー先のドメインを指定しています
smtp_sasl_auth_enable = yes
→ SMTP認証を有効化します
smtp_sasl_security_options = noanonymous
→ 認証されていない匿名ログインは許可しないようにしています
smtp_sasl_mechanism_filter = plain,login
→ SASLで使うPostfix SMTPクライアント・リレーサーバ間でのSASL認証メカニズムを指定しています
smtp_sasl_password_maps = hash:/etc/postfix/smtp_user
→ SASL認証で利用するユーザー/パスワードファイルを指定しています
4. 認証情報ファイルの作成(サーバー1)
サーバー3で事前に作成したOSユーザー情報を記載します
なお、中身は平文で記載する必要があるので、ファイルの権限も併せて変更します
vi /etc/postfix/smtp_user
[mailrelay01.mailtest.com]:25 {user}:{password}
※ {user} と {password} は適宜変更してください、ユーザーとパスワードは事前にOS上で作成と設定をしてください
所有者のみ確認できるように権限を変更します
chmod 600 /etc/postfix/smtp_user
postmapコマンドでファイルを変換します
postmap /etc/postfix/smtp_user
→下記のように変換されていればOKです(Postfixのバージョンによってはファイルの拡張子が変わるみたいです)
ls -la /etc/postfix/ | grep smtp -rw-rw----. 1 root root 46 Mar 15 08:49 smtp_user -rw-r-----. 1 root root 12288 Mar 15 08:51 smtp_user.db
5. SMTPDの設定(サーバー3)
今回はSMTP認証されいないユーザーからの送信は拒否したいので、サーバー3のPostfixでSMTP認証を要求するように設定します
vi /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes smtpd_sasl_path = smtpd smtpd_sasl_type = cyrus smtpd_sasl_security_options = noanonymous smtpd_relay_restrictions = permit_sasl_authenticated, defer_unauth_destination
smtpd_sasl_auth_enable = yes
→ SMTP認証を有効化します
smtpd_sasl_path = smtpd
→ Cyrus SASL の度の設定ファイルを読み込みにいくかを記載しています
通常は /etc/sasl2/smtpd.conf になります
smtpd_sasl_type = cyrus
→SASL認証で利用するタイプを設定しています(Dovecotの場合は、dovecot になります)
smtpd_sasl_security_options = noanonymous
→ 認証されていない匿名ログインは許可しないようにしています
smtpd_relay_restrictions = permit_sasl_authenticated, defer_unauth_destination
→ 認証されたユーザーに対してのみメールリレーを許可しています
また、念のため /etc/sasl2/smtpd.conf の中身が下記であることを確認します
# cat /etc/sasl2/smtpd.conf pwcheck_method: saslauthd mech_list: plain login
6. Postfixの再起動(サーバー1, 3)
もろもろの対応が完了したので、シンタックスチェックの後、Postfixを再起動します
postfix check
→ 何も出力されなければOKです
systemctl restart postfix
7. saslauthdの起動(サーバー1, 3)
systemctl start saslauthd
systemctl enable saslauthd
systemctl status saslauthd
→ 下記のように出力されれば起動完了です
# systemctl status saslauthd
● saslauthd.service - SASL authentication daemon.
Loaded: loaded (/usr/lib/systemd/system/saslauthd.service; disabled; preset: disabled)
Active: active (running) since Sun 2026-03-15 09:31:10 UTC; 23min ago
Process: 3573 ExecStart=/usr/sbin/saslauthd -m $SOCKETDIR -a $MECH $FLAGS (code=exited, status=0/SUCCESS)
Main PID: 3574 (saslauthd)
Tasks: 5 (limit: 24465)
Memory: 4.1M
CPU: 1.001s
CGroup: /system.slice/saslauthd.service
tq3574 /usr/sbin/saslauthd -m /run/saslauthd -a pam
tq3575 /usr/sbin/saslauthd -m /run/saslauthd -a pam
tq3576 /usr/sbin/saslauthd -m /run/saslauthd -a pam
tq3577 /usr/sbin/saslauthd -m /run/saslauthd -a pam
mq3578 /usr/sbin/saslauthd -m /run/saslauthd -a pam
8. メール送信テスト
それでは、サーバー1からサーバー2のドメインへメールを送信してみます
まずは、サーバー1で事前作成した user01 から、サーバー2のuser02に対して送信し、正常に送信が完了することを確認します
sendmail -t <<EOL From: user01@mail01.mailtest.com To: user02@mailclient01.mailtest.com Subject: test01 test01 . EOL
サーバー1 ログ
Mar 15 10:23:06 dockermail01 postfix/pickup[5612]: E15B52064E0E: uid=1001 from=<user01> Mar 15 10:23:07 dockermail01 postfix/cleanup[6062]: E15B52064E0E: message-id=<20260315102306.E15B52064E0E@mail01.mailtest.com> Mar 15 10:23:07 dockermail01 postfix/qmgr[5369]: E15B52064E0E: from=<user01@mailtest.com>, size=326, nrcpt=1 (queue active) Mar 15 10:23:07 dockermail01 postfix/smtp[6064]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.5.0 may not be compatible with OpenSSL 3.2.0 Mar 15 10:23:07 dockermail01 postfix/smtp[6064]: E15B52064E0E: to=<user02@mailclient01.mailtest.com>, relay=mailrelay01.mailtest.com[192.168.33.97]:25, delay=0.91, delays=0.19/0.11/0.44/0.17, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as A8EF19ADC6) Mar 15 10:23:07 dockermail01 postfix/qmgr[5369]: E15B52064E0E: removed
サーバー3 ログ
Mar 15 10:23:07 mailrelay01 postfix/smtpd[4305]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.0.0 may not be compatible with OpenSSL 3.2.0 Mar 15 10:23:07 mailrelay01 postfix/smtpd[4305]: connect from unknown[192.168.33.95] Mar 15 10:23:07 mailrelay01 postfix/smtpd[4305]: A8EF19ADC6: client=unknown[192.168.33.95], sasl_method=LOGIN, sasl_username=user01 Mar 15 10:23:07 mailrelay01 postfix/cleanup[4312]: A8EF19ADC6: message-id=<20260315102306.E15B52064E0E@mail01.mailtest.com> Mar 15 10:23:07 mailrelay01 postfix/qmgr[4283]: A8EF19ADC6: from=<user01@mailtest.com>, size=535, nrcpt=1 (queue active) Mar 15 10:23:07 mailrelay01 postfix/smtpd[4305]: disconnect from unknown[192.168.33.95] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8 Mar 15 10:23:07 mailrelay01 postfix/smtp[4313]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.0.0 may not be compatible with OpenSSL 3.2.0 Mar 15 10:23:18 mailrelay01 postfix/smtp[4313]: A8EF19ADC6: to=<user02@mailclient01.mailtest.com>, relay=mailclient01.mailtest.com[192.168.33.96]:25, delay=11, delays=0.09/0.23/10/0.2, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 8C0953E5BD) Mar 15 10:23:18 mailrelay01 postfix/qmgr[4283]: A8EF19ADC6: removed
→ SASL認証を利用してメールをリレーしています
サーバー2 ログ
Mar 15 10:23:18 mailclient01 postfix/smtpd[4385]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 3.5.0 may not be compatible with OpenSSL 3.2.0 Mar 15 10:23:18 mailclient01 postfix/smtpd[4385]: connect from mailrelay01.mailtest.com[192.168.33.97] Mar 15 10:23:18 mailclient01 postfix/smtpd[4385]: 8C0953E5BD: client=mailrelay01.mailtest.com[192.168.33.97] Mar 15 10:23:18 mailclient01 postfix/cleanup[4388]: 8C0953E5BD: message-id=<20260315102306.E15B52064E0E@mail01.mailtest.com> Mar 15 10:23:18 mailclient01 postfix/smtpd[4385]: disconnect from mailrelay01.mailtest.com[192.168.33.97] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7 Mar 15 10:23:18 mailclient01 postfix/qmgr[4294]: 8C0953E5BD: from=<user01@mailtest.com>, size=766, nrcpt=1 (queue active) Mar 15 10:23:18 mailclient01 postfix/local[4389]: 8C0953E5BD: to=<user02@mailclient01.mailtest.com>, relay=local, delay=0.21, delays=0.12/0.07/0/0.02, dsn=2.0.0, status=sent (delivered to maildir) Mar 15 10:23:18 mailclient01 postfix/qmgr[4294]: 8C0953E5BD: removed
→ 問題なく受信してそうです
送信が成功することを確認したので、次は サーバー1の /etc/postfix/smtp_user に記載のパスワードを変更します
そうすることで、サーバー3のOSユーザーに設定されているパスワードとサーバー1のsmtp_userに記載されているパスワードが異なることになるので、認証に失敗します
※メール送信コマンドは同じです
サーバー1 ログ
Mar 15 10:39:14 dockermail01 postfix/pickup[6151]: 21A222064E0F: uid=1001 from=<user01> Mar 15 10:39:14 dockermail01 postfix/cleanup[6207]: 21A222064E0F: message-id=<20260315103914.21A222064E0F@mail01.mailtest.com> Mar 15 10:39:14 dockermail01 postfix/qmgr[5369]: 21A222064E0F: from=<user01@mailtest.com>, size=326, nrcpt=1 (queue active) Mar 15 10:39:16 dockermail01 postfix/smtp[6170]: 21A222064E0F: to=<user02@mailclient01.mailtest.com>, relay=mailrelay01.mailtest.com[192.168.33.97]:25, delay=2.4, delays=0.11/0.02/2.3/0, dsn=4.7.8, status=deferred (SASL authentication failed; server mailrelay01.mailtest.com[192.168.33.97] said: 535 5.7.8 Error: authentication failed: authentication failure)
→ authentication failed になっており、認証に失敗しています
サーバー3 ログ
Mar 15 10:39:14 mailrelay01 postfix/smtpd[4322]: connect from unknown[192.168.33.95] Mar 15 10:39:16 mailrelay01 postfix/smtpd[4322]: warning: unknown[192.168.33.95]: SASL LOGIN authentication failed: authentication failure, sasl_username=user01 Mar 15 10:39:16 mailrelay01 postfix/smtpd[4322]: disconnect from unknown[192.168.33.95] ehlo=2 starttls=1 auth=0/1 quit=1 commands=4/5
→ SASL LOGIN authentication failed になっており、メールを送信していません
■まとめ
いかがでしたでしょうか?
正直 TLS通信に比べてかなり難しかった印象です。
特に、最初はSMTPクライアントからSMTPサーバーへの認証の流れがうまく理解できておらず、どこでどのように認証しているのか全く分かりませんでした。
ただ、その後 ユーザーのパスワードを変更したりして失敗しながら進んだことでかなり理解度が上がったような気がします。
Postfixはまだまだ細かい設定があるので、今度はそのあたりを深ぼっていきたいです。