WordPressの海外IPアクセス制限は解除するだけではNG!速度低下とセキュリティ危険性 の記事で、WordPressのログイン画面とダッシュボードに一定のアクセス制限をかけることが重要である、とお話をしました。
ログイン画面およびダッシュボードに何もアクセス制限をかけない状態だと、ブルートフォースアタック(総当たり攻撃)の被害にあったときに、ハッキングされる危険性とサイトパフォーマンスの低下によってサイト表示速度が低下してしまう恐れがあるためです。
近年、SEOでもサイト表示速度を含むUXが重要視されるようになってきており、このようなパフォーマンスの低下は検索順位にも少なからぬ悪影響を与えてしまいます。
そこで本記事では、海外アクセス制限を解除した際の代替セキュリティ対策などで用いられる、WordPressのログイン画面およびダッシュボードにBASIC認証を設置してアクセス制限を実施する具体的な方法をお伝えいたします。
目次
BASIC認証でwp-login.phpファイルとwp-adminディレクトリ以下を制限
WordPressにおいて、ログインするためのURL(ログイン画面が生成されるURL)は3つ。
- URL/wp-login.php
- URL/login (wp-login.phpにリダイレクト)
- URL/wp-admin
実質的にはwp-login.phpファイルとwp-adminディレクトリがログインに関するファイル・ディレクトリとなります。そのため、この両方にアクセス制限をかける必要があります。
よく"wp-adminディレクトリにBASIC認証をかければセキュリティ対策になる"としている記事を見かけますが、これだと/wp-login.phpまたは/loginにアクセスした際にログイン画面へたどりつけてしまうため、wp-adminのみへの制限だと不十分です。
wp-adminとwp-login.phpの両方にアクセス制限をかけるようにしましょう。
単一の.htaccessファイルで特定のディレクトリと特定のファイルを同時に指定するのは難しそう
wp-login.phpは初期状態ではWordPressインストールディレクトリに設置してあるため、なんとかインストールディレクトリの.htaccess1本でwp-login.php(ファイル)とwp-admin(直下ディレクトリ)を制御しようとしましたが、どうやら難しい様子。
というのも、.htaccessファイルではDirectoryディレクティブが使えず、ディレクトリの指定が難しいとのこと。
またURI指定のLocationディレクティブも使えず、方法としてはSetEnvIfを利用しての対処となるようです。
参考: .htaccess の書き方(アクセス制御編) Qiita
参考: 「Directory」, 「Location」 が.htaccessでは使えない | ex1-lab
他の制御方法として、たとえば任意のディレクトリやファイルをBASIC認証から除外するという方法もあるとのこと。
参考: 特定のディレクトリやファイルをBASIC認証から除外する SAKI Web Design
ただ上記、なかなか大変そうということもあり、特にこだわりがないのであれば.htaccessを2つ設置することで解決はできそうです。(あまりカッコよくはないですが。また後述しますが運用面でのカバーは必要です)
1つはwpインストールディレクトリに設置してwp-login.phpのみをファイル指定でBASIC認証。
もう1つはwp-adminディレクトリに設置して、wp-adminディレクトリ以下にBASIC認証をかけます。
下記のサイトでも同様の手段で、異なる2つの階層にそれぞれ.htaccessを設置し、wp-login.phpファイルとwp-adminフォルダにBASIC認証をかける方法が紹介されていました。
WordPressの管理画面のセキュリティ対策にBASIC認証を設定しよう | 株式会社ベクトル
wp-login.phpファイル、wp-adminフォルダをアクセス制限する。 WordPress運用支援センター
ユーザーの方には基本的にはログイン時URLとしてwp-login.phpまたはURL/loginを指定していただき、wp-adminはログイン用URLとしては非推奨、という運用でカバーする方針としました。
wp-adminのBASIC認証のあと、さらにwp-login.phpのBASIC認証となり、2回ログインを行うことが必要となってしまうためです。
2つの.htaccessファイルを作成して、それぞれでBASIC認証をかける
そもそものhtaccessファイルの作り方は下の記事で紹介しています。.htaccessファイル作成時に必要となるサーバーパスの調べ方についても說明。
Basic認証が効かない5パターンの対処と.htacessファイル作成方法 | まほウェブ
BASIC認証の際に引っかかりやすい5つのポイントなど記述していますので、ぜひ合わせてお読みください。
wp-login.phpに対してBASIC認証を設定
まずはWordPressインストールディレクトリにある、wp-login.phpに対してBASIC認証を設定します。
まず、BASIC認証で使用するパスワードファイル = .htpasswdを生成します。下記ジェネレーターなどでハッシュ化させた形で生成すると良いでしょう。
htpasswdジェネレータ htaccess パスワード用 MD5 ハッシュ計算 生成した.htpasswdファイルをWordPressのインストールディレクトリ(wp-login.phpがある階層)に設置します。
次に.htaccessに記述を加えます。WordPressの仕様により、ほとんどのケースで既にインストールディレクトリ上に.htaccessが生成されていると思いますので、既にある.htaccessに下記の記述を追加します。
<Files wp-login.php>
AuthType Basic
AuthUserFile サーバーパス/.htpasswd
AuthName "Please enter your ID and password"
Require valid-user
</Files>
既にある.htaccessに追加する際は、 #BEGIN WordPressよりも上に記述をするようにしましょう。
#BEGIN WordPress以下に記述を加えてしまうと、アップデートの際などに記述が消えてしまう可能性があります。
.htaccessの記述が完了したら、wp-login.phpに対するBASIC認証は完了です。ログイン動作テストを行ってみましょう。
wp-admin以下にBASIC認証を設定
次に、同様にしてwp-admin以下にもBASIC認証を設定します。
上記と同様にして手動で.htaccessファイルを記述しても良いのですが、フォルダ全体にBASIC認証をかける場合には、多くのレンタルサーバーの場合、サーバー管理パネル上でのBASIC認証機能を利用することができます。
たとえばエックスサーバーの場合はこちら。アクセス制限(BASIC認証) | レンタルサーバーならエックスサーバー
手動で.htaccessファイルを生成する場合には、wp-login.phpの場合と同様に.htpasswdファイルを生成した後、wp-adminディレクトリ直下に下記.htaccessファイルを作成します。
AuthType Basic
AuthUserFile /*サーバーのパス*/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
Require valid-user
<FilesMatch "(admin-ajax.php)$">
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>
上記ソースコード引用元: WordPressの管理画面のセキュリティ対策にBASIC認証を設定しよう | 株式会社ベクトル
<FilesMatch 〜 の箇所では、wp-adminフォルダ以下で行われるAjax通信を許可(admin-ajax.phpファイルを除外)する設定が記述されています。
IPアドレスでwp-login.phpとwp-adminディレクトリ以下(WordPress管理画面)にアクセス制限をかける方法
上記まで、メディアサイトなど、社外からの多数の投稿者がいるシーンを想定して簡易的なアクセス制限であるBASIC認証の方法をご紹介させていただきました。
より確実なアクセス制限の手法として、BASIC認証ではなくIPアドレスでアクセス制限をかける方法があります。
以下、WordPress管理画面にIPアドレス制限をかける方法(.htaccess) から引用させていただきます。下記手法が利用できないシーンなど詳細の記載がありますので、ぜひ一度引用元サイトもご確認ください。
–引用ここから —
WordPress では、WordPress の設置ディレクトリに .htaccess ファイルが存在します。 ですので .htaccess にIPアドレス制限の記述を追記してあげれば良いでしょう。 <FilesMatch> ディレクティブで管理画面の URL と一致するページにIPアドレスによる制限をかけています。
<FilesMatch "wp-login.php|wp-admin">
Order deny allow
Deny from all
Allow from xxx.xxx.xxx.xxx
</FilesMatch>
アクセスされた URL に「wp-login.php」もしくは「wp-admin」という文字列を含んでいる場合に、このIPアドレス制限が発動するような設定です。 xxx.xxx.xxx.xxx の部分には、アクセスを許可したいIPアドレスを指定してください。 これで管理画面へアクセスできるIPアドレスが限定できます。
–引用ここまで —
.htaccessのパーミッションは604か606。パーマリンク設定を利用する場合も多いと思うので、個人的には606でOKと思います。
「.htaccess」ファイルが書き換えられてしまう事例が多発していますので、パーミッション設定は必須です。パーマリンクの設定が出来るようにするには「606」にします。
WordPressで推奨されるパーミッション設定について 株式会社ネディア │ネットワークの明日を創る。
.htaccessにディレクトリ一覧の非表示設定も記述
今回.htaccessファイルの作成、編集をしました。この機会に下記Optionの設定もしておきましょう。セキュリティ性が向上します。
(ただし、WordPressの場合にはもともとディレクトリ一覧が表示されることはないとの情報もあります。そのため必須ではないかもしれません。)
またサーバーによってOptionsの設定ができない場合もあるので、無理に設定することはないかもしれません。エックスサーバーの場合は500エラーとなり、設定できないようでした。
.htaccessにOption -Indexesと記述をして、ディレクトリ一覧が表示されないように設定します。
Apacheなら「.htaccess」に下記を記述して、ディレクトリ一覧を非表示にします。レンタルサーバーの設定によっては、「index.html」などがないディレクトリはファイルが一覧で表示されるため、下記を記述する。
Options –Indexes
※上述したOptionsを使用できるかは、サーバーの設定により異なります。
引用元: 【WP】WordPressの基本的なセキュリティ対策 Qiita
パーミッション変更・アクセス制限設定後には動作確認テストを行う
ファイル・ディレクトリのパーミッション変更やアクセス制限を実施した際には、下記の動作確認テストをセットで行うようにしましょう。
サーバーの環境によりパーミッション変更後に不具合が出る可能性がありますので、変更後は最低限下記の動作確認をしておくと安心です。
・WordPress管理画面へのログイン
・記事の投稿及び画像のアップロード
・プラグインの追加と削除
・テーマの変更
Leave a Reply