WordPressサイトへのコメントスパム対策(firewalld)

CentOS7からファイアウォールサービスがiptablesからfirewalldになりましたが、Wordpress+Akismetで捕まえたコメントスパムの
発信元IPアドレスをfirewalldで弾くように、スクリプトを作成してみました。

OS:CentOS7
使用言語:bash + expect
CMS:Wordpress + Akismet
MariaDBサーバ:localhost
MariaDB接続ユーザ:root
MariaDB接続パスワード:password
Firewallゾーン:external
・cronで1時間に1回コメントスパムの有無をチェック(別途cronで設定する)
・毎日0時に2ヶ月前に設定した拒否ルールを削除

#!/bin/bash

export TERM=xterm

#MariaDBサーバ
DBHOST="localhost"
#MariaDB接続ユーザ
SQLUSER="root"
#MariaDB接続パスワード
SQLPSWD="password"
WPDBNAME="wordpress"
WPCHKTIME=`date -d '1 hours ago' "+%Y-%m-%d %H"`
CHKTIME=`date -d '1 hours ago' "+%Y%m%d"`
#削除する拒否ルールを設定した日
DELSTIME=`date -d '2 month ago' "+%Y%m%d"`
#Firewallゾーン
$FWZONE="external"
SPAMLOG="/tmp/check-spam_log"

SQLCMD="SELECT comment_author_IP
        FROM wp_comments
        WHERE comment_approved = 'spam'
        AND comment_date LIKE '$WPCHKTIME%'
        GROUP BY comment_author_IP;"

expect -c "
        log_file -noappend $SPAMLOG
        spawn mysql -u $SQLUSER -p -h $DBHOST $WPDBNAME
        expect password
        send \"$SQLPSWD\r\"
        expect MariaDB
        send \"$SQLCMD\r\"
        expect MariaDB
        send \"exit\r\"
        expect root
"

#### スパムIPアドレスの抽出 ####
IPADDR=`cat $SPAMLOG|cut -d " " -f2`
echo "$IPADDR"|grep "^[0-9]*\."
if [ $? -eq 0 ]
        then
                 IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
        else
                 IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
        fi

for ADDSPAM_IP in $IPADDR
        do
RICH_RULES="rule family=ipv4 source address=$ADDSPAM_IP port port=80 protocol=tcp log prefix=SPAM_$CHKTIME level=info drop"
firewall-cmd --add-rich-rule="$RICH_RULES" --zone=$FWZONE
firewall-cmd --add-rich-rule="$RICH_RULES" --zone=$FWZONE --permanent
done


#### 2か月前のスパムフィルタを削除 ####
if [ `date "+%k"` -eq "0" ]
then
        DELRULE=`firewall-cmd --list-all|grep SPAM_$DELSTIME|awk '{print $4}'`
        DELIP=`echo "$DELRULE"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
        DELIP=`echo "$DELRULE"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`

        for DELSPAM_IP in $DELIP
        do
        DRICH_RULES="rule family=ipv4 source address=$DELSPAM_IP port port=80 protocol=tcp log prefix=SPAM_$DELSTIME level=info drop"
        firewall-cmd --remove-rich-rule="$DRICH_RULES" --zone=$FWZONE
        firewall-cmd --remove-rich-rule="$DRICH_RULES" --zone=$FWZONE --permanent
        done
fi

exit 0