WordPressというものを初めて使ったんですが、管理ページにログインしてここでデザインを変えたり、投稿を作ったりする感じなんですね。
で、管理ページというものはサイトに「/wp-admin」をつけてアクセスすると、管理ページのログインページが出てきて、そこに管理者のユーザー・パスワードでログインして・・ってわけです。
ちょっと今どき管理画面に誰でもアクセスできてユーザー・パスワードだけでログインするっていうのは、ちょっと危ないなと思ったので、アクセス制御をすることにしました。
一番単純なのはIPで制御して、いつも使ってるPCのIPからのアクセスでしかページが出ないようにすることかなと思ったので、その通り設定していきます。
あんまり詳しくないんで、IPがどういう頻度で変わるかとかよくわからないんですが、とりあえずやってみよう!
まぁIP変わっちゃってログインできなくなったらSSLでサーバーに入って設定を書き換えればいいか、くらいの感じで。
というわけで、まずは自分のPCのIPを探ります。私のPCはMacなので、Macに入れたiTermで以下コマンドを実行。
curl -4 ifconfig.me
すると、IPv4アドレスが表示されます。ちなみに「-4」をつけないとIPv6のアドレスが出ます(私のPCでは)。
でIPアドレスを確認したらサーバーの/var/www/html/.htaccess に以下を追加。IPはさっき調べたものにする。
# --- wp-login.php を指定IPだけ許可 ---
<Files "wp-login.php">
Require ip XXX.XX.XX.XX
</Files>
ちなみにこの.htaccessにはすでに
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます
という記載があって、どうやらWordPressが使っている模様。なので「END WordPress」の下に書かないとダメみたいなので注意です。
さらに wp-admin/ フォルダ内へのアクセスを閉じるため、/var/www/html/wp-admin/.htaccess を作成し、
# --- /wp-admin を指定IPだけ許可 ---
Require ip XXX.XX.XX.XX
# admin-ajax.php だけはフロントから使えるように許可
<Files "admin-ajax.php">
Require all granted
</Files>
を入れて保存。
正直ログインページが制御されていればいらない気もする(ログインできなければ管理ページも使えないはずなので)が、とりあえず入れておきます。しかしIPが変わった時2箇所直さないといけないのは面倒かもなので、実際に運用をしてみて考えます。
で、よくわらないけど、admin-ajax.phpは許可しておかないとフォーム送信・動的読み込み(?)が失敗することがあるとのことなので許可するよう入れておきます。(実際に何かおかしくなったとかではないですので設定がないとどうこまるかはわかりません。。)
また、/var/www/html/wp-admin/.htaccess は自分で手動で作ったため、ファイルにApacheユーザーでの読み取り権限が必要ですので権限を付与します。(ちなみにファイルはrootで作りました。)
sudo chown apache:apache .htaccess # 所有者をApacheユーザーに
sudo chmod 644 .htaccess # 所有者は書き込み可、それ以外は読み取りのみ
で、保存したら下のコマンドでApacheを再起動します。
sudo systemctl reload httpd
そしたらアクセスして確認。はい。

Forbidden エラー。
設定は効いたようですが、自分のPCからの接続もNGになってしまいました。
IPを間違えたかな。とアクセスログを確認する。
sudo tail -f /var/log/httpd/access_log
設定したIP(うちからアクセスしたはずのIP)はどこにも出てない・・・。10.0.X.X からのアクセスとなっているので、ALB(ロードバランサー)のIPになっちゃってるようです。ALB経由だからそりゃそうか。
で、調べたところApache に “本当のクライアントIP” を教える 設定を入れてやればもとのIPがわかるようです。それにはApacheの「mod_remoteip」を使うみたい。
mod_remoteipをApacheにロードさせるために下のコマンドを実行して、.confファイルを/etc/httpd/conf.modules.dに作成し、その中にmod_remoteipをロードさせるコマンドを入れる。
# /etc/httpd/conf.modules.d/00-remoteip.conf を追加
sudo sh -c 'echo "LoadModule remoteip_module modules/mod_remoteip.so" > /etc/httpd/conf.modules.d/00-remoteip.conf'
/etc/httpd/conf.modules.dに.confファイルを入れておくと、Apache起動時に自動で読み込まれるらしい。
なのでファイル名は自由ですが、ファイル名順に読み込むので、なるべく早い段階で読み込ませるために、00-remotepi.confという名前で保存します。
これでApacheにremoteipを使わせる設定をしたので、今度はremoteip自体の設定を書きます。
remoteipの設定は「/etc/httpd/conf.d/remoteip.conf」に書きます。こちらもファイル名は自由っぽいですが、remoteipの設定なのでremoteip.confとします。
肝心の設定は下のような感じで入れました。ALBのサブネットはAWSコンソールからVPC>サブネットで調べます。
# ALB が送ってくる元のクライアントIPのヘッダ
RemoteIPHeader X-Forwarded-For
# ALBのサブネットを指定
RemoteIPTrustedProxy XX.XX.XX.XX/24
# ログフォーマットを修正して、置き換え後の %a を出力
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
そしたらApacheを再起動
sudo systemctl reload httpd
で、管理画面を確認。
今度は無事、管理画面に入ることができました!
sudo tail -n 5 /var/log/httpd/access_log
でアクセスログをみると、ちゃんと自宅PCのIPアドレスが表示されています。
で最後にスマホの5G回線ででアクセスすると、Forbidden表示。無事成功です!
(ちなみにこれは自宅のWifiをOKとした形なので、スマホの4G/5G回線からだとNGということで、スマホをWifiに繋げれば見られます。)
そとからスマホで編集とかはできないですが、とりあえず今の段階ではこれでOK。
ではまた。