見直しメモ。
環境
- FreeBSD 14.1
- Postfix 3.9.0
- Cyrus IMAPd 3.8.4
設定
ipfw
ポート587とポート993は、日本国内からのみアクセスを許可。不正ログイン試行は9割以上が海外からのアクセスなので、この設定だけでかなり静かになる。
「ipfwで国別アクセス制限」の手順に従い、/usr/local/etc/ipfw/country/
に国別テーブル作成用シェルスクリプトを作成しておく。
/etc/rc.conf
に次の行を追加。
firewall_allow_imap="JP"
firewall_allow_submission="JP"
/usr/local/etc/ipfw.rules
のsetup_ipv6_mandatory
の下あたりに、次のスクリプトを追加。
# 国別アクセス許可用テーブル作成
allow_per_country_table() {
country="$1"
port="$2"
for i in $country; do
country_table=/usr/local/etc/ipfw/country/$i.sh
if ! ${fwcmd} table $i info > /dev/null 2>&1; then
if [ -f $country_table ]; then
$country_table
fi
fi
${fwcmd} add allow tcp from "table($i)" to me $port
done
}
# Submissionのアクセス制限
if [ -n "${firewall_allow_submission}" ]; then
allow_per_country_table "${firewall_allow_submission}" "587"
fi
# IMAPSのアクセス制限
if [ -n "${firewall_allow_imap}" ]; then
allow_per_country_table "${firewall_allow_imap}" "993"
fi
アクセスできる国を増やしたい場合には、/etc/rc.conf
のfirewall_allow_imap
やfirewall_allow_submission
に国コードを追加すればよい。
Postfix
main.cf
スパム対策として、smtpd_client_restrictions
とsmtpd_helo_restrictions
を次のように指定する。
# スパム対策
unknown_local_recipient_reject_code = 550
unknown_client_reject_code = 550
smtpd_client_restrictions =
permit_mynetworks
check_client_a_access texthash:/usr/local/etc/postfix/client_whitelist
reject_unknown_client_hostname
reject_unknown_reverse_client_hostname
reject_unauth_pipelining
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks
check_helo_a_access texthash:/usr/local/etc/postfix/client_whitelist
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
ここでsmtpd_helo_restrictions
に指定したものだけで、スパムは9割以上拒否できる。
ただし、ホスト名を逆引きできないようなサーバーを運用している企業が、現在でもごく稀ながらも存在している。これは個別にホワイトリストを作成して対応するしかない。
/usr/local/etc/postfix/client_whitelist
には、次のように除外するIPアドレスまたはIPアドレス帯を記述しておく。
111.112.113.0/28 OK
上の例ではsmtpd_client_restrictions
とsmtpd_helo_restrictions
で使い回しているが、もちろん別々に用意してもかまわない。
master.cf
smtpとsubmissionの設定を、次のようにする。
smtp inet n - n - - smtpd
-o smtpd_sasl_auth_enable=no
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtpに-o smtpd_sasl_auth_enable=no
を指定しておけば、ポート25に不正ログイン試行が行われることがなくなる。
main.cfでsmtpd_sasl_auth_enable=noとし、master.cfのsubmissionのオプションとして-o smtpd_sasl_auth_enable=yes
を渡しても、同じ。
smtpにこのオプションを渡さずにmain.cf
でsmtpd_sasl_auth_enable=yes
とすると、たとえポート587を国内限定にしてあっても、ポート25へ不正ログイン試行し放題となる。
smtpd_sasl_auth_enable=no
としておけば、ログイン試行に対して次のようにエラーを出す。
In: RSET
Out: 250 2.0.0 Ok
In: AUTH LOGIN
Out: 503 5.5.1 Error: authentication not enabled
In: QUIT
Out: 221 2.0.0 Bye