【Postfix】PostfixでSMTP認証を設定してみる

こんにちは

また、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はまだまだ細かい設定があるので、今度はそのあたりを深ぼっていきたいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA