WordPressのスパムを撲滅する
2017-12-01
- PC
WordPressに大量にスパムが届いていた。
WordPressの管理画面から一つ一つ処理してられないので、対策をしたメモ。
[2020-08-09追記: 以下ではnginxをいじっているが、WordPressプラグインのAkismetを使った方がはるかに効果があった。]
状況
特定IPアドレス XXX.XXX.XXX.0/24
(XXX.XXX.XXX.なんちゃら)から7000通以上のスパムが届いていた。
このアドレスを whois
で調べると海外で、この地域にはこのブログを読みたい人はいないだろう。すべてスパムと判断していい。
WordPressではAkismetというスパムフィルタがあり、自動的にスパムとしてマークしてくれるようだが、これはスパムと判断してくれなかった。
そのためWordPressから「現在○○通のコメントが承認待ちです」という旨のメールが度々送られ、精神衛生上悪い。
なのでまずスパムを削除し、その上でこのIPアドレスからはアクセスが来ないように設定する。
環境
- OS
CentOS 7.4 - ブログ
WordPress 4.9 - DB
MySQL 5.5 - Webサーバ
nginx 1.12
スパムの削除
MySQLで一括で削除する。
が、なんとなく怖いので、ゴミ箱行きに留める。
DB名は wp-config.php
で設定しているもの。
テーブル wp_comments
がコメントのテーブル。これを操作する。
(デフォルトの場合。接頭辞を変えている場合は 接頭辞 + _comments
がテーブル名。)
このテーブルのカラム comment_approved
はいまいちドキュメントが見つからないが、以下のようになっているようだ。
0
承認待ち1
承認済みspam
スパムとしてマークtrash
ゴミ箱に入れる
まずシェルで以下のコマンド。
$ mysql -u <USER_NAME> -p
パスワードを入れてMySQLログイン。
-- DB一覧
show databases;
-- DB選択(`wp-config.php` で設定しているもの)
use <DATABASE_NAME>;
-- 特定IPアドレス `XXX.XXX.XXX.0/24` からのコメント数を確認
select count(1) from wp_comments where comment_author_IP LIKE 'XXX.XXX.XXX.%';
-- 特定IPアドレス `XXX.XXX.XXX.0/24` からのコメントをゴミ箱に入れる
update wp_comments SET comment_approved='trash' where comment_author_IP LIKE 'XXX.XXX.XXX.%';
-- 問題なければコミット
commit;
これで指定IPアドレスからのコメントがすべてゴミ箱に入ったはず。
あとはゴミ箱を空にするなりなんなりすればいい。
指定IPアドレスからのアクセスを拒否
nginxの設定で拒否する。
設定ファイル(サーバの設定を自分でいろいろ書いているはず。たとえば /etc/nginx/conf.d/default.conf
)に
server {
のような記述があるので、ここにIPアドレスの拒否設定を書く。
server {
deny XXX.XXX.XXX.0/24;
みたいな感じ。
(ただ、他のサイトを見ているとserverブロックで書いているところはない。locationブロックで書いている。別にどっちでもいいようだが。)
このあとnginxの設定ファイルをチェックし、nginx再起動。
# 設定ファイルの文法チェック
# nginx -t
# 上でsyntax is okみたいに出たら下を実行。出なければ設定ファイル見直し
# systemctl restart nginx.service
これでもうこのIPアドレスからはアクセスできなくなる。
deny <IP_ADDRESS>
はそのIPアドレスからのアクセスを拒否し、
allow <IP_ADDRESS>
はそのIPアドレスからのアクセスを許可する。
どっちも書く場合は順番が重要だが、今回は拒否だけなので deny
だけ書いておけばいい。