国外からWordPressにアクセス場合は、エックスサーバーのダッシュボード アクセス制限を「OFF(無効)」にする必要があります。
しかし、ダッシュボード アクセス制限を「OFF(無効)」にすると、海外からのアタックが容易になってしまします。
これらのアタックを制限するために、エックスサーバーでは個別にIPアドレス制限やBasic認証を設定することが推奨されています。
- /wp-admin … ダッシュボード のフォルダ
- /wp-login.php … ダッシュボード ログイン時にアクセスするファイル
IPアドレス制限は、カフェやコワーキングスペースで作業する場合にIPアドレスを固定させるのが難しくなります。
「オフィスでしか作業しない」「絶対に家のPCで作用する」というのが確実でない場合は有効な方法とは言えないでしょう。
では、実際どのように設定すればよいのかみていきましょう。
Basic認証をかける
エックスサーバーには、アクセス制限を設定する項目があります。
この設定で、指定したディレクトリに対してベーシック認証をかけることができます。
ただし、ディレクトリに対してベーシック認証をかけるので、/wp-login.php にもベーシック認証をかけるには、.htaccessの編集が必要となります。
また、wp-adminフォルダの配下にある admin-ajax.php はアクセスを許可する必要があるので、こちらも.htaccessへの記述が必要になります。
テーマやプラグインが Ajax と呼ばれる非同期通信を使用している場合があるため、「wp-admin」配下にある admin-ajax.php に対してはアクセス制限を適用しないように設定する必要がある
それでは、手順をみていきましょう。
エックスサーバーのアクセス制限設定から、「wp-admin」のアクセス制限をONにします。
アクセスできるユーザー設定をしていない場合は、ユーザーの設定・追加をおこなっておきましょう。
これで、wp-adminフォルダにBasic認証がかかりました。
「アクセス制限」の設定を行うこと、.htpasswd が生成されます。
「ドメイン名」フォルダの配下に生成された「htpasswd」フォルダにあります。
/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd
.htpasswd を開くと、暗号化されたパスワードが確認できます。
ユーザーID:暗号化したパスワード
「wp-admin」配下の .htaccess 確認すると、以下のような内容が書かれています。
AuthUserFile “/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd”
AuthName “Member Site”
AuthType BASIC
require valid-user
ここに、以下の内容を追記し、admin-ajax.php は認証なしでアクセスできるように設定します。
<FilesMatch "(admin-ajax.php)$">
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>
こんな感じになります。
AuthUserFile “/home/サーバーID/ドメイン名/htpasswd/wp-admin/.htpasswd”
「public_html」配下の .htaccessを編集して、wp-login.php にBASIC認証をかけます。
先ほどコピーしておいた、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>
こんな感じです。
WordPressのログイン画面を表示する以下2つのURLにアクセスして、ベーシック認証がかけられているか確認しましょう。
- サイトURL/wp-admin/
- サイトURL/wp-login.php
アクセス制限で設定したユーザー名とパスワードを入力すると、WordPressのログイン画面が表示されます。
BASIC認証が有効な理由
ログインURLを変更してもログイン画面は表示できる
ログインURLを変更するという手法もありますが、
サイトURL/wp-admin/
にアクセスしたら結局ログイン画面が表示されてしまうようです。
サーバーに負荷がかからない
ブルートフォースアタックはユーザーとパスワードを何回もサーバーにリクエストします。
大量のリクエストが来ると、データベースにも負荷がかかってしまいます。
BASIC認証はログイン画面を表示する時点で認証画面を出して一度ブロックし、BASIC認証のユーザーID及びパスワードの送信はデータベースには送信されないので、サーバーの負荷が軽減されると考えられます。
参考にしたサイト
ログインURLを変更して対応する場合
ここでは、functions.phpに記述する方法をメモしておきます。
wp-login.phpと同じ場所に、新しいログイン用ファイルとしてwp-login-anyword.php
を作成
<?php
define( 'LOGIN_CHANGE', sha1( '「任意のキーワード」を入力' ) );
require_once './wp-login.php';
?>
- 新しいログインファイル名はなんでもOKですが、セキュリティ対策で変更しているので予測されないものにしましょう。
- 新しいログインURLを忘れてしまうとログイン画面にアクセスできなくなるので、覚えられるものにしておきましょう。
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 );
新しいログインURLにアクセスして、ログイン・ログアウトの動作確認
以下の参考サイトでは、.htaccessに記述する方法も紹介されています。
参考にしたサイト