3日に一度リセットして、各種ログ(主にPostfix)からipを拾ってpfに放り込むshell scriptを作っている。
これらを纏めたものが無かったので、今回纏めておく。
先ず初期化。
resetPF.sh と名付けた。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/sh PATH=/opt/local/sbin:/opt/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin URL="https://www.ipdeny.com/ipblocks/data/aggregated" TMP_FILE="/var/log/add_pf.tmp" LIST_DIR="/opt/local/var/log/pf/ipdeny_history" DATE=$(date +%Y%m%d) > "$TMP_FILE" # 1. ブロックしたい国名コード(スペース区切りで並べるだけ!) COUNTRIES="cn kp kr ru sg by ua ro bg vn id hk pf" # 2. ループを回して、一時ファイルに溜め込み for COUNTRY in $COUNTRIES; do curl -sSLf "${URL}/${COUNTRY}-aggregated.zone" |\ tee "$LIST_DIR/${COUNTRY}_${DATE}.zone" >> "$TMP_FILE" done # 3. 一回初期化し、一時ファイルから一気に流し込む if [ -s "$TMP_FILE" ]; then /sbin/pfctl -t murus.blacklist -T flush sort -u "$TMP_FILE" | /sbin/pfctl -t murus.blacklist -T add -f - else echo "エラー: IPリストの取得に失敗したか、ファイルが空です。pfの更新をスキップします。" >&2 exit 1 fi # 総数をログに書き出す /usr/local/sbin/dailyLog.sh # 古いログを削除する(15日以上経ったもの) find ${LIST_DIR}/ -type f -name "*.zone" -mtime +15 -delete |
次に毎日の追加分。
dailyPF.sh と名付けた。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#!/bin/sh # # dayliyPF.sh # TMP_FILE="/var/tmp/add_pf.tmp" > "$TMP_FILE" # 1. postfix.logからsubmissionに直接accessきた奴らをpfに登録して暫く弾く /usr/local/sbin/add_pf_unknown.sh >> "$TMP_FILE" # 2. postfix.logからauthentication failedを拾ってpfに登録する /usr/local/sbin/add_pf_authFailed.sh >> "$TMP_FILE" # 3. dovecotのinfo.logからdovecotにscanしてきた奴らをpfに登録して弾く /usr/local/sbin/add_pf_dovecot.sh >> "$TMP_FILE" # 4. postfix.logからDNSBL rankで弾く /usr/local/sbin/add_pf_DNSBLrank.sh >> "$TMP_FILE" # 5. postfix.logからPREGREETで弾く /usr/local/sbin/add_pf_pregreet.sh >> "$TMP_FILE" # 6. apache2のaccess_logからstatus code "400 224"を弾く /usr/local/sbin/add_pf_http.sh >> "$TMP_FILE" # 7. curl使ってくるような連中を排除する /usr/local/sbin/add_pf_curl.sh >> "$TMP_FILE" # last. 今回分をpfに書き込む sort -u "$TMP_FILE" | /sbin/pfctl -q -t murus.blacklist -T add -f - # 総数をログに書き出す /usr/local/sbin/dailyLog.sh |
dailyPF.shで各種呼ばれている単機能shell script群。
1. add_pf_unknown.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/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 - |
2. add_pf_authFailed.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/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 - |
3. add_pf_dovecot.sh
|
1 2 3 4 5 6 7 8 9 10 11 |
#!/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 - |
4. add_pf_DNSBLrank.sh
|
1 2 3 4 5 6 7 8 9 10 |
#!/bin/sh # # add_pf_DNSBLrank.sh # grep "DNSBL rank [3-9]" /opt/local/var/log/postfix/postfix_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 -q -t murus.blacklist -T add -f - |
5. add_pf_pregreet.sh
|
1 2 3 4 5 6 7 8 9 10 |
#!/bin/sh # # add_pf_pregreet.sh # grep "PREGREET" /opt/local/var/log/postfix/postfix_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 - |
6. add_pf_http.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/sh # # add_pf_http.sh # 意味不明な連中を排除する # grep "400 224 \"-\"" /opt/local/var/log/apache2/access_log /opt/local/var/log/apache2/niwakan-access_log | \ grep -v "192\.168\.0\.[0-9]{1,3}" | \ grep -v "127\.0\.0\.1" | \ grep -v "::1" | \ grep -v "49.96.23[2-9]\.[0-9]{1,3}" | \ grep -oE "\(([0-9]{1,3}\.){3}[0-9]{1,3}\)" | \ sed 's/[()]//g' | \ sort -u # | pfctl -t murus.blacklist -T add -f - |
7. add_pf_curl.sh
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/sh # # add_pf_curl.sh # curl使ってくるような連中を排除する # grep "200 .* curl" /opt/local/var/log/apache2/access_log /opt/local/var/log/apache2/niwakan-access_log | \ grep -v "192\.168\.0\.[0-9]{1,3}" | \ grep -v "127\.0\.0\.1" | \ grep -v "::1" | \ grep -v "49.96.23[2-9]\.[0-9]{1,3}" | \ grep -oE "\(([0-9]{1,3}\.){3}[0-9]{1,3}\)" | \ sed 's/[()]//g' | \ sort -u |
8. dailyLog.sh
|
1 2 3 4 5 |
#!/bin/sh # # murus.blacklistの登録件数をlogに書き出す # echo "$(date '+%Y/%m/%d %H:%M:%S') - Current blocklist count: $(/sbin/pfctl -t murus.blacklist -T show | wc -l)" >> /opt/local/var/log/pf/pf_update_history.log |
この他に、dailyPF.shのいくつかをコメントアウトしたhourlyPF.shもあるが、それ程重要じゃないだろう。
これらはcrontabで管理している。
|
1 2 3 4 |
#min hour day mounth weekday command 0 5 */3 * * /usr/local/sbin/resetPF.sh >/dev/null 2>&1 5 5 */1 * * /usr/local/sbin/dailyPF.sh >/dev/null 2>&1 30 */1 * * * /usr/local/sbin/hourly.sh >/dev/null 2>&1 |
以上です。

