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