Skip to content

サイト内にBasic認証を設定する

サイト内にBasic認証を設定する方法について解説しています。Basic認証設定後は、正しく動作しているか必ずご確認ください。

Basic認証とは

Basic認証はWeb上で利用できる認証方法のひとつです。
Basic認証が設定されているサイト(あるいはページ)にアクセスすると以下のようなダイアログが表示され、指定されたユーザー名(ID)とパスワードを入力しログインすることで、ページにアクセスできる仕組みです(画像はFirefoxでのBasic認証画面です)

FirefoxでのBasic認証画面

個人サイトではサイトの入り口や年齢制限のあるコンテンツなどでよく見かけるかと思います。Basic認証の設定には.htaccess.htpasswdというふたつのファイルを利用します。

Basic認証自体は非常に簡易な認証方法で、セキュリティレベルとしてはとても低いものです。そのため、あくまでも上記のような目的でBasic認証を利用することを推奨します。

Basic認証の設定方法

先述のとおり、Basic認証の設定には.htaccess.htpasswdというふたつのファイルを利用します。以下、それぞれのファイルの記述について解説しています。

.htaccessファイル

Basic認証を設置したいディレクトリに.htaccessファイルを作成します。すでに.htaccessファイルが存在する場合は、このファイルを編集します。

注意事項

サーバーの.htaccessファイルを編集する際は、.htaccessファイルがすでに存在している場合は必ずバックアップを取ってください。

また、レンタルサーバー(とくに無料のもの)によっては、.htaccessファイルが許可されていない場合があります。事前にレンタルサーバーのFAQなどで.htaccessファイルの使用可否をご確認ください。

Basic認証のコードは以下です。

apache
# Basic Authentication
AuthType Basic
AuthName "login..."
AuthUserFile /www/basic/.htpasswd
Require valid-user

#((シャープ)はコメントアウトの記述です。.htaccessファイルでは、コメントアウトの記述に#を利用します。

AuthType

認証方式を指定します。Basic認証の場合はBasicを指定します。

AuthName

認証領域を指定します。ブラウザによっては、ここに指定した文字列がダイアログに表示されます。指定する文字は任意のものを指定できますが、半角英数字で指定するのが無難です。

これを指定しておくことで、一度認証が通ったあと(ログインに成功したあと)、同じ認証領域の名前が設定されているBasic認証が必要なページにアクセスした際、認証が不要になります。

AuthUserFile

ログインするためのユーザー名とパスワードが書かれた.htpasswdファイルパスを指定します。サーバーのルートパスから指定します。

ルートパスはサーバーによって違います。一例として、さくらのレンタルサーバー(スタンダード)の場合は、/home/[ユーザーID]/wwwがルートパスになります。

ルートパスは通常は各サーバーのマニュアル等に記載されているかと思います。
PHPが利用可能な環境であれば、以下を記述したPHPファイルを作成し、サーバーにアップロードしてアクセスすることでPHPファイルを設置したディレクトリまでのパスを確認することも可能です(確認後は必ずファイルを削除してください)

php
<?php
  echo $_SERVER['DOCUMENT_ROOT'];
?>

Require

Basic認証を設定した領域にアクセスできるユーザーを指定します。
valid-userとすることで.htpasswdファイルに記述のあるすべてのユーザーからのログインを許可できます。

補足

Basic認証の設定にはAuthBasicProviderという項目も必要ですが、この値はデフォルトでfileとなっており、今回のように.htpasswdファイルを利用する場合は指定不要です。

ファイルをいったんPC上で作成する場合は、htaccess.txt(ファイル名は任意のものでOK)というテキストファイルで作成し、サーバーにファイルをアップロード後にファイル名を.htaccessと変更してください。.(ドット)からはじまるファイルは、PC上では存在するものの基本的に見た目上は表示されません。

.htpasswdファイル

Basic認証のユーザー名(ID)とパスワードを記載するファイルです。

ファイルに記載する文字列は以下のように指定します。

txt
ユーザー名:暗号化されたパスワード

ユーザー名とパスワードの間を半角の:(コロン)で繋ぎ、1行で記述します。1行記述するごとに改行して、複数のユーザー名とパスワードを指定することが可能です。
ユーザー名は半角英数字で指定します。また、-(ハイフン)も利用可能です。

パスワードはそのまま記載せず、必ず暗号化した文字列を記載します。

補足

Basic認証のパスワードをWeb上で暗号化するツールは検索するとたくさん出てきます。弊サイトでも公開しているので、よければご利用ください。

.htpasswdファイルは、必ずしもBasic認証を設定するディレクトリ内に設置する必要はありません。サーバー上のWebサイトが表示される領域内(サーバーによって/www/public_htmlなど)であれば、どこにアップロードしてもOKです。ただ、同じ場所にあるとわかりやすいと思います。
先述の.htaccessファイル内AuthUserFileの項目でファイルパスを指定します。

また、.htaccessファイル同様ファイルをいったんPC上で作成する場合は、htpasswd.txt(ファイル名は任意のものでOK)というテキストファイルで作成し、サーバーにファイルをアップロード後にファイル名を.htpasswdと変更してください。

応用:特定のIPアドレス以外のアクセスに対してBasic認証を設定する

利用例として、サイトに設置しているBasic認証で、自分のIPアドレスからのアクセスはBasic認証をスキップすることが可能になります。

Apacheのバージョンについて

Apacheには2.2系と2.4系があり、アクセス制限系はそれぞれ記述が異なります。現在ではほぼ大多数のサーバーが2.4系が動いているかと思いますが、各サーバーのApacheバージョンは事前にご確認ください。2.4系でも2.2系の記述は有効なので、バージョンが分からなければ2.2系で記述するのが無難です。

Apache 2.2系での記述

apache
AuthType Basic
AuthName "login..."
AuthUserFile /www/basic/.htpasswd
Require valid-user

Satisfy Any
Order Allow,Deny

allow from [IPアドレス]

以下が追加の部分です。

apache
Satisfy Any
Order Allow,Deny

allow from [IPアドレス]

SatisfyはApacheの設定のひとつで、「複数のアクセス条件の組み合わせ判断」を指定します。主に今回のように「認証」と「アクセス制御」を同時に扱う場合に利用します。

Satisfy Anyは「複数の認証あるいはアクセス制御条件のうち、どれか1つでも満たせばアクセスを許可する」というものです。この場合の条件は、「Basic認証を通る」か「許可されたIPアドレスであるか」です。
(すべての条件を満たす必要があるSatisfy Allという書き方もあります)

Satisfy Any(またはSatisfy All)を使用する場合は、Order Allow,Denyもセットで記述します。Order Allow,Denyでいったん「すべてのアクセスを拒否」した上で、Allow from [IPアドレス]で指定したIPアドレスのみ接続を許可します。

Allow from [IPアドレス]は複数指定が可能です。

apache
Satisfy Any
Order Allow,Deny

Allow from [IPアドレス]
Allow from [IPアドレス]
.
.
.

Apache 2.4系での記述

Apache2.4系の場合は、Satisfy Anyの代わりにRequireAnyを使用します。

apache
<RequireAny>
  AuthType Basic
  AuthName "login..."
  AuthUserFile /www/basic/.htpasswd
  Require valid-user
  Require ip [IPアドレス]
</RequireAny>

以下が追加の部分です。

apache
<RequireAny>
  #(省略)
  Require ip [IPアドレス]
</RequireAny>

Basic認証の記述を<RequireAny></RequireAny>で囲みます。RequireAnyの囲みの中で、許可するIPアドレスをRequire ip [IPアドレス]として記述します。
Require ip [IPアドレス]も複数指定が可能です。

apache
<RequireAny>
  #(省略)
  Require ip [IPアドレス]
  Require ip [IPアドレス]
  .
  .
  .
</RequireAny>

応用:Basic認証を設定しているディレクトリ内で、特定のディレクトリのみBasic認証を外す

Basic認証を外したいディレクトリに.htaccessファイルを設置し、以下を記述します。

Apache 2.2系での記述

apache
Satisfy any
Order Allow,Deny
Allow from all

ここで記述しているSatisfy anyの条件も、「Basic認証を通る」か「許可されたIPアドレスであるか」です。Basic認証の記述は、親ディレクトリの.htaccessファイルに記述しているものが引き継がれます。

この場合もOrder Allow,Denyをセットで記述します。いったん「すべてのアクセスを拒否」した上で、Allow from allですべてのIPアドレス、ホストからの接続を許可します。

Apache 2.4系での記述

Apache2.4系の場合は、Satisfy Anyの代わりにRequireAnyを使用します。

apache
<RequireAny>
  Require all granted
</RequireAny>

Require all grantedですべてのIPアドレス、ホストからの接続を許可します。

エラー事例:.htaccessファイルを設定後、該当ページにアクセスするとInternal Server Error(500エラー)になる

.htaccessファイルのBasic認証の記述が正しいか確認してください。とくにAuthUserFile項目で.htpasswdファイルのパス指定に問題があることが多いです。
稀に改行の文字コードがおかしいということもあるようです。


本記事の解説は以上です。

補足

Basic認証の設定方法についてもうすこし詳しく知りたい場合、すこし専門的になりますが、以下のサイトもご参考ください。

ApacheはHTTPサーバー(Webサーバー)を動かすためのミドルウェアのことで、Basic認証もこのApache上で動作しています。上記サイトは日本語訳が古くなっている可能性があるとのことですが、Basic認証の概要を知るにはいまでもじゅうぶん有用かと思います。