postfixのsmtp(port 25)への攻撃はだいぶ減ったけれど、それに対してsubmission(port 587)への攻撃が浮き上がってきた。
なのでこれへの対応を行うことにする。
先ずはログから。
|
1 2 3 |
Jul 02 16:17:38 mail postfix/smtpd[24906]: connect from unknown[128.1.49.46] Jul 02 16:17:38 mail postfix/smtpd[24906]: NOQUEUE: lost connection after EHLO from unknown[128.1.49.46] Jul 02 16:17:38 mail postfix/smtpd[24906]: disconnect from unknown[128.1.49.46] ehlo=1 auth=0/1 commands=1/2 |
たった3行だけれども、これはsmtp(port 25)を通さずにsubmissionを叩きにきているのよ。
postfix/smtpdがconnect from unknown[128.1.49.46]とねconnectされているのがその理由。
普通は25番の担当postscreenがこの(connect from)反応を示すのだわ。
それで、「直接submissionを叩きにきている(つまりはpostscreen回避)している奴がいるわ」と、気が付いた。
これだとmain.cfでいくらチェックを強化しても、「単にportが開いているかのチェックしているだけ」だからすぐに帰っちゃう。
だから、submission(smtpd)が返事しようとして「lost connection after EHLO」になる。
最初に向こうから「EHLO」が届いたけれど、それに応えようとしたら切れてたよ。ってこと。
それでも、きっちりと「disconnect from unknown[128.1.49.46]」と報告しているsmtpdは健気だね。
さて、これってサーチャーとかって言うのかな。
Geminiさんに聞いたら「ポートスキャナー」とか単に「スキャナー」とか言うそうだ。
意味的に似ているからサーチャーでも可かも知れない。
閑話休題。
これって、いくら邪魔でもpostfixの環境を弄っても排除できない。
そりゃそうだよね、門前で帰っちゃうだけだもの。
言ってみれば「門の前での覗き見野郎」ってことだわ。
そこでPacket Filter(PF)の出番です。
ようやくココまで来た。
こんなコードを組んでみた。
|
1 2 3 4 5 6 |
#!/bin/sh # # postfix.logからsubmissionに直接accessきた奴らをpfに登録して暫く弾く # 適応する時期は次のpfを更新するまでの1〜3日間 # grep "postfix/smtpd" /opt/local/var/log/postfix/postfix_log | grep "connect from" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u | pfctl -t murus.blacklist -T add -f - |
これはGeminiさんとの共同制作。
今回は私も参加した。(ホントだよ?
これだと、上のログ1行目に反応する。
見てわかる通り、最初のgrepでsmtpdを抽出、二番目でsubmissionを直接叩きに来た者を抽出、三番目は意味が判らないGeminiさん作のip抽出部分、四番目のsortが重複を削除。
そこまでしたところでpfctlに追加登録している。-Tで登録されてたものはスキップするのだそうだ。
実際2回繰り返しこのスクリプトを走らせたら、2回目は0件の登録でエラーにはならなかった。
これのコメントに「適応する時期は次のpfを更新するまでの1〜3日間」とある。
こっちも書いておこうと思う。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/sh cd /tmp # 1. ブロックしたい国名コード(スペース区切りで並べるだけ!) COUNTRIES="cn kp kr ru nl sg fr de lu lt" # 2. 初期化後、ループを回して、一撃で Murus(PF)へ流し込み! pfctl -t murus.blacklist -T flush for COUNTRY in $COUNTRIES; do curl -s "https://www.ipdeny.com/ipblocks/data/aggregated/${COUNTRY}-aggregated.zone" | pfctl -t murus.blacklist -T add -f - done # 3. postfix.logからsubmissionに直接accessきた奴らをpfに登録して暫く弾く /usr/local/sbin/add_pf.sh # 4. 今回書き込んだブロック数をログに書き出す echo "$(date) - Current blocklist count: $(sudo pfctl -t murus.blacklist -T show | wc -l)" >> /opt/local/var/log/pf/pf_update_history.log |
これもGeminiさん作。
私にはshell scriptなんぞ組めません。(^_^;;
これって、www.ipdeny.comに国別で登録してあるip rangeの一覧を引っ張ってきて、pfctlに渡しているだけ。
最初のflushでクリア、その後、追加更新って手順になっている。
これは中国嫌いって弾いたけれど、例えば「中国が手放して日本の所有になってもアクセス拒否のまま」であることを回避するためですね。
これをcrontabで3日おきに動かしているから。
|
1 2 |
#min hour day mounth weekday command 0 5 */3 * * /usr/local/sbin/resetIP.sh >/dev/null 2>&1 |
だから、今日登録しても消えちゃうよってこと。
だけど、resetIP.shの後ろにくっつけちゃったから、その後も弾き続けるようになった。
そう言う経緯がある。
何故一つに纏めなかったのか、それはログ見てウザイと思えばその場でadd_pf.sh叩けば良いのだ。その後出なくなる。
resetIP.sh >/dev/null 2>&1の理由は簡単。pfctlが無茶喋るから邪魔なんだわ。
実際、command lineでつけないで動かすと延々出てくる。
|
1 2 3 4 5 6 |
No ALTQ support in kernel ALTQ related functions disabled 956/956 addresses added. pfctl: Use of -f option, could result in flushing of rules present in the main ruleset added by the system at startup. See /etc/pf.conf for further details. |
こんなのが登録し国分だけ流れ続ける。
殆どが余計にお世話なワーニング。イヤだよねこんなの見るの。
で無くしている。
つまり、postfixのsubmissionに直接アタックしてくる無礼者は、PFで元から断つ。
ってやり方で強化したって訳。
今回はこの辺で。

