目次

PostfixでSMTP-AUTHを利用する

2016/07/10
FreeBSD 10.2 から 10.3へのOSアップグレードの際にmail/postfixをPortsから再コンパイルしたところ、SASL関係でエラーが発生、SMTP-AUTHが使えずメール送信ができなくなりました。
mail/postfix-sasl で入れ替えしたところ使えるようになりました。

2012/05/05
SMTP-AUTHの設定について調べたところ、二つのシチュエーションがごちゃごちゃ入り混じっているので自分なりに整理した。
ちょっと勘違いしていて、ちょっと嵌った。smtpd_sasl_xxx と smtp_sasl_xxx で(a)(b)の振る舞いが個別指定できる事がわかったけどちょっと紛らわしい…

どのシチュエーションの話か明確にする

SMTP-AUTHを使う事シチュエーションは二つ。

シチュエーション説明

(a)は許可されたユーザ・プログラムだけにPostfixからのメール送信を許可するのが主目的となる。

(b)はISPの指定するSMTPサーバがSMTP-AUTH対応を必須としている場合に必要となる。

Postfixで(a)のシチュエーションに対しては smtpd_sasl_xxxの名前、(b)のシチュエーションに対しては smtp_sasl_xxxの名前でそれぞれパラメタがありこれでSMTP-AUTHの指定を行う事になる。

セットアップ

Postfixのセットアップに際して、SASL2を有効にしておく。 Cyrus-SASL2 も導入しておく。

main.cf に記述する、smtp_sasl_xxxx と smtpd_sasl_xxxx を間違えないように。

(a)クライアントがPostfix接続時にSMTP-AUTHを使用

FreeBSD9.0の場合、/usr/local/lib/sasl2/postfixsmtpd.conf を以下の内容で作成しておく。

postfixsmtpd.conf
pwcheck_method:  auxprop
auxprop_plugin: sasldb
mech_list: cram-md5 digest-md5 plain login

アカウント追加は以下のコマンドで実施。

# saslpasswd2 -c -u smtp.hogehoge.co.jp user001

-u オプションで指定するホスト名は、main.cfに記述した myhostname のホスト名になる。これで user001 の登録が行われる事になる。
アカウントを削除するときは -c オプションの変わりに -d オプションを指定する。

main.cfに以下を追加変更する。

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path = postfixsmtpd
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_auth_destination, reject_unauth_destination
パラメタ 説明
smtpd_sasl_auth_enable yes で SMTP-AUTH が有効になる。
smtpd_sasl_security_options デフォルトでは noanonymous, noplaintext になる。問題ないならこの指定はコメントアウト。
平文パスワードを許す場合は noplaintext があってはまずいのでnoanonymousを指定する。
smtpd_sasl_path SASL2ライブラリで /usr/local/lib/sasl2/postfixsmtpd.conf の定義を使う旨の宣言。
smtpd_sasl_local_domain 認証時のレルムとして myhostname を使う。SASLのアカウントを登録する際の-uオプションで指定するものと同じ。
smtpd_recipient_restrictions接続時の制限を指定する。以下の順に検証が行われる。
permit_sasl_authenticated 認証に成功した場合のメール送信を許可する。元々期待している動作。
reject_unauth_destination このサーバで配送終了とならないドメイン宛メール送信を却下する。不正中継対応。
permit_auth_destination このサーバで配送終了となるドメイン宛メール送信を許可する。認証しない接続用。
特定のアドレスやクライアントからの接続を許したければ以下も追加。
permit_mynetworks 接続元が$mynetworksにリストアップされたネットワーク・ホストから来たものであれば許可。

(b)PostfixがISPのSMTP接続時にSMTP-AUTHを使用

main.cf に以下を追加修正する。

mydomain = hogehoge.co.jp
relayhost = [smtp.isp.co.jp]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = cdb:/usr/local/etc/postfix/relay_passwd
パラメタ 説明
mydomain このメールサーバのドメイン。リレー先によってはここの指定が実在する(インターネットで解決可能な)ドメインでなければならない。
relayhost リレーするサーバとそのポート。ブランケットで囲むとMXレコード確認を行わなくなる。
smtp_sasl_auth_enable yes で SMTP-AUTH が有効になる。
smtp_sasl_security_options デフォルトでは noanonymous, noplaintext になる。
平文パスワード指定のサーバの場合 noplaintext があると平文でパスワードを送れなくなる。
smtp_sasl_password_maps リレー先SMTPサーバでSMTP-AUTHが必要な場合、SMTPサーバと使用するアカウントのインデクスを指定する。

smtp_sasl_password_mapsにしているインデクスは以下のように作成する。

例えば/usr/local/etc/postfix/relay_passwd ファイルに

[smtp.isp.co.jp]:587   userid:password

の記述を行い、以下を実行することでCDB形式のインデクス /usr/local/etc/postfix/relay_passwd.cdb が作成される。

# postmap cdb:/usr/local/etc/postfix/relay_passwd

再起動

main.cfファイルやインデクスファイルを変更した後は以下を実行しておく。

/usr/local/etc/rc.d/postfix reload