Basic認証(ベーシック認証) は、URLにアクセスしたときにIDとパスワードの入力を求めるアクセス制限の方法です。Apacheサーバーでは .htaccess と .htpasswd ファイルで設定できます。
用途
Basic認証が特に役立つシーンを確認しておきましょう。
- 公開前のWebサイト・ステージング環境へのアクセス制限
- 管理者専用ページの保護
- 特定メンバーだけ閲覧できるコンテンツの制限
設定ファイルの構成
Basic認証は .htaccess と .htpasswd の2ファイルで構成され、それぞれの役割を理解しておく必要があります。
/var/www/html/ ← Webルートディレクトリ
├── .htaccess ← 認証設定(アクセス制限をかけるディレクトリに置く)
└── .htpasswd ← ユーザー名とハッシュ化パスワードの一覧
.htpasswd はWebルートの外(ドキュメントルートの外)に置くのが理想ですが、.htaccess でアクセスを禁止する方法でも対処できます。
.htpasswdファイルの作成
パスワードをハッシュ化して .htpasswd ファイルに登録する方法を、コマンドとオンラインツールの両方で説明します。
htpasswdコマンドで生成(推奨)
サーバーにSSHアクセスできる場合は、htpasswd コマンドを使うのが最も安全で確実な方法です。
# 新規ファイルを作成してユーザーを追加(-c オプション)
htpasswd -c /path/to/.htpasswd username
# 既存ファイルにユーザーを追加(-c なし)
htpasswd /path/to/.htpasswd username2
# bcryptハッシュを使う場合(より安全)
htpasswd -B /path/to/.htpasswd username
実行後にパスワードの入力を求められます。.htpasswd の内容は以下のような形式になります:
username:$apr1$xxxxx$xxxxxxxxxxxxxxxxxxxxxxx
username2:$2y$05$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
オンラインツールで生成
サーバーへのSSHアクセスができない場合、「htpasswd generator」で検索するとブラウザ上でハッシュを生成できるツールがあります。生成されたハッシュを .htpasswd に貼り付けます。
.htaccessの設定
.htaccess に認証の種類・ダイアログ表示名・パスワードファイルのパスを記述して認証を有効にします。
基本的な設定
最小限の設定で全ユーザーにIDとパスワードの入力を求める基本的な .htaccess の書き方です。
AuthType Basic
AuthName "Protected Area"
AuthUserFile /var/www/.htpasswd
Require valid-user
| ディレクティブ | 説明 |
|---|---|
AuthType Basic | 認証方式(Basicを指定) |
AuthName | ブラウザのダイアログに表示される説明文 |
AuthUserFile | .htpasswd ファイルの絶対パス |
Require valid-user | 有効なユーザーのアクセスを許可 |
重要: AuthUserFile には絶対パスを指定します。相対パスは動作しません。サーバー上のパスは phpinfo() や pwd コマンドで確認できます。
特定ユーザーのみ許可する
複数のユーザーが登録されている場合に、特定のユーザーだけアクセスを許可したいときの設定です。
AuthType Basic
AuthName "Admin Only"
AuthUserFile /var/www/.htpasswd
Require user admin
Require user ユーザー名 で特定ユーザーのみを許可できます。
特定IPは認証なし・それ以外は認証あり
社内ネットワークからのアクセスはパスワードなし、外部からはパスワード入力を求める組み合わせ設定です。
AuthType Basic
AuthName "Protected Area"
AuthUserFile /var/www/.htpasswd
# Apache 2.4以降
<RequireAny>
Require ip 192.168.1.0/24
Require valid-user
</RequireAny>
社内ネットワークのIPからはパスワードなし・外部からはパスワード入力を求める設定例です。
WordPressへのBasic認証設定時の注意
WordPressにBasic認証をかけると、WordPressの内部リクエスト(cronなど)が認証で弾かれることがあります。
WordPress管理画面(/wp-admin/)を除外する設定:
# ルートに置く .htaccess
AuthType Basic
AuthName "Protected Area"
AuthUserFile /var/www/.htpasswd
<Files wp-login.php>
Require all denied
</Files>
# wp-adminディレクトリへのアクセスは許可
<RequireAny>
Require ip 自社IPアドレス
Require valid-user
</RequireAny>
また、XMLRPCへの直接アクセスをBasic認証で保護することで、ブルートフォース攻撃も防げます。
.htpasswdファイルの保護
.htpasswd をWebルート内に置く場合は、外部から直接読まれないよう .htaccess でアクセスを遮断しておく必要があります。
.htpasswd がWebルート内にある場合、直接アクセスされないように .htaccess に以下を追加します:
<Files .htpasswd>
Require all denied
</Files>
よくあるエラーと対処
設定後に発生しやすいエラーのパターンと、それぞれの確認・対処方法をまとめました。
500 Internal Server Error
.htaccess の記述ミスが原因であることがほとんどです。
確認ポイント: - AuthUserFile のパスが正しいか(絶対パスを使っているか) - .htpasswd が存在し、読み取り可能なパーミッションか(644推奨) - Apache の AllowOverride が All または AuthConfig になっているか
パスワードを入力しても認証されない
正しいパスワードを入力しても認証が通らない場合に確認すべきポイントです。
.htpasswdのユーザー名・パスワードが正しく生成されているか確認する- パスワードハッシュの形式がApacheのバージョンと対応しているか確認する(bcryptを使う場合は
mod_authn_coreが必要)
Basic認証の限界
Basic認証は簡易的なアクセス制限です。通信がHTTPSでない場合、ID・パスワードが平文で送信されます。本番環境では必ずHTTPS(SSL)と組み合わせて使用してください。