レンタルサーバーにインストールして、簡単にブログ+αのサイトが作れるWordPress。従来のHTMLで作成するサイトと比べて簡単にコンテンツの追加や編集が行えて本当に便利ですね。
WordPressには元々一部のコンテンツを非公開にする機能が備わっていますが、これは特定のコンテンツを秘匿にする機能であり、サイト全体を非公開にしつつ、特定の人には閲覧や操作ができるという機能は持っていません。
そこで今回は、比較的簡単に公開目的のレンタルサーバー上にインストールしたWordPressサイトを丸ごと非公開にして運営する方法を紹介します。
サイトをプライベート化する手法と手順
決まった場所以外からのアクセスを拒否する
次項で紹介する、ログインしていないユーザーに何も見せないという措置でも十分なのかも知れませんが、完全にプライベートにするならこの措置は必須ですので先に紹介します。
これはプラグインやカスタムコードでは実装できない(それらで実装するとトラブル発生時に対処しにくくなる)ため、サーバー上にあるファイルへ直接編集を行います。自身のない方はこの措置をスキップすることをおすすめします。
サイトを収容しているレンタルサーバーのファイルマネージャーなどで.htaccessファイルの編集画面を開き、できるだけ先頭の方(# BEGIN WordPress という行の前)に以下を追加していきます。
アクセス元グローバルIPアドレスの制限
これはプライベートにするために必須の記述です。以下のコードを追加することで実装できます。
# AccessControl IP/HOST
order deny,allow
Deny from all
Allow from アクセスを許可するグローバルIPアドレス
Allow from サイトを収容しているサーバーのグローバルIPアドレス
「アクセスを許可するグローバルIPアドレス」の部分は、実際にアクセスをする拠点のグローバルIPアドレス(こちらで簡単に確認できます)へ書き換えます。
複数の拠点を許可する場合は「Allow from アクセスを許可するグローバルIPアドレス」の行を追加していけばOKです
WordPressでは機能によってサーバーのグローバルIPアドレスを取得して何かの動作を行うようにしているものもありますので、「サイトを収容しているサーバーのグローバルIPアドレス」にはサイトを収容しているレンタルサーバーのグローバルIPアドレスを指定します(これを行っていないと思わぬ不具合に遭遇することがあります)。
レンタルサーバーのグローバルIPアドレスについては、サーバーによって調べ方が多種ありますのでレンタルサーバーの管理画面等で情報を調べてください
指定場所以外からログイン画面へアクセスできないようにする
前項のグローバルIPアドレスによるアクセス制限をすれば基本それ以外の場所からアクセスされることはありませんが、念のため、指定場所以外からWordPressサイトのログイン画面が開けないようにしておきましょう。
<FilesMatch "wp-login.php">
Order deny, allow
Deny from all
Allow from アクセスを許可するグローバルIPアドレス
</FilesMatch>
「アクセスを許可するグローバルIPアドレス」をアクセス許可する拠点のグローバルIPアドレスへ書き換えます。
この措置はログイン画面のみに作用するので、プライベートでないサイトで特定の拠点からしか管理画面側の操作をしないサイトではセキュリティの向上が図れます
設定ファイルへの直接アクセスを禁止する
WordPressでは、サイトを動作させるための基本的な情報が「wp-config.php」というファイルに書かれていて、このファイルへ直接アクセスされるようにしておくことはセキュリティ上よくありませんから、サイトをプライベートにするか否かに関わらず、以下のコードを追加して外部から「wp-config.php」を参照できないようにしておきます。
<files wp-config.php>
order allow,deny
deny from all
</files>
以上の措置を行うことで、指定した拠点とサイトが収容されているサーバー以外からのアクセスはすべて拒否され、プライベートなサイトを作ることができます。
アクセスを許可するグローバルIPアドレスが正しければ問題なくサイトの表示・操作ができますが、逆にその他のIPアドレスから確実に操作できないことを確認するため、上記コードの「アクセスを許可するグローバルIPアドレス」をわざと別のアドレスに書き換えて、アクセスや操作ができないかを確認しておくことも重要です
自宅や会社などのインターネット接続環境によっては定期的にグローバルIPアドレスが変わるようになっているケースもありますから、そのような形態の場合は変更が起こるたびに「アクセスを許可するグローバルIPアドレス」の変更が必要です
ログインしていない人のアクセスをすべてログイン画面に移動させる
プライベートサイトでは、アクセスが許可された拠点から自由に閲覧はできるようにするケースを除き、サイト内のどのページへアクセスしても、ログインしていない人は直接みることができず、ログインした人のみサイトの表示ができるようにする必要があります。
もちろんカスタムコードをいくつか追加してこの機能を実装することもできますが、手っ取り早くプラグインを使うのが妥当でしょう。
そこでおすすめするのが「Subway」というプラグインです。
このプラグインは、簡単な設定で以下のことができるようになります。
- サイト内のどのページへアクセスしても、ログインしていない人はログインページへ遷移され、ログインしないと何も見えなくすることができる
- ログイン後は設定した任意のページを表示させることができる
- ログアウト後はログインページへ遷移させることができる
- ログインページは素っ気ない?標準のログイン画面ではなく、任意の固定ページを指定できる
まさにWordPressのサイトを完全プライベート化するにはもってこいのプラグインなのですが..実はSubwayプラグインは2024年4月中旬以降ダウンロードできなくなっています。
プラグインの脆弱性に関する指摘がされたものの対処されなかったのが理由のようで、Subwayプラグインの脆弱性情報については「Subway – プライベート サイト オプション <= 2.1.4 – REST API 経由の機密情報公開に対する不適切なアクセス制御」などで紹介されています。
実際にテストをしてみると、ログインしていない状態でもREST API経由で情報が取得できてしまうことが確認できましたが、今回のように、特定場所以外からのアクセスの必要がなく、外部サイトから今回作るサイトに関する何かの情報を引っ張り出す必要がないようなプライベートなサイトであれば、以下のコードを使ってREST API経由での情報取得を無効にすることでこのプラグインの問題は解決します(コードの解説についてはこちらのページをご覧ください)。
/***** Rest apiの使用を無効にする *****/
function pwcn_deny_restapi_except_plugins( $result, $wp_rest_server, $request ){
$namespaces = $request->get_route();
/** ここから下に除外する条件を指定する **/
//寄稿者権限以上の場合はオフ(ブロックエディタは除外する)
if ( current_user_can( 'edit_posts' ) ) {
return $result;
}
//oembedの除外
if( strpos( $namespaces, 'oembed/' ) === 1 ){
return $result;
}
/** ここから上に除外する条件を指定する **/
//除外条件に合致しない(拒否する)場合のメッセージ
return new WP_Error( 'rest_disabled', 'The REST API on this site has been disabled.', array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'pwcn_deny_restapi_except_plugins', 10, 3 );
このコードを追加する前後で、以下のURLへアクセスして、REST APIが塞がれているかを確認してください。
プライベート化するサイトのトップページのURL/wp-json/wp/v2/posts
コード追加前にはずらっと情報が表示され、追加後は素っ気ないアクセス拒否のメッセージが表示されるはずです。
個人的な見解として、このプラグインの作者がこの問題に対して対処せず、2024年4月19日に閉鎖したのはREST APIを塞ぐことで他のプラグインを使用した際に不具合が出る可能性があるからだと思われ、自身で制御できる(必要な部分は解放する措置を行う)なら使用に際しては問題ないでしょう。
これを理解した上で「Subway」プラグインを使いたいという方のために、以下からダウンロードできるようにしておきますので使ってみてください。
累計ダウンロード数:3回
うーーん、それでもやっぱり更新されていないプラグインを使うのはイヤ!という方は、以下の似た機能を持つプラグインを使うのがいいでしょう。
ただ、「Subway」と同じ機能ではないので、使ってみて不都合に感じるならやっぱり「Subway」がおすすめですよ。そもそも前項で紹介したIP制限を掛けてしまえばREST APIによるアクセスも拒否されるので問題はないはずですから。
ここまで行えば、完全にプライベートなサイトとしてWordPressを稼働させることができます。
ここまでで紹介した仕組みではグローバルIPアドレスによるアクセス制御とログインの必須化によって許可した場所からアクセスし、かつ、閲覧するためにはログイン情報が必要になるので、公開されているレンタルサーバー上に展開しているサイトでありながら、結構堅牢なプライベート空間を作ることができると思います。
この仕組みを使えば、個人的なファイルや記録を残す目的のサイトとして使用するのにも重宝しますし、インターネット上で展開しているので、全国の拠点とVPNなどの社内ネットワークでつながっていない企業でも社内情報の共有やマニュアルの共有サイトとして使えますね。
逆に社内ネットワーク上であれば、どこかのPCやサーバーにWebサーバー機能を導入してそこでWordPressを稼働させ、ローカルIPアドレスで制限すれば同じような環境を作ることもできますよ。ただ、企業でレンタルサーバー契約をしてホームページを公開しているのなら、わざわざそんな風にする必要もないでしょう。
この方法では許可した拠点からのアクセスが成功した!と一喜一憂しがちなのですが、実際は確実にアクセス拒否が働くのかの方がよほど大事ですので、許可していない拠点からアクセスしてみる、外部回線で接続しているスマホなどからアクセスしてみるなど定期的に拒否されるかチェックするのを忘れずに!!
コメントを残す