.htaccessで守る!Webサーバーのアクセス制御

その他

ぽんきち
ぽんきち

そもそも「.htaccess」って何なの?

プログラマーさん
プログラマーさん

「.htaccess(エイチティーアクセス)」は、Apacheウェブサーバーで使われる設定ファイルだよ。

ディレクトリごとに細かいアクセス制御や認証、リダイレクトなどを設定できるんだ。

ファイル名の先頭に「.」が付いているのは、Linux系OSで「隠しファイル」を意味するよ。


.htaccessの主な活用シーン

  • サイトの一部だけパスワードで保護したい
  • 特定のIPアドレスだけアクセス許可したい
  • ログや設定ファイルなど、見せたくないファイルをブロックしたい
  • キャッシュを無効化して常に最新ページを表示したい

注意:.htaccessの設定ミスはサイト全体の動作に影響することがあるので、編集前に必ずバックアップを取りましょう。


1. BASIC認証でページを守る

Webサイトの一部をユーザー名とパスワードで保護したいときは、「BASIC認証」を使います。

ぽんきち
ぽんきち

BASIC認証ってどうやって設定するの?

プログラマーさん
プログラマーさん

大まかな流れはこうだよ。

1. サーバー上で「.htpasswd」ファイルを作成して、ユーザー名とパスワードを登録する

2. 「.htaccess」ファイルで、その「.htpasswd」ファイルを参照するように設定する

3. Webページにアクセスすると、ユーザー名とパスワードの入力画面が表示される


1.1 「.htpasswd」ファイルの作成

ぽんきち
ぽんきち

.htpasswdファイルって、どうやって作るの?

プログラマーさん
プログラマーさん

手動で作るのは危険だから、Apacheの専用コマンドを使うんだ。詳しく説明するね。

.htpasswdは、BASIC認証で使うユーザー名とパスワードの情報を保存するファイルです。パスワードは暗号化されて記録されるため、直接中身を見ても分からないようになっています。

手動でファイルを作るとパスワードを平文で書いてしまったり、暗号化が正しくできなかったりする可能性があります。Apacheには「htpasswd」という専用のコマンドが用意されており、これを使うとパスワードを安全に暗号化してファイルに保存できます。

htpasswdコマンドは、Webサーバーが動いているサーバー上で実行する必要があります:

  • レンタルサーバーの場合:サーバー管理画面の「SSH接続」や「ターミナル」機能を使う
  • VPSやクラウドサーバーの場合:SSHでサーバーにログインして実行
  • ローカル環境の場合:ApacheがインストールされているPCのコマンドプロンプトやターミナルで実行

htpasswdコマンドの基本的な使い方は以下の通りです:

基本的な構文:

htpasswd [オプション] パスワードファイル ユーザー名

主なオプション:

  • -c:新規にパスワードファイルを作成する(既存ファイルがある場合は上書き)
  • -b:コマンドラインでパスワードを指定する(セキュリティ上推奨されない)
  • -m:MD5暗号化を使用する(デフォルト)
  • -s:SHA暗号化を使用する

使用例:

  1. 最初のユーザーを追加する場合(ファイルを新規作成):
htpasswd -c /path/to/.htpasswd user1

このコマンドを実行すると、パスワードの入力を求められます。入力したパスワードは暗号化されてファイルに保存されます。

  1. 2人目以降のユーザーを追加する場合:
htpasswd /path/to/.htpasswd user2

-cオプションは不要です。既存のファイルに新しいユーザーが追加されます。

.htpasswdファイルの中身例:

user1:$apr1$8kz...$Q9Qw1k...   # user1の暗号化パスワード
user2:$apr1$7h2...$A1B2C3...   # user2の暗号化パスワード

コマンドを実行すると、その場で「New password:」と表示されてパスワードを入力します。画面には表示されませんが、入力した内容がそのまま登録されます。入力したパスワードは.htpasswdファイル内で暗号化されて保存されるため、あとから中身を見ても元のパスワードは分かりません。

注意点:

  • パスワードを忘れた場合は、同じコマンドで新しいパスワードを再設定しましょう。
  • .htpasswdファイルはWebからアクセスできない場所(ドキュメントルートの外など)に置くのが安全です。
  • パスワードは8文字以上で、英数字と記号を組み合わせることを推奨します。


1.2 .htaccessファイルでBASIC認証を有効化

ぽんきち
ぽんきち

「.htaccess」には何を書けばいいの?

プログラマーさん
プログラマーさん

「.htaccess」ファイルには、作成した「.htpasswd」ファイルのパスを指定して、BASIC認証を有効にする設定を書くよ。

.htaccessでの設定例:

AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Restricted Area"
Require valid-user

各設定項目の説明:

  • AuthUserFile:.htpasswdファイルの場所を指定
  • AuthType Basic:BASIC認証を使用することを明示
  • AuthName:ブラウザの認証ダイアログに表示されるメッセージ
  • Require valid-user:.htpasswdファイルに登録されたユーザーのみアクセス許可の意

注意点:

  • .htpasswdファイルはWebから見えない場所に置こう。
  • 保護したいディレクトリに.htaccessを設置すればOK!


2. IPアドレス・国ごとのアクセス制限

特定のIPアドレスや国だけ許可したい場合は、次のように設定します。

Require ip 192.0.2.0/24
  • 国内IPアドレスリストを使えば、国単位の制限も可能!


3. 見せたくないファイル・ディレクトリのブロック

ぽんきち
ぽんきち

ログファイルや設定ファイルって、Webから見えちゃうの?

プログラマーさん
プログラマーさん

そうなんだ。デフォルトでは、Webサーバーに置いたファイルは誰でもアクセスできちゃうんだ。だから、見せたくないファイルは明示的にブロックする必要があるよ。

Webサイトには、ログファイルや設定ファイル、データベースファイルなど、公開する必要のないファイルがたくさんあります。これらのファイルがWebからアクセス可能になっていると、セキュリティ上の大きな問題となります。

.htaccessを使えば、特定の拡張子やファイル名パターンに一致するファイルへのアクセスを一括で拒否できます。

設定例:

<Files ~ "\.(log|csv|ini|dat|tpl|yml)$">
    Require all denied
</Files>

各設定項目の説明:

  • <Files ~ "パターン">:指定したパターンに一致するファイルを対象とする
  • Require all denied:すべてのアクセスを拒否する

よくブロックすべきファイルの例:

  • ログファイル.log.txt(ログが含まれる場合)
  • 設定ファイル.ini.conf.config
  • データファイル.csv.dat.db
  • テンプレートファイル.tpl.template
  • 設定ファイル.yml.yaml.json

ディレクトリ全体をブロックする場合:

特定のディレクトリ内のすべてのファイルをブロックしたい場合は、そのディレクトリに以下の内容の.htaccessファイルを置きます:

Require all denied

注意点:

  • ブロックする前に、そのファイルが本当に不要かどうか確認しましょう。
  • システムファイルを誤ってブロックすると、サイトが正常に動作しなくなる可能性があります。
  • ブロック設定を追加した後は、サイトの動作に問題がないかテストしましょう。


4. ページのキャッシュを無効化

常に最新のページを表示させたいときは、キャッシュを無効にするヘッダーを設定します。

<FilesMatch "\.(html|php)$">
  Header set Cache-Control "no-cache, no-store, must-revalidate"
  Header set Pragma "no-cache"
  Header set Expires 0
</FilesMatch>
  • mod_headersモジュールが有効か確認しよう。


5. .htaccess自体の保護も忘れずに

.htaccessや.htpasswdファイルは、明示的にアクセス拒否しておくと安心です。

<FilesMatch "^\\.ht">
    Require all denied
</FilesMatch>


ぽんきち
ぽんきち

.htaccessって、意外といろんなことができるんだね!

プログラマーさん
プログラマーさん

設定ミスには注意して、必ずバックアップを取ってから編集しよう!

タイトルとURLをコピーしました