コンテンツにスキップ

WordPress で .htaccess を使って Basic 認証をかける方法

メインイメージ

WordPress サイトで Apache の設定ファイル .htaccess を使って Basic 認証をかける方法について説明します。

Basic 認証をかける方法はいくつかありますが、今回ご紹介するのは SSH でサーバーに接続して作業する方法です。 サーバーによっては SSH を使わなくてもサーバーパネルなどから Basic 認証をかけることができるものもあるため、 SSH にあまり慣れていない方にはそちらの方法をおすすめします。

ちなみに、 WordPress のプラグインで Basic 認証ができるものもあります。 今回ご紹介する方法はプラグインなしでできるので、利用するプラグインの数を増やしたくない場合などにおすすめです。

Basic 認証とは?

Basic 認証( Basic Authentication )は HTTP プロトコルを使用したシンプルな認証方式です。 ウェブページやファイルなどウェブ上のリソースにアクセス制限をかけるために使用されます。

Chrome の Basic 認証ダイアログ

Basic 認証が機能する大まかな流れは次のとおりです。

  1. ユーザーがリソースにアクセスしようとすると、サーバーは HTTP ステータスコード 401 Unauthorized と WWW-Authenticate ヘッダーを返し、認証が必要であることを伝えます。
  2. 401 レスポンスを受け取ったブラウザは次のようなユーザー名とパスワードを入力するダイアログを表示してユーザーに入力を促します。
  3. ユーザーがユーザー名とパスワードを入力すると、そのデータが Base64 エンコードされてサーバーに送信されます。
  4. サーバーは受け取った情報をデコードして、ユーザー名とパスワードの組み合わせが正しい場合はリソースへのアクセスを許可します。間違っている場合は Unauthorized のレスポンスを返します。

Unauthorized: Basic 認証でユーザー名・パスワードが間違っている場合の表示

ちなみに、ユーザーが入力したユーザー名とパスワードは HTTP リクエストの Authorization というヘッダーで次の形で送信されます。

Authorization: Basic (ユーザー名:パスワードの Base64 エンコード)

例えば、ユーザー名が user でパスワードが password の場合は次のようになります。

Authorization: Basic dXNlcjpwYXNzd29yZA==

Danger

Base64 エンコードされた文字列はかんたんにデコード可能なので、データが通信路上を平文で流れる http:// の通信で使うのは安全ではありません。 Basic 認証は https:// の通信のみで使うようにしてください。

確認時のバージョン

  • WordPress 6.6.1
  • Apache 2.4.61 (Debian)

WordPress サイトで .htaccess を使って Basic 認証をかける方法

たった 2 ステップで設定できます。

1. パスワードファイルを作成

最初にパスワードファイルを作成します。 作成には htpasswd コマンドを使います。

$ htpasswd -c .htpassword username
New password:
Re-type new password:
Adding password for user username

引数( username の部分)には Basic 認証で設定したいユーザー名を渡します。 オプション -c は新しいファイルを作成するためのものです。 ファイルパスを指定します。

上のコマンドを実行してパスワードを 2 回入力するカレントディレクトリに .htpassword というファイルが次のような内容で作成されます。

username:$apr1$9ru4mcHC$DzfO6cXPHYW43nTBG9djg0

1 つの行に ユーザー名:パスワードのハッシュ という形でユーザー名とパスワードが格納されています。

なお、ユーザーを追加したい場合は次のように -c オプションをつけずに実行すれば OK です。

$ htpasswd .htpassword username2

1 行 1 ユーザーという形で対象のファイル(この場合は .htpassword )に追加されます。

生成されたファイル( .htpassword )はウェブ上から閲覧できてしまうとセキュリティ上問題があるので、必ずウェブ上から閲覧できないように設置してください。 DocumentRoot の外に置くことが望ましいです。

2. .htaccess に Basic 認証の設定を追加

パスワードファイルが作成できたら、 Basic 認証をかけるための記述を .htaccess の先頭に追加します。

AuthType Basic
AuthName "Restricted Area"
AuthUserFile 作成した .htpassword ファイルへのフルパス
Require valid-user

AuthUserFile の値には作成したパスワードファイルへのフルパスを指定してください。 例えば、 .htpassword ファイルが /etc/apache2/.htpassword に置かれている場合の記述は次のようになります。

AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/apache2/.htpassword
Require valid-user

これで設定は完了です。

設定が完了したら必ず手元のブラウザでサイトにアクセスして、 Basic 認証が期待したとおりに機能しているか確認してください。

Note

WordPress サイトをリセットしたり再インストールしたりすると、 .htaccess ファイルが上書きされてしまう場合もあります。 そのような作業を行ったときは Basic 認証が外れていないか確認するようにしてください。

Basic 認証をかける範囲のサンプル

Basic 認証をかけたい範囲によって記述方法は調整してください。 どの場合でも AuthType Basic から Require valid-user までの行は共通です。

A. サイト全体にかけたい場合

WordPress インストールディレクトリ直下の .htaccess ファイルに次の記述を追加します。

AuthType Basic
AuthName "Restricted Area"
AuthUserFile パスワードファイルのフルパス
Require valid-user

B. ログインページだけにかけたい場合

WordPress インストールディレクトリ直下の .htaccess ファイルに次の記述を追加します。

<Files "wp-login.php">
  AuthType Basic
  AuthName "Restricted Area"
  AuthUserFile パスワードファイルのフルパス
  Require valid-user
</Files>

C. 特定の固定ページだけにかけたい場合

例えば、パスが /sample-page のページだけに Basic 認証をかけるには、 WordPress インストールディレクトリ直下の .htaccess ファイルに次の記述を追加します。

<Files "sample-page">
  AuthType Basic
  AuthName "Restricted Area"
  AuthUserFile パスワードファイルのフルパス
  Require valid-user
</Files>

D. 特定の投稿ページだけにかけたい場合

例えば、パスが /2024/09/05/hello-world/ のページだけに Basic 認証をかけるには、 WordPress インストールディレクトリ直下の .htaccess ファイルに次の記述を追加します。

<If "%{REQUEST_URI} =~ m#^/2024/09/05/hello-world/?$#">
  AuthType Basic
  AuthName "Restricted Area"
  AuthUserFile /var/www/html/.htpassword
  Require valid-user
</If>

正規表現を少しでも間違うと正しく機能しないので入念にチェックをしてから使うようにしてください。

設定した Basic 認証を解除する方法

Basic 認証を解除する方法についてです。

ここで「解除」というと、サーバー側でアクセス制限を解除する方法と、ブラウザ(クライアント)側で記憶したユーザー名・パスワードを解除する方法の 2 通りに考えられるのでそれぞれ説明します。

サーバー側で Basic 認証のアクセス制限を解除する

.htaccess に追加した、 AuthType から始まる一連の設定行を削除またはコメントアウトしてください。 コメントアウトは先頭に # をつければ OK です。

# コメントアウトして Basic 認証を無効化する:
# AuthType Basic
# AuthName "Restricted Area"
# AuthUserFile 作成した .htpassword ファイルへのフルパス
# Require valid-user

ブラウザ側で記憶した Basic 認証のユーザー名・パスワードを解除する

最も手っ取り早いのはブラウザを再起動する方法です。 ブラウザを再起動して同じページにアクセスすると再度 Basic 認証のユーザー名・パスワードの入力が求められます。

何らかの理由でブラウザの再起動をしたくない場合は、 random など何でもよいので仮のユーザー名を含めた URL をアドレスバーに入力してリクエストをかけます。

https://random@example.com

Basic 認証のダイアログが表示されるようになるので、一度 Escape キーで Unauthorized のページを表示してから再度元々の https://example.com にアクセスし直せば OK です。

Unauthorized: Basic 認証でユーザー名・パスワードが間違っている場合の表示

Basic 認証のセキュリティ上どのくらい有効か?

Basic 認証はシンプルで簡易なアクセス制御方法なので、そのセキュリティ上の効果は限定的です。

例えば、 1 台の一般的なスペックのパソコンさえあれば、 Basic 認証を突破するための試行を秒間 100 回ぐらいのペースでかんたんに行えます。 数時間ほど続ければ 100 万通りぐらいのパターンを試すことができるため、 admin:qwerty のようなシンプルなパスワードだと突破できてしまいます。 そのため、 Basic 認証ではある程度長くて複雑なユーザー名・パスワードを使わないと十分な効果がありません。

また、 Basic 認証の Authorization ヘッダーは Base64 エンコードされただけの状態で毎リクエストで送信されます。 そのため、サイト全体が https:// でも一部に http:// の URL が紛れ込んでいるとそこで Authorization ヘッダーに記載されたユーザー名・パスワードが漏れてしまうリスクなどもあります。

管理画面やログインページのセキュリティを改善したい場合は、 Basic 認証だけを行うのではなく、 reCAPTCHA 検証やブルートフォース対策を別途行い、 Basic 認証は「プラスアルファの対策」という位置付けで行うのがよいかと思います。

参考

関連ページ