WordPressで「Wordfence」という無料のセキュリティプラグインを使っているのだが、これのファイアウォール設定で厄介なトラブルに遭遇してしまったので、その解決策の備忘録。
発生したトラブルの概要
- 環境
-
- レンタルサーバー:XServer
- メインドメインと、そのサブディレクトリにあるサブドメインの両方でWordPressを運用
- やりたいこと
-
メイン・サブ両方にセキュリティプラグイン「Wordfence」を導入し、ファイアウォール(WAF)を最適化
- トラブル内容
-
- 片方のファイアウォールを有効化すると、もう片方の設定がおかしくなる(再度最適化を促すアラートが出現する)。
- クイック編集が効かなくなる(ローディングアイコンがぐるぐる表示されたままで変更が反映されない)、などの不具合が発生。
トラブル発生の経緯
サブドメインをメインドメインのそのサブディレクトリに作成し、メインドメインと同じようにWordPressをインストールした。さらにセキュリティプラグインとしてWordfenceも追加し、無料プランでファイアウォールを最適化。ここまでは良し。
メインドメインの方で作業をしていると、管理画面の上部にWordfenceから黄色のアラートが出ていることに気づく。確か「ファイアウォールの最適化の設定を完了してください」みたいな内容だった。いや、完了しているはずだがなぜ今更?と思いつつ、Wordfenceのダッシュボードを開き、再び最適化を行う。
今度はサブドメインで作業していると、トラブル発生。
なぜか、投稿一覧でクイック編集ができない。タイトルなどを変更して更新しても、ローディングアイコンがくるくる回ったまま止まっている。コンソールを開くとエラーも出ている。さらに、カスタマイズの高度な設定や追加CSSも効かない。なんだこれは。
画面をよく見ると、なんとメインドメインと同じようにWordfenceから黄色のアラート「ファイアウォールの最適化の設定を完了してください」が出ているではないか。
サブドメインで最適化を行うとアラートは消え、再びクリック編集ができるようになった。
が、今度はメインドメインで同じ問題が発生。どうやら、一方を最適化するともう一方の最適化が効かなくなってしまうようだ。
トラブル解決に向けて試行錯誤
致命的な問題ではなさそうだが、やはりセキュリティ的には良くなさそうだし、クイック編集などができないのは地味に不便だし、ずっとアラートが出ているのは鬱陶しいしということで、解決に乗り出すことに。
いろいろ探った結果、どうやら.user.iniというファイルの最後に記述されている Wordfence WAFの参照リンクに問題があることが判明した。
; Wordfence WAF
auto_prepend_file = '/.../public_html/wordfence-waf.php'
; END Wordfence WAF ... の部分は、サーバーごとのフルパス(例: /home/サーバーID/ドメイン名/... など)になっています
これ、wordfence-waf.phpというファイアウォールの設定ファイルを読み込むためのリンク(auto_prepend_file = '/.../public_html/wordfence-waf.php)が記載されているのだが、このリンク先がおかしい。
wordfence-waf.phpファイルはメインとサブのそれぞれに存在しているが、.user.iniのリンク先が、ファイアウォールを最後に最適化した方に統一されているのだ。
.user.iniのリンク先- メイン
-
最後に最適化した方の
wordfence-waf.php - サブ
-
最後に最適化した方の
wordfence-waf.php
.user.iniのリンク先- メイン
-
メインの
wordfence-waf.php - サブ
-
サブの
wordfence-waf.php
ということは、FTPやファイルマネージャーでファイルを手動で書き換えちゃえばいい!と思ったのですが・・・。
.user.iniを直接書き換えると、「自動的にもう一方のファイルも書き換わってしまう」という現象が発生。(メインの方のリンク先をメインに書き換えると、なぜかサブの方のリンク先もメインになる。逆もしかり)
これはおそらく「Wordfenceの自動修復機能」ではないか?(Wordfenceが「設定が間違っている」と判断して、勝手に親ディレクトリまで遡って書き換えを行ってしまう)
ならば、勝手に書き換えを行わないよう、.user.iniのパーミッションを「444(読み取り専用)」にすればどうか? ということで、メインの方を正しいリンクに変更してからパーミッションも読み取り専用に変更。
するとまた不思議なことが。なんと、サブの方の.user.iniのパーミッションも「444」になっている。
ここまできて、ようやく原因が判明。
原因究明 → トラブル解決
.user.iniファイルの「ハードリンク(同期)」現象が問題の原因
ファイルの中身だけでなく、パーミッションまで同期していたことから、サーバー上でメインとサブの .user.ini が「実体として同じファイル(ハードリンク)」として扱われてしまっていた模様。
ということで、このリンクを物理的に断ち切るため、以下の手順で解決した。
- ローカルで正しいファイルを用意
サーバー上のファイルをいじらず、PC上で2つのテキストファイル(.user.ini)を作成する。- メイン用:
auto_prepend_file = '/.../public_html/wordfence-waf.php' - サブ用:
auto_prepend_file = '/.../public_html/サブディレクトリ/wordfence-waf.php'
- メイン用:
- サーバー上のファイルを「削除」してリンクを断つ
- FTP(またはファイルマネージャー)でサーバーに接続し、メインとサブ両方の
.user.iniを削除
→ これを行わないと、見えない「同期(ハードリンク)」が解除されない。
- FTP(またはファイルマネージャー)でサーバーに接続し、メインとサブ両方の
- ローカルで作成したファイルをアップロードして「ロック」
- メイン用のファイルをアップロードし、パーミッションを「444(読み取り専用)」に変更
- サブ用のファイルをアップロードし、パーミッションを「444(読み取り専用)」に変更
- リンクが解除されていればロックは不要かもしれないが、念のため
これでようやく双方のサイトでアラートが消え、クイック編集も機能するようになりました!
解決策としてはシンプルでしたが、初めての問題だったので原因究明に苦労しました。。。
同じトラブルを抱えている方は、ぜひ参考にしてみてください!
