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 環境でやるな!」って警告くらい書いておいてくれ~~(きみがプルリクを、出すんだよ)
参考にしたサイト
- 症例
- Apache2 の操作