メール周りのセキュリティ

見直しメモ。

環境

  • 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.rulessetup_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.conffirewall_allow_imapfirewall_allow_submissionに国コードを追加すればよい。

Postfix

main.cf

スパム対策として、smtpd_client_restrictionssmtpd_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_restrictionssmtpd_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.cfsmtpd_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
タイトルとURLをコピーしました