postfixを更に堅牢ににも書いたのだが、Packet Filterに送るタイミング等の調整が必要そうだ。
そこでタイミングの設定を変更することにした。
まずはcrontab。
|
1 2 3 4 |
#min hour day mounth weekday command 0 5 */3 * * /usr/local/sbin/resetPF.sh >/dev/null 2>&1 30 5 */1 * * /usr/local/sbin/dayliyPF.sh >/dev/null 2>&1 40 */1 * * * /usr/local/sbin/add_pf_unknown.sh >/dev/null 2>&1 |
こんな感じで3日に一度、resetPF.shが毎日dayliyPF.shが、1時間に一度add_pf_unknown.shが動く。
それぞれの内容を見てみよう。
resetPF.shは、一度blacklistをクリアして国別のデータを放り込んでいる。
出た自身はwww.ipdeny.comが公開しているもの。
これは国毎に使用するip rangeが結構変わるからだ。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/sh cd /tmp # 1. ブロックしたい国名コード(スペース区切りで並べるだけ!) COUNTRIES="cn kp kr ru nl sg fr 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 |
次にdayliyPF.shなんだが、これはログからipを抽出しpfに登録する。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/sh # # dayliyPF.sh # # 1. postfix.logからsubmissionに直接accessきた奴らをpfに登録して暫く弾く /usr/local/sbin/add_pf_unknown.sh # 2. postfix.logからauthentication failedを拾ってpfに登録する /usr/local/sbin/add_pf_authFailed.sh # 3. dovecotのinfo.logからdovecotにscanしてきた奴らをpfに登録して弾く /usr/local/sbin/add_pf_dovecot.sh # last. 今回書き込んだブロック数をログに書き出す echo "$(date) - Current blocklist count: $(sudo pfctl -t murus.blacklist -T show | wc -l)" >> /opt/local/var/log/pf/pf_update_history.log |
単純に3つのスクリプトを動かし、総数をログに書き出している。
この中で呼ばれているadd_pf_unknown.shは次のよう。
|
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 unknown" | grep -v "192\.168\.0\.[0-9]{1,3}" | grep -v "49.96.23[2-9]\.[0-9]{1,3}" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u | pfctl -t murus.blacklist -T add -f - |
ここで弾かれるipは”connect from unknown”とbotである。
一応、どのスクリプトでもlocal netwarkとdocomoの携帯電話使用部分(多分)は外している。
そして、add_pf_authFailed.shはsubmissionに直接やってくる、ピンポンダッシュ組。
|
1 2 3 4 5 6 7 |
#!/bin/sh # # add_pf_authFailed.sh # SASL LOGIN authentication failedを拾ってpfでブロックする # grep "postfix/smtpd" /opt/local/var/log/postfix/postfix_ 原稿これで少しlog | grep "SASL LOGIN authentication failed" | grep -v "192\.168\.0\.[0-9]{1,3}" | grep -v "49.96.23[2-9]\.[0-9]{1,3}" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u | pfctl -t murus.blacklist -T add -f - |
最後にdovecotの方にやってくるport scannerたちをadd_pf_dovecot.shで追い出す。
|
1 2 3 4 5 6 |
#!/bin/sh # # add_pf_dovecot.sh # dovecotのlogからscanしにくるやつを排除 # grep "failed" /opt/local/var/log/dovecot/info.log | grep -v "192\.168\.0\.[0-9]{1,3}" | grep -v "49.96.23[2-9]\.[0-9]{1,3}" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u | pfctl -t murus.blacklist -T add -f - |
“failed”だけなのは、他にひっかけようがないから。
この3つを1日毎に動かしていたのだが、unknownでpostscreenに弾かれてつ奴らが多過ぎて、肝心なログが読み辛くて仕方がなくなった。
30分で13件追加ってなるんじゃ、ゆっくりログを鑑賞できないもの。
ってことで現在1時間に一度動かすようにした。
原稿これで調子を見てみることにしよう。

