HTTPS化したWordPressサイトにSiteGuard WPを設定後管理画面にアクセスできなくなったときの対処法 (Apache on ラズパイ)

投稿者: | 2022年5月20日

SiteGuard WP を導入したあとに SSL 対応すること。
SiteGuard WP を導入したあとに SSL 対応すること
大事なことなので 2 回繰り返した。

もし SSL 対応したあとに SiteGuard WP を導入してしまった残念な読者に告ぐ。安心してほしい、ここに復旧方法を記した。私の屍を越えてゆくのだ。

現象

ラズパイに WordPress の導入を終え、サイトが正常に表示できることを確認したのち、certbot を使ってサーバーの https 化を行った。

その後、SiteGuard WP Plugin をインストールし、ログインページ URL の変更を含むセキュリティ強化を行った。

ところが、SiteGuard WP Plugin の有効化直後、右上のアカウントメニューから WordPress をログアウトしたとき、404 エラーが出た。

それ以降、変更後の URL でログインページにアクセスしようとすると常に 404 エラーが返され、また変更前の URL (wp-login.php) も変更後の URL にリダイレクトされてしまい、管理画面にログインできなくなってしまった。

復旧手順

かなり込み入っているため、作業の順番に注意する必要がある。なお、復旧対象のサイトにアクセスしたことのないブラウザがのちほど必要になるので、たとえば普段 Chrome を使う人なら Safari や Edge などをご準備願いたい。

プラグイン削除と SSL の無効化

.htaccess に追記された部分をいったん無効化

ドキュメントルートに移動。

cd /var/www/html

.htaccess を編集する。

sudo nano .htaccess

.htaccess の冒頭付近(記載場所は環境によって異なる)で以下のような記述を探し、#SITEGUARD_PLUGIN_SETTINGS_START ~ #SITEGUARD_PLUGIN_SETTINGS_END に挟まれた部分を全てコメントアウトする。

#SITEGUARD_PLUGIN_SETTINGS_START
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_START
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteRule ^wp-signup\.php 404-siteguard [L]
    RewriteRule ^wp-activate\.php 404-siteguard [L]
    RewriteRule ^設定したログインURL(.*)$ wp-login.php$1 [L]
</IfModule>
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#SITEGUARD_PLUGIN_SETTINGS_END

Apache2 を再起動。

sudo systemctl restart apache2

プラグインの削除

プラグインの入っているフォルダに移動。

cd /var/www/html/wp-content/plugins

siteguard ディレクトリごと削除し、このプラグインを読み込めなくする。

sudo rm -rf siteguard

ひとまず管理画面にログインできることを確認

ここまでやって、https://ドメイン名/wp-login.php にアクセスし管理画面にログインできれば、とりあえずログインまでは復旧した。しかしこのままでは SiteGuard WP Plugin が使用できないので、使用できるように設定していく。

ポイントは、SiteGuard WP Plugin は、ログイン URL の設定時に http の 80 番ポートを使って動作していると思われる点である。したがって、SSL を設定した状態で SiteGuard WP を導入すると設定がうまく完了せず、今回のような現象が発生するらしい。そこで、まず SSL を無効化し、http ポートを通して SIteGuard の設定を正常に完了させたのち、再度 SSL を有効化する。

WordPress サイトアドレスを変更

管理画面から、設定 > 一般 > WordPressアドレス(URL)、サイトアドレス(URL) の2か所を https ではなく http に変更する。

前者がグレーアウトしていて変更できない場合、 /var/www/html/wp-config.php を開き、以下の行を探して http に変更する。

define( 'WP_SITEURL', 'https://ドメイン名' );

SSL を停止し http ポートを有効化

Apache2 の設定で SSL を無効化。

sudo a2dissite default-ssl
sudo a2dismod ssl

/etc/apache2/sites-available/000-default.conf を編集し、以下 3 行をコメントアウトすることで、http → https のリダイレクトをいったん無効化する。

RewriteEngine on
RewriteCond %{SERVER_NAME} =ドメイン名
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Apache2 を再起動。

sudo systemctl restart apache2

ここまでで、サーバーが http によるアクセスを受け付ける状態になった。

mod_rewrite の有効化

WP SiteGuard Plugin はアクセス制御に .htaccess によるリライトを利用しているようだが、Apache2 の設定でリライトが無効になっている場合があるので、有効化する。

sudo a2enmod rewrite

/etc/apache2/apache2.conf を開き、ドキュメントルートの「AllowOverride」を All に変更する。

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All  # None の場合、All に変更
    Require all granted
</Directory>

Apache2 を再起動。

sudo systemctl restart apache2

以上で準備は整った。いよいよ管理画面からプラグインを再度導入してゆく。

プラグインの再導入

復旧対象のブログに https でアクセスしたことのないブラウザを用意

唐突な要求でびっくりするが、これには訳がある。

RFC6797 で標準化された「HSTS」と呼ばれる規格がウェブブラウザには存在する。これは要するに「一度 https で接続したドメインに対しては、以降 http で接続した際でも強制的に https へリダイレクトし、以降のそのドメインへの接続はすべて https とする機能」のことである。この規格のせいで、管理画面に http でアクセスを試みても https にリダイレクトされてしまうため、正常に SiteGuard の設定を行うことができない。

HSTS の情報はブラウザにキャッシュされているので、その情報を消去する唯一の手段は、

  • サーバーで「保存期間ゼロの HSTS ヘッダー」を返すよう設定したのち、当該ブラウザで https を使ってアクセスする

ことである。すでにサーバーで SSL を停止してしまったので、今回は、復旧対象のブログに https でアクセスしたことのないブラウザ、つまり HSTS キャッシュが保存されていないブラウザを用意し、管理画面「http://ドメイン名/wp-admin」に http でアクセスする。

管理画面でプラグインを再設定

プラグインの新規追加で WP SiteGuard Plugin を再インストールし、ログイン URL 変更の設定を行う。設定を保存したら、右上のアカウントメニューから「ログアウト」を行う。このとき、そっけない 404 エラーが出ずに、 WordPress が生成した 404 ページやブログのホームが表示されれば、設定成功です!

確認のため、変更後の URL で正常にログイン・ログアウトができることを確認しよう。

SSL を再度有効化

例によって操作の順番に気を付ける。管理画面での操作をサーバーの操作より先に行わないと、管理画面自体にアクセスできなくなります。

WordPress サイトアドレスを変更

管理画面から、設定 > 一般 > WordPressアドレス(URL)、サイトアドレス(URL) の2か所を http ではなく https に変更する。前者がグレーアウトしていて変更できない場合、 /var/www/html/wp-config.php を開き、以下の行を探して https に変更する。

define( 'WP_SITEURL', 'http://ドメイン名' );

SSL を有効化し https リダイレクトを設定

Apache2 の設定で SSL を有効化。

sudo a2enmod ssl
sudo a2ensite default-ssl

/etc/apache2/sites-available/000-default.conf を編集し、以下 3 行に施していたコメントアウトを解除する。

# RewriteEngine on
# RewriteCond %{SERVER_NAME} =ドメイン名
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Apache2 を再起動。

sudo systemctl restart apache2

以上です。お疲れさまでした。

感想

疲れた。結局今回の件をまとめると、

  • WP SiteGurad Plugin の仕様を発端とし、
  • Ubuntu よりマイナーな Apache2 on Debian における .htaccess や 各種 .conf 変更を迫られ、
  • WordPress 一般設定画面におけるサイト URL 指定のミスや、
  • ブラウザの HSTS 標準化規格によりアクセスを阻まれ、
  • これらの変更順序を誤ると管理画面に辿りつけない

という沼だった。知識不足で突撃するなって話ですね。でもプラグイン説明文の分かりやすい場所に「HTTPS 環境でやるな!」って警告くらい書いておいてくれ~~(きみがプルリクを、出すんだよ)

参考にしたサイト

コメントを残す

メールアドレスが公開されることはありません。