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 だけ書いておけばいい。

参考

WordPress

nginx