通常の保守とは異なるのですが、事情があって簡易的に保守をしているWordPressにおいて、突然データベース接続エラーが発生しました。すぐに解消したものの、確認するなかで原因と解決方法がわかったため、記録として記しておきます。
目次
突然のデータベース接続エラーの発生
ウェブサイトが正常ではない通知があり、確認しにいくと画面にはデータベース接続エラーとだけ表示されていました。
深夜未明に発生していたため、その時点で既に数時間程度経過。FTP経由でサーバーへアクセスし、WordPressのディレクトリにあるwp-config.phpやテーマ、プラグイン等の主要ファイルを調べますが、直近に日時の修正された形跡は無し。
また、当然画像ファイルやhtmlファイルへのアクセスは可能です。
突如エラーが復活
10分20分調査していたところ、突然エラーが解消。問題なくウェブサイトにアクセスできるようなりました。結果、自動的に復旧し解消しました。WordPressにも問題なくログイン可能です。
「解消した!あー良かった。」
で終わったら危険。原因がわからないと再発する可能性があるため、調査は続きます。
突如エラーが復活したことから、データベースに対して一時的な負荷がかかった可能性を考えました。
サーバーのアクセスログを確認
対象のWordPressはレンタルサーバーのロリポップ上で動いています。ロリポップではアクセスログを確認できます。
アクセスログ解析の利用方法 – ロリポップ!レンタルサーバー
アクセスログをそのまま見るのは専門的すぎてわかりづらいと思いますが、ロリポップではアクセスログを元に見やすいグラフ形式を生成してくれます。
アクセスログを見たところ、すぐに原因がわかりました。
原因はアクセス集中によるデータベースサーバーへの負荷増大
日付を過去一週間に指定してアクセスログを確認したところ、9時や19時といった特定の時間に20倍程度のアクセスがあったことが確認できました。アクセス先はWordPressのログイン画面となり、1秒間に3-5回程度のログインを試行していました。(いずれも失敗)
このように、特定の時間帯に急激にアクセスが増加し、特にログイン画面へのアクセスが集中している場合、データベースサーバーの負荷が原因である可能性が高く、これによりデータベース接続エラーが発生したことが考えられます。
WordPressへのログイン試行が多く、存在しないユーザー名を使ったブルートフォース攻撃ということがわかりました。特定の時間に集中的に実行しているため、データベースへのリクエスト数が急激に増大し、これによってデータベースへの負荷が高まり接続エラーが発生したとみて間違いありません。自動復旧したという理由にも繋がり納得できます。
行った再発防止策はすべて無料でできる
ブルートフォースアタックによるデータベースサーバーへの過負荷となることでデータベース接続エラーが発生しているとみて、以下の対応策を実施しました。すべてWordPressのセキュリティプラグインである「SiteGuard WP Plugin」を使用しています。プラグインのため無料でインストールすることが可能です。
SiteGuard WP Plugin – WordPress プラグイン | WordPress.org 日本語
WordPressのログインURLを変更
そもそもログイン画面に行くことができなければブルートフォースアタックは相当数減ることが考えられるため、「ログインページ変更」においてログインURLを変更しました。URLは想像しやすいURLではなく、ランダムな英数字や長い文字列等のURLが望ましいです。
ログインを繰り返したらIPアドレスをロック
「ログインロック」において、今回のような短い時間で何度もログインを繰り返す場合、接続元のIPアドレスを一定時間ブロックするように設定しました。期間は5秒、回数は3回、ロック時間は5分に設定。これにより「5秒間のうちに3回ログインを繰り返した場合、5分間ロックする」ようになります。
ログイン時のアラートを有効化
「ログインアラート」にて、ログインがあった場合に管理者に通知があるように変更しました。ログイン成功時に管理者へメールが届きます。もし不正ログインが成功した場合、いち早く気がつくことができる機能です。
XML-RPCを無効化
ログを確認するとXML-RPCからのログイン失敗も数は多くないもののあったため、利用していないXML-RPCを無効化にするため「XMLRPC防御」より無効化の設定を行いました。有効化しただけではピンバックが無効化となるだけなので、「XMLRPC無効化」を選択して保存することを忘れずに。
ちなみにXML-RPCを有効化しないといけない条件として例えば以下が挙げられます。
- WordPress公式のモバイルアプリ: XML-RPCを使用して、記事の作成や編集、統計の確認などを行います。
- 外部サービスとの連携: 他のCMSやツールと連携してコンテンツを管理する場合に使用されます。
対象のWordPressはこういった機能やツールは利用していないため、XML-RPCを無効化しても問題無しです。
ログイン時における画像認証の追加
これは既に実施済みでしたが、WordPressログイン画面に文字入力による認証を追加できます。ブルートフォースアタックの多くは海外からのため、文字の種別を「ひらがな」に設定することでログインされる可能性は相当低くなることが考えられるため、とてもおすすめです。「画像認証」より設定。
対策後、リクエスト数は大幅低下しエラーも発生せず
対策後、1週間程度おいてからアクセスログを確認しました。結果、実施した施策が功を奏しブルートフォースアタックがほぼゼロとなり、リクエスト数大幅低減となりました。これによりエラーも当然発生していません。
リクエスト数は大幅低下
リクエスト先URLにもログインURLやXML-RPCは無し
ブルートフォース攻撃はなくなり、ログイン試行はほぼ解消
一部XML-RPCの対応だけ後日行ったため完全に解消しきれていないものの、不正ログイン試行回数は1日に2〜4件程度まで大幅減少となったことがわかりました。ブルートフォースアタックは0件!
まとめ: 不正ログインによるデータベース過負荷は無料で対策できる
以上、ブルートフォースアタックによるデータベース負荷増大の結果発生したデータベース接続エラーの原因と対処方法のご紹介でした。
WordPressのエラーは何が原因で発生しているのか、一見わからないですが、紐解いていくとしっかり原因があることがほとんどです。
「WordPressのセキュリティ対策は難しい……。」
確かにどこから手を付けていいのかわからなかったり、専門的すぎて難しいというのもわかりますが、例えば今回のような件であれば対策も特別なことではなく、偉大な開発者が公開してくれているプラグインのお陰で手間なく対応できることも多いです。今回はそんな一例でした。
提供サービスであるWordPress保守管理サポートにおいては今回のようなことが発生しないようなセキュリティ対策を実施しているのですが、今回の対象となったWordPressは通常のWordPressとは異なる簡易的な保守を昔から実施していたという経緯もあって発生したエラーでした。
WordPressで同様のエラーが発生したらぜひご参考ください。
コメントを残す