ワードプレスにログインできない

今日は朝からワードプレスにログインできなくなり、2時間以上浪費しました。
ちょっと悔しいので記事にして報告します。

All in one wordpress security and firewallにやられました

始まりは、私のサイトにスパムの来訪が多くなってきたので、プラグインの機能で防御しようしたことです。
サーバーの運用も少し慣れてきたので、SSHでログインしてアクセスログを見ると、wp-adminへのログインを試みたりいろいろやっているようでした。
攻撃者のドメインは以下のようなものでした。

  • bc.googleusercontent.com
  • colocrossing.com
  • sprintbroadbanddirect.com
  • compute.amazonaws.com

本来は、海外IPアドレスフィルターで防御されるべきとは思いつつ、データの転送量も当初の10倍くらいになっていたので、ドメインでフィルターすることにしました。
具体的には、下記画面(All in … のBlacklist機能)にて、前述のドメインを追加しました。

この設定は、昨日実施し本日アクセスログを確認すると、なぜかamazon.comのアクセスが1つだけありました。原因が不明でしたが、もしかして最後の1行に追加で改行を加えると有効になるかもと思い、スマホから”Enter User Agents”の最終行に改行を追加しました。

そして本日AM10時頃、何気に自分のサイトにアクセスしてみると、403エラー(閲覧禁止)で開けません。

最初は状況が呑み込めませんでしたが、先ほどの無駄な改行をAll in one プラグインがすべてのドメインと解釈し、どこからもアクセスができなくなったのだと考えるに至りました。
家に帰ったらカギがなくてドアが開かないような侘しい気持ちがしました。
ここからが戦いの始まりです。

ネットで情報を収集しサポートへ連絡

まずは、冷静になろうとSSHでサーバーにログインしたところ、問題なくログインできました。さらに、契約しているレンタルサーバー(さくらインターネット)の管理コンソールにも問題なくログインできました。
問題はワードプレスだけのようです。

ネットで情報を集めたところ、いくつか復旧方法が見つかりました。
具体的には、以下のようなものです。

  1. ワードプレスの該当プラグインをディレクトリごと削除
  2. ワードプレスが使っているデータベースのプラグイン情報を書き換える

結構怖い感じがしましたが、まずは1.を試してみました。
SSHでログインしてプラグイン用のディレクトリ(wp-content/plugins)へ移動し、ディレクトリ all-in-one-wp-security-and-firewall をリネーム後削除します。
結果は、ディレクトリをリネームしても削除しても変化なしでした。(tarでバックアップは取得しています)

次に、いったん冷静になろうとサポートに連絡しました。
一応、4回ほど電話してつながりましたが、結論的にはプラグイン導入はお客側の責任なのでサポート対象外という説明でした。
管理画面からデータベース(MySQL)への接続方法だけは教えてくれましたが、それ以上はご自身で対処を..と丁重に断られました。魚釣りの道具は与えてくれるが、道具の使い方や釣り方は自己責任ということですね。。

仕方がないので、最後の手段、データベースの書き換えです。
以下のサイトが参考になりました。
https://plugmize.jp/archives/blog/20180710_plugin_activate.html
さくらの管理コンソールから下記データベースの管理画面(phpMyAdmin)を表示し、データベースの更新を行います。

更新のために発行するSQLは、以下です。(青下線の部分はデータベースにより異なります。)

UPDATE wp_______options SET option_value = ‘a:0:{}’ WHERE option_name = ‘active_plugins’;

上記で、データベーステーブル(wp_______options)の1行が更新されます。
更新内容は、プラグインごとの有効/無効フラグのようで、すべてを無効とするのが設定値 ‘a:0:{}’のようです。
先ほどの記事にも書いてありますが、プラグインをピンポイントで無効にすることもできそうです。ただ、作業を誤ると面倒なので、上記方法がよいと私も思います。

私の場合は、この設定後もログインできませんでした。

最終手段の実施

これで万事休すかと思い、初期化・再構築に向けてデータのエクスポートのことなどを考えていました。
ちょっと冷静になって考えてみたのですが、ドメインフィルタはそもそも.htaccessファイルにて実施し、問題のプラグインはそれを設定したりフック(横取り)したりするような形で機能を実現しているはずです。
だったら、これを削除すれば接続できるようになるのではないかと思い至りました。
WinSCP(ファイル転送用ソフト)にてログインして、ワードプレスのルートディレクトリにある.htaccessファイルを削除したところ、見事つながりました

ここまで約1時間半、お客様先でのトラブル回復や作業ミスを思い出すような心境でした。

そして完全復旧へ

この時点で11時30分、あと30分あれば完全復旧できそうだったので、作業継続です。
管理コンソールへログイン(デフォルトのwp-admin)すると、問題の All in one は存在せず、他のプラグインはすべて無効となっていました。
必要なプラグインを再確認しながら、有効化していき、最後に問題の All in one を再インストールしました。
幸い、 All in one を含めプラグインが無効化(もしくは削除)されただけで、設定は残っていましたので、30分後の12時には完全復旧しました。

会社の食堂で作業していたのですが、12時過ぎの人の多い時間にもかかわらず、私の4人掛けの席には誰も座っていませんでした。それほど鬼気迫るオーラを出していたのだと思います。。

まとめ

今回は非常に焦りました。情けない話ですが、心拍数は1.5倍くらい50過ぎのオッサンが涙目状態でした。電源なしの作業環境かつ携帯電話のバッテリーが少ない状況も不安感を煽り、サバイバル感満点で、なんだかハッカーのような気分でした。
さくらインターネットのサポートの方も大変親切で感謝していますが、レンタルサーバーとはいえ自己責任の部分が多いのだなと感じました。
以下に、今回のトラブルシューティングをまとめます。

  1. 403エラーが発生したらワードプレスだけで発生しているか切り分ける
  2. セキュリティプラグインが怪しい場合、無効にするためにプラグインのファイルを削除してみる
  3. データベースの内容を書き換えてプラグインをすべて無効にする
  4. 解決しなければ.htaccessファイルを削除してみる
  5. それでもダメならばデータをエクスポートしてお引越しをサポートに相談する

今回の原因は、プラグインのバグだと思いますが、不思議と怒りのようなものは感じず、記事ネタを1つゲットできてよかったと思っている自分がいます。。