WordPressは汎用のCMS(サイト管理ツール)ですので、ログイン画面や管理画面のURL構造は共通。
「このサイトはWordPressで作られてる」ということが分かれば当然それらのURLも類推できますし、ユーザー名も何も対策していなければSEO対策の一環で設置する記事作者の一覧のURLから簡単に類推できてしまいますね。
そうなると最後の砦はパスワードだけ・・になってしまいます。
大抵の場合はこの方法で不正ログインが試みられます。その対策として有名なのは
- 何かのコードを追加するなどしてログイン画面や管理画面のURLを変える方法
- セキュリティ系のプラグインで1のことを設定する方法
の2つ。でも・・・
変更したURLがもしも分からなくなったらどうしますか??もしも何かの不具合でプラグインが正常に動作しなくなったらどうしますか?自力で復旧できることを確認してそれらの方法を使っていますか??
プラグインなんだから不具合が出たら強制停止すればいい!とフォルダのリネームや削除をしてもセキュリティ系プラグインの場合には解決しないことが多いんです。そして一旦削除したら・・・復旧はより困難になります。
今回はそんな不安定な方法ではなく、より確実に設定でき、より簡単に設定でき、そしてより簡単に復旧できる方法を紹介します。
もちろん記事執筆時にはこのサイトでも使っている方法ですので、通常のログインURLや管理画面URLでアクセスしてみてください。
見事に
な画面が表示されたらこの方法は使えるのではないでしょうか?
※なおこの方法は不特定の場所からログインをするような性質のサイトには向きませんのであしからず
一番簡単かつ一番確実にサイトへの不正ログイン対策を行う方法
多分ちらっと書いた「不特定の場所・・・」という一文でピーンと来た方もいることでしょう。その方法は管理画面やログイン画面へのアクセスを制限するというものです。
つまり、管理画面やログイン画面へのアクセスは家、会社など特定の場所からのみに限定するのです。ですから不特定の場所からログインするというサイトでは使えないということになります。
この設定を行うのに必要な環境や設定
変更や万が一の場合の復旧に備え、この設定を行うためには、以下の操作を行うスキルが必要です。
- FTPクライアントでサーバー内のファイル操作ができる
- サーバーのファイル操作をするためのサーバーログイン情報が確実に保存されている
最近のテーマにはこれから紹介する方法を管理画面から操作できるものもありますし、プラグインにもそうした機能を持つものがありますが、それらはWordPressのサイトへログインできたときはじめて操作できる機能ですから、万が一の時には全く役に立ちませんのでご注意ください。
不正ログイン対策で行うこと
具体的な不正ログイン対策を行う方法を紹介します。といってもこの項目が一番短いかも・・・。
前項の方法のいずれかでWordPressのインストールされている場所へアクセスします。
※インストールされている場所とは「index.php」ファイルや「wp-content」フォルダのあるところを言います。
「.htaccess」というファイルを見つけ、パソコンへダウンロードします
ダウンロードした「.htaccess」ファイルを開きます
※メモ帳でも大丈夫かと思いますが、できればterapadなど無料のものでもいいのでテキストエディタを推奨します
一番先頭に以下のコードを追記します
<FilesMatch "wp-login.php">
Order deny, allow
Deny from all
Allow from 〇〇〇.〇〇〇.〇〇〇.〇〇〇
</FilesMatch>
コードの中の〇〇〇.〇〇〇.〇〇〇.〇〇〇の部分へ実際にアクセスするIPアドレスを入力します
今管理画面を開いている場所のIPアドレスを調べるにはあなたが現在インターネットに接続しているグローバルIPアドレス確認へアクセスします(すぐに表示されますのでその通りに入力してください)
「.htaccess」ファイルを保存します
元の場所へ上書きアップロードします
これで、今管理画面を開いている場所以外から管理画面やログイン画面へのアクセスができなくなります。
ね、とっても簡単です。
管理画面を既に開いた状態でこの設定をし、その後サイトに何かを行う(投稿する、プラグインを追加するなどすべての操作)場合は、一旦ログアウトして再ログインしてからにしましょう(思わぬ不具合が出ることがあります)。
上のコードで500エラーが出るときは
サーバーによっては「FilesMatch」というコードが使えないものがあり、上記コードでエラーが出ることがあります。
そんなときは以下のコードを使うことできちんと動作するか試してみてください。
<Files wp-login.php>
order deny,allow
deny from all
allow from 自身のグローバルIP
</Files>
本当にログイン画面がアクセス拒否されるか?の確認方法
この方法を用いる場合は自宅や会社など普段アクセスする場所から設定することが多いですから、設定後、本当にアクセスできなくなってるの?と不安になりますよね?これを確認する方法は3つあります。
スマホなどからアクセスしてみる
Wifiをオフにして公衆回線(ていうのかな??)からアクセスするようにした上で、ログインページへアクセスしてみます。許可した拠点からのアクセスにはならないですから拒否されるはずです。
.htaccessファイルを編集する
先程設定した.htaccessファイルの追記内容。当然ながらアクセスできないと困るので自身のIPアドレスを〇〇〇.〇〇〇.〇〇〇.〇〇〇の部分に入れたと思います。
このIPアドレスを適当なもの(「1.1.1.1」でも大丈夫)にしてアクセスしてみれば、拒否されるかどうかの確認ができます。
複数の拠点からアクセス可能にするには
複数の方が管理画面へアクセスするサイトでは当然複数の拠点からのアクセスを許可する必要があります。
そんな場合はコードの中の
Allow from 〇〇〇.〇〇〇.〇〇〇.〇〇〇
の行を追加して、IPアドレスを入力すればいくつでも追加できます。
管理画面から簡単に変更する方法
いちいちサーバーで操作するのが面倒、FTPなんて知らんし(この記事読む人にそんな人はいないと・・・願う)という方はhtaccessファイルを管理画面上から編集できるプラグイン「WP Htaccess Editor」を使って管理画面から.htaccessファイルの操作を行うとよいでしょう。
ただし、以下の環境でこの方法を用いて万が一失敗すると、修正することが基本的に不可能となりますので注意してください。
- サーバー内で.htaccessファイルの編集ができない
- FTPでファイルの送受信が許可されていない(FTPが使えない)
ログイン画面がアクセス拒否されたら・・・
これを知ってて設定するのと知らずに設定するのは雲泥の差となります。
が、設定した部分も1つですから復旧も簡単・・・ですよね??
前項の設定で「.htaccess」ファイルに追記した部分を削除して元の場所へアップロードすれば、何事もなかったかのように元の状態に戻ります。
たったこれだけ?のことで、簡単に自分やログインする人(場所)以外からログインされる、管理画面にアクセスされるのを防ぐことができます。
個人サイトはもちろん、企業サイトで社内以外から操作させないようにしたい場合(特に退職者などが勝手にログインして改ざんしたりしないようにしたい場合)などにはもってこいの方法です。
・・・とはいえ、サイトを作っていた担当者などが退職した場合にはFTPの接続情報やサーバーへの接続情報は漏洩していて間違いないと思いますので、それらのパスワードの変更もしっかり行って、操作できる口を減らす措置はきちんと講じましょう。
おまけ パスワード保護した投稿や固定ページでパスワード入力後に403エラーで内容が見えないときは
今回のセキュリティとは全く関係ない(逆に関係ある?)ことなのですが、今まで紹介した内容でwp-login.phpへのアクセスを制限すると、未ログインユーザーがパスワード付の投稿や固定ページでパスワードを入力してページを閲覧しようとすると、403エラーが出て内容が見えないという現象が発生します。
いろいろ調べてみたのですが公式コーデックにもこの件について触れたものはありませんでした。
そして、普段ログインしている(ログインできる)環境から見ることが多い自身のサイトでこの現象は非常に発見しにくく、誰かから「ページが見れない」と言われて初めて気づく(その時にも自分はそのIPからのアクセスが許可されているので現象が出ないこともある)こととなります。
私も知り合いのサイトでその現象が出たけどどうにかならないか?と聞かれてこの現象が起こることを初めて知った次第です。
まあ何が作用しているのかは不明ですが、パスワード入力後にWordPressのログイン処理の何かが関連してパスワードが解除されるのは確かなようですから、上の方法では権限なし(403エラー)が出てしまうようです。
これを防ぐには、「.htaccess」に書いた制限事項を削除し、新たに「wp-admin」フォルダ内に「.htaccess」ファイルを作って
Order deny, allow
Deny from all
Allow from 〇〇〇.〇〇〇.〇〇〇.〇〇〇
</FilesMatch>
※コードの中の〇〇〇.〇〇〇.〇〇〇.〇〇〇の部分へ実際にアクセスするIPアドレスを入力します
を入れると解決できます。
この方法ではログイン画面(wp-login.php)へのアクセスはできるけど、たとえ正しいユーザー名とパスワードを入れても許可されたIPアドレスでなければ管理画面へアクセスできないという処理になります。
・・・そういえばサーバーの中にはWAFの設定でIPアドレス制限をかけるものがあったような記憶があるのですが、これはどうやって回避したらいいんでしょうね・・・私の思いつく限りではWAFをOFFにしてこの方法にするしかないのか・・というのが結論です。
おまけ2 サブディレクトリに入れたサイトは許可したい・・ときは
メインのWordPressサイトのファイル・フォルダがある場所に別のフォルダ(サブディレクトリと言います)を作って、さらに別のWordPressをインストールする・・・同じドメイン内でサイトをがっちり分けて作る場合によく使われる手法です。
この状況で、メインサイトの.htaccessに紹介したコードを入れると、サブディレクトリにもこの拒否設定が働き、指定したIP以外からはログインできないようになります。
そもそもこうした構造にするのは、メインサイトは自分だけが使うけど、サブディレクトリのサイトは会員制にしたい、登録した人が投稿できるようにしたいという目的での構築シーンが多いと思います。それがアクセス拒否されてしまうとちょっと困りますよね?
そこでサブディレクトリのサイトはアクセス拒否させないように、サブディレクトリにある.htaccessへ以下を追記します。
<FilesMatch "wp-login.php">
Order allow, deny
allow from all
</FilesMatch>
これでメインサイトの.htaccessに記述した拒否設定がクリアされ、どこからのアクセスでも許可されるようになります。
さらにセキュリティアップをするなら
ここまででログイン画面を開くことに対するアクセス制限は実装できました。
そして通常管理画面へ直接アクセスすると、ログイン状態が保持されている状態を除き、ログイン画面へリダイレクトされ、アクセス拒否されるので問題ないとは思うのですが、何等かの方法で管理画面へ直接アクセスされてしまう可能性があるかも知れません。
何らかの方法で管理画面への直接アクセスを防ぐには、wp-adminフォルダ(管理画面関係のファイルがあるフォルダ)へのアクセス制限を行います。
wp-adminフォルダ用の「.htaccess」ファイルを作る
ログインの制限のように、index.phpと同じ階層にある.htaccessでは制限ができませんので、wp-adminフォルダ内へ別の.htaccessファイルを作成・アップロードします。
アクセス制限を行うコードを記述する
アップロードした.htaccessファイルへ以下のコードを追加します。
Order deny,allow
Deny from all
Allow from 許可するIPアドレス
<FilesMatch "(admin-ajax.php)$">
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>
許可するIPアドレスの部分を書き換えてください
これで、特定のグローバルIPアドレスからログインが成功した時のみ管理画面が表示・操作できるようになります。
プラグインなどによってはadmin-ajax.phpというファイルを使うものがありますので、コードの後半では、admin-ajax.phpへの制限は除外する記述を追加しています
これを追加すれば、ログインも、管理画面も防御で完璧...と言いたいところですが、以下の点には注意しておく必要があるでしょう。
- ないとは思いますが、WordPressの更新で.htaccessファイルが作られ、上書きされてしまうことがあるかも知れない(そうなると無効になる)
- グローバルIPアドレスが変わった時に、ログイン側の制限は見直したものの、wp-adminフォルダ内の制限のことを失念して、「あれ?管理画面が開けない..」となることがある
確かにセキュリティ状態は上がるであろうと思われる設定ではありますが、上記の懸念があるため、私自身はログイン側の制限のみをかけるようにしています。
余談ですし、全く未検証ですが、管理画面へのアクセスを制限することで、フロントエンドからすべてを行う会員制サイトで、特定IPからのアクセスでなければ絶対に管理画面側へアクセスさせない!なんて使い方もできそうです(単純に使用アイディアですので、実装するときは十分テストを行ってください)。