12.

Apache .htaccessでベーシック認証を設定する手順|.htpasswd

編集
この記事の要点
  • Apache のベーシック認証.htaccess.htpasswd の 2 ファイルで設定する
  • .htpasswdhtpasswd コマンドで作成し、ID とハッシュ化パスワードを保存
  • .htaccess には AuthUserFile / AuthName / AuthType Basic / require valid-user を記述
  • .htpasswdドキュメントルート外に置くのが基本(ブラウザから直接アクセスされない場所)
  • ベーシック認証は常に HTTPS と組み合わせる。HTTP だとパスワードが平文で送られる

ベーシック認証とは

Apache HTTP Server が標準でサポートするもっとも簡単な認証方式です。ブラウザがダイアログを表示してユーザー ID とパスワードを入力させ、Apache がそれを検証します。.htaccess.htpasswd の 2 ファイルだけで設定でき、開発中サイトの非公開化や管理画面の保護でよく使われます。

設定の全体像

  1. htpasswd コマンドで .htpasswd(ID とハッシュ化パスワードのファイル)を作成
  2. 保護したいディレクトリに .htaccess を配置し、認証ディレクティブを記述
  3. Apache を再起動またはリロードして反映

1. .htpasswd の作成

htpasswd コマンドで作成します。-c はファイルを新規作成(既存ファイルがあれば上書き)、-b はパスワードを引数で渡す、-m は MD5 ハッシュ(デフォルトで安全)です。

# 新規作成(既存があれば上書き)
htpasswd -b -c -m .htpasswd admin secret

# 既存ファイルにユーザー追加(-c を外す)
htpasswd -b -m .htpasswd user2 password2

# 対話的に入力(パスワードがコマンド履歴に残らないので推奨)
htpasswd -m .htpasswd admin

# ユーザー削除
htpasswd -D .htpasswd user2

# bcrypt(より強いハッシュ)
htpasswd -B -c .htpasswd admin

作成された .htpasswd は以下のような内容です。

admin:$apr1$abc1234$XYZ.encryptedhash.here/
user2:$apr1$def5678$ABC.encryptedhash.here/

2. .htaccess の記述

保護したいディレクトリに .htaccess を置きます。AuthUserFile.htpasswd の絶対パスを指定してください。

AuthUserFile /var/www/private/.htpasswd
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

ディレクティブの意味

ディレクティブ役割
AuthUserFile.htpasswd の絶対パス。相対パスは不可
AuthNameブラウザ認証ダイアログに表示されるrealm(領域名)
AuthType認証方式。Basic または Digest
require valid-user.htpasswd に登録された任意のユーザーで OK
require user admin特定ユーザーのみ許可
require group editorグループ単位で許可(AuthGroupFile 必要)

3. Apache の AllowOverride を確認

.htaccess を有効にするには httpd.conf 側で AllowOverride AuthConfig 以上が設定されている必要があります。

<Directory /var/www/html>
    AllowOverride AuthConfig
    # または全許可
    # AllowOverride All
</Directory>

変更後は Apache をリロードします。

# Debian/Ubuntu
sudo systemctl reload apache2

# RHEL/CentOS/Rocky
sudo systemctl reload httpd

# 設定構文チェック
apachectl configtest

.htpasswd の置き場所

.htpasswd はドキュメントルート(公開ディレクトリ)のに置くのが安全です。公開ディレクトリ内に置く場合は、追加で .htaccess に以下を入れて直接アクセスを拒否します。

<Files ".htpasswd">
    Require all denied
</Files>

セキュリティ上の注意

  • HTTPS 必須 — ベーシック認証は ID とパスワードを Base64 でエンコードして送るだけで、暗号化はしません。HTTP では盗聴される
  • htpasswd -b は履歴に残る — 本番では対話入力か、デプロイスクリプトで自動化
  • パスワードは長く — ブルートフォース対策に最低 12 文字
  • bcrypt (-B) を使う — MD5 (-m) よりはるかに強い
  • 本格的なログイン認証が必要ならアプリ側で実装するか OAuth/SSO を検討

よくあるトラブル

症状原因と対処
500 Internal Server Error.htaccess の構文ミス。apache2ctl configtest でチェック
認証ダイアログが出ないAllowOverrideNoneAuthConfig 以上に
正しいパスワードでも弾かれるAuthUserFile のパスが間違っている、または Apache から読めない権限
.htpasswd を直接ダウンロードできてしまうドキュメントルート外に移動 or <Files".htpasswd"> Require all denied </Files>
ログアウトしたいベーシック認証にはログアウト機能がない。ブラウザを閉じるか、別 URL に異なる credentials でアクセス

特定のパスのみ保護する

.htaccess の代わりに httpd.conf<Location><Directory> を使うほうが処理が高速で確実です。

<Directory /var/www/html/admin>
    AuthUserFile /var/www/private/.htpasswd
    AuthName "Admin Area"
    AuthType Basic
    require valid-user
</Directory>

nginx で同じことをする場合(参考)

同じ仕組みは nginx でも利用できます。Apache の .htpasswd 形式の認証ファイルがそのまま使えます。

server {
    location /admin/ {
        auth_basic           "Admin Area";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

IP アドレスでの許可と組み合わせる

社内 IP は認証なしで通し、それ以外はベーシック認証、という二段構えもよくあります。

<Directory /var/www/html/admin>
    AuthUserFile /var/www/private/.htpasswd
    AuthName "Admin"
    AuthType Basic

    # 社内 IP は無条件で許可、それ以外はパスワード要求
    <RequireAny>
        Require ip 203.0.113.0/24
        Require valid-user
    </RequireAny>
</Directory>

認証情報の使い回し(curl の例)

自動化やテストでは curl の -u オプションで認証情報を渡せます。

curl -u admin:secret https://example.com/admin/
# あるいは事前にダイアログを出す
curl --basic --user admin https://example.com/admin/

関連

  • Apache HTTP Server — 本体
  • .htaccess — ディレクトリ単位設定ファイル
  • AllowOverride — .htaccess の許可範囲
  • Digest 認証 — より安全な認証方式
  • Let's Encrypt / HTTPS — ベーシック認証と必ず組み合わせる
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法(Ubuntu)
  2. Apache HTTP Server のインストール方法(CentOS / RHEL)
  3. ディレクトリ構造
  4. httpd.conf(設定ファイル)
  5. ドキュメントルートの変更方法
  6. .htaccess
  7. コマンド一覧
  8. エラー一覧
  9. VPSへの導入例(CentOS編)
  10. SSLの設定
  11. httpd.conf系のバーチャルホストの設定エラー有無確認方法
  12. .htaccess でベーシック認証
  13. configの文法チェック

最近更新/作成されたページ