WordPressの管理画面にアクセス制限を設定する

国外からWordPressにアクセス場合は、エックスサーバーのダッシュボード アクセス制限「OFF(無効)」にする必要があります。

しかし、ダッシュボード アクセス制限「OFF(無効)」にすると、海外からのアタックが容易になってしまします。

これらのアタックを制限するために、エックスサーバーでは個別にIPアドレス制限やBasic認証を設定することが推奨されています。

アクセスが制限される場所
  • /wp-admin … ダッシュボード のフォルダ
  • /wp-login.php … ダッシュボード ログイン時にアクセスするファイル

IPアドレス制限は、カフェやコワーキングスペースで作業する場合にIPアドレスを固定させるのが難しくなります。
「オフィスでしか作業しない」「絶対に家のPCで作用する」というのが確実でない場合は有効な方法とは言えないでしょう。

では、実際どのように設定すればよいのかみていきましょう。

Basic認証をかける

エックスサーバーには、アクセス制限を設定する項目があります。

この設定で、指定したディレクトリに対してベーシック認証をかけることができます。
ただし、ディレクトリに対してベーシック認証をかけるので、/wp-login.php にもベーシック認証をかけるには、.htaccessの編集が必要となります。

また、wp-adminフォルダの配下にある admin-ajax.php はアクセスを許可する必要があるので、こちらも.htaccessへの記述が必要になります。

admin-ajax.php のアクセスを許可する理由

テーマやプラグインが Ajax と呼ばれる非同期通信を使用している場合があるため、「wp-admin」配下にある admin-ajax.php に対してはアクセス制限を適用しないように設定する必要がある

それでは、手順をみていきましょう。

STEP
「wp-admin」のアクセス制限をONにする

エックスサーバーのアクセス制限設定から、「wp-admin」のアクセス制限をONにします。
アクセスできるユーザー設定をしていない場合は、ユーザーの設定・追加をおこなっておきましょう。

これで、wp-adminフォルダにBasic認証がかかりました。

STEP
.htpasswd の内容を確認

「アクセス制限」の設定を行うこと、.htpasswd が生成されます。
「ドメイン名」フォルダの配下に生成された「htpasswd」フォルダにあります。

/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd

.htpasswd を開くと、暗号化されたパスワードが確認できます。

ユーザーID:暗号化したパスワード

STEP
admin-ajax.php は認証なしでアクセスできるようにする

「wp-admin」配下の .htaccess 確認すると、以下のような内容が書かれています。

AuthUserFile “/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd”
AuthName “Member Site”
AuthType BASIC
require valid-user

この記述は別の .htaccess に張り付けるので、コピーしておきましょう。

ここに、以下の内容を追記し、admin-ajax.php は認証なしでアクセスできるように設定します。

<FilesMatch "(admin-ajax.php)$">
    Satisfy Any
    Order allow,deny
    Allow from all
    Deny from none
</FilesMatch>

こんな感じになります。

「AuthUserFile」は、パスワードファイルのフルパスになります

AuthUserFile “/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd”

STEP
wp-login.php にBASIC認証をかける

「public_html」配下の .htaccessを編集して、wp-login.php にBASIC認証をかけます。

「public_html」配下の .htaccess にはいろいろ記述が入っています。
記述した内容に誤りがあるとサイトが表示できなくなることもあるので、編集前に必ずダウンロードしてバックアップを取っておきましょう。

先ほどコピーしておいた、BASIC認証の記述を<Files wp-login.php></Files>で囲み、「public_html」配下の .htaccessのいちばん最初に追記します。

<Files wp-login.php>
AuthUserFile “/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd”
AuthName “Member Site”
AuthType BASIC
require valid-user
Satisfy Any Order allow,deny Allow from all Deny from none
</Files>

こんな感じです。

STEP
管理画面のログインURLにアクセスして動作確認

WordPressのログイン画面を表示する以下2つのURLにアクセスして、ベーシック認証がかけられているか確認しましょう。

  • サイトURL/wp-admin/
  • サイトURL/wp-login.php

アクセス制限で設定したユーザー名とパスワードを入力すると、WordPressのログイン画面が表示されます。

BASIC認証が有効な理由

ログインURLを変更してもログイン画面は表示できる

ログインURLを変更するという手法もありますが、
サイトURL/wp-admin/
にアクセスしたら結局ログイン画面が表示されてしまうようです。

サーバーに負荷がかからない

ブルートフォースアタックはユーザーとパスワードを何回もサーバーにリクエストします。
大量のリクエストが来ると、データベースにも負荷がかかってしまいます。

BASIC認証はログイン画面を表示する時点で認証画面を出して一度ブロックし、BASIC認証のユーザーID及びパスワードの送信はデータベースには送信されないので、サーバーの負荷が軽減されると考えられます。

参考にしたサイト

ログインURLを変更して対応する場合

ここでは、functions.phpに記述する方法をメモしておきます。

STEP
新しいログイン用ファイルを作成

wp-login.phpと同じ場所に、新しいログイン用ファイルとしてwp-login-anyword.phpを作成

<?php
define( 'LOGIN_CHANGE', sha1( '「任意のキーワード」を入力' ) );
require_once './wp-login.php';
?>
  • 新しいログインファイル名はなんでもOKですが、セキュリティ対策で変更しているので予測されないものにしましょう。
  • 新しいログインURLを忘れてしまうとログイン画面にアクセスできなくなるので、覚えられるものにしておきましょう。
STEP
functions.phpの編集

functions.phpに下記のコードを追記
新しいログインファイル名「任意のキーワード」の2か所を、STEP1で設定したものに書き換える

# ログイン画面へのURLを変更する
define( 'LOGIN_CHANGE_PAGE', 'wp-login-anyword.php(拡張子がphpの新しいログインファイル名)' );
# オリジナルのログインURL以外は403エラー
if ( ! function_exists( 'login_change_init' ) ) {
    function wp_login_url_403_error() {
        if ( !defined( 'LOGIN_CHANGE' ) || sha1( '「任意のキーワード」を入力' ) != LOGIN_CHANGE ) {
			status_header( 403 );
          exit;
        }
    }
}
add_action( 'login_init', 'wp_login_url_403_error' );
# ログイン済みか新規作成したログインURLの場合はwp-login.phpを置き換える
if ( ! function_exists( 'login_change_site_url' ) ) {
    function wp_login_change_site_url( $url, $path, $orig_scheme, $blog_id ) {
        # ログイン画面、ログイン画面を用いた処理の画面名をリプレイス
        if ( ( $path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path ) ) &&
            ( is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], LOGIN_CHANGE_PAGE ) !== false ) )
            $url = str_replace( 'wp-login.php', LOGIN_CHANGE_PAGE, $url );
        return $url;
    }
}
add_filter( 'site_url', 'wp_login_change_site_url', 10, 4 );
# ログアウト時のリダイレクト先の設定
if ( ! function_exists( 'login_change_wp_redirect' ) ) {
    function wp_logout_redirect_setting( $location, $status ) {
        if ( strpos( $_SERVER['REQUEST_URI'], LOGIN_CHANGE_PAGE ) !== false )
            $location = str_replace( 'wp-login.php', LOGIN_CHANGE_PAGE, $location );
        return $location;
    }
}
add_filter( 'wp_redirect', 'wp_logout_redirect_setting', 10, 2 );
STEP
ログイン・ログアウトを確認

新しいログインURLにアクセスして、ログイン・ログアウトの動作確認

以下の参考サイトでは、.htaccessに記述する方法も紹介されています。

参考にしたサイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人