{{category Apache HTTPd,nolink}}Apache HTTP サーバの .htaccess を使ったアクセス制御など
!!!パスワード認証によるアクセス制限
Basic認証を利用して、特定のディレクトリ以下のページにアクセスした際に、IDとパスワードを正しく入力しないとコンテンツにアクセスできないようにします。
## .htaccess 記述例
AuthType Basic
AuthName "Authentication system name"
AuthUserFile /home/hogehoge/.htpasswd
AuthGroupFile /dev/null
Require valid-user
「[AuthType|http://httpd.apache.org/docs/2.0/mod/core.html#authtype]」には認証方式を指定します。指定できる方法は「Basic」と「Digest」の2種類。Digest認証の方がよりセキュリティが高いですが、古いブラウザでは対応していなかったり、「mod_autu_digest」モジュールが組み込まれている必要がある。一方、Basic認証はほとんどのブラウザで対応されているが、入力したIDとパスワードはBASE64でエンコードされているだけなので見る人が見たら判る。
「[AuthName|http://httpd.apache.org/docs/2.0/mod/core.html#authname]」には認証領域の名前を指定します。ダイアログに表示され利用者がどのユーザとパスワードを入力すればよいかを教えるのに利用する。スペースが含まれる場合は、引用符で囲む必要がある。また、マルチバイトも利用できるが文字コードを気にする必要があるので、利用しない方が無難。
「[AuthUserFile|http://httpd.apache.org/docs/2.0/ja/mod/mod_auth.html#authuserfile]」には、ユーザ認証のためのユーザとパスワードの一覧を格納した テキストファイルの名前を設定する。絶対パスか ServerRoot からの相対パスで指定する。ファイルの各行には、ユーザ名、コロン、 暗号化したパスワードで記述する。作成・編集は、htpasswd コマンドを利用する。
「[AuthGroupFile|http://httpd.apache.org/docs/2.0/ja/mod/mod_auth.html#authgroupfile]」には、ユーザグループの一覧が格納した、テキストファイルの名前を設定する。絶対パスか ServerRoot からの相対パスで指定する。グループ分けしなければ「/dev/null」でよい。ファイルの各行には、グループ名、コロン、そしてスペース区切りでそのメンバーのユーザ名を記述する。
「[Require|http://httpd.apache.org/docs/2.0/mod/core.html#require]」には、どの認証済みユーザがリソースをアクセスできるかを指定する。認証されたすべてのユーザを許可する場合は「valid-user」を、指定したユーザのみ許可する場合は「user」を指定しその後ろに許可するユーザ名をスペース区切りで列挙、指定したグループの場合は「group」を指定しその後ろに許可するグループ名をスペース区切りで列挙する。
!!!特定ホストのアクセス制限
特定のホスト名やIPアドレスからのアクセスを拒否、または、許可する。__環境変数による制御は後記__
## .htaccess 記述例
Order allow,deny
Allow from all
Deny from example.com
「[Order|http://httpd.apache.org/docs/2.0/ja/mod/mod_access.html#order]」は、デフォルトのアクセス可能な状態と、後記の Allow と Deny が評価される順番を指定する。「Deny,Allow」とした場合、デフォルトでアクセスは許可となり、Deny に一致しないか、Allow に一致するものが許可される。また、「Allow,Deny」とした場合、デフォルトでアクセスは拒否となり、Allow に一致しないか、Deny に一致するものが拒否される。
「[Allow|http://httpd.apache.org/docs/2.0/ja/mod/mod_access.html#allow]」および「[Deny|http://httpd.apache.org/docs/2.0/ja/mod/mod_access.html#deny]」には、許可もしくは拒否するホスト名、IPアドレスなどを指定します。
## .htaccess 記述例
# ドメインが example.com のプロバイダのみ拒否
Order allow,deny
Allow from all
Deny from example.com
## .htaccess 記述例
# IPアドレスが 192.0.2.1 を拒否
Order allow,deny
Allow from all
Deny from 192.0.2.1
## .htaccess 記述例
# IPアドレスが 192.0.2 を許可
# IPアドレスが 192.0.2.0/255.255.255.0 を許可
# IPアドレスが 192.0.2.0/24 を許可
# ※3つともまったく同じホストを指します。
Order deny,allow
Deny from all
Allow from 192.0.2
Allow from 192.0.2.0/255.255.255.0
Allow from 192.0.2.0/24
!!!参照元(Referer)によるアクセス制限
画像ファイルなどは、IMGタグやAタグなどで表示されるので、通常リファラはそのhtmlのアドレスとなる。第三者のページから直接参照されないようにアクセス制限します。画像のみなど特定のファイルを対象にする場合は、後記とあわせて対象のみになるようにする。
## .htaccess 記述例
SetEnvIf Referer "^http://www\.example\.com" allowRef
order deny,allow
deny from all
allow from env=allowRef
「[SetEnvIf|http://httpd.apache.org/docs/2.0/ja/mod/mod_setenvif.html#setenvif]」を利用して、リクエストの属性に基づいて環境変数を設定する。大文字小文字を区別しない場合は「[SetEnvIfNoCase|http://httpd.apache.org/docs/2.0/ja/mod/mod_setenvif.html#setenvifnocase]」を利用する。
上記の例の場合、1行目で「Referer」が「http://www.example.com」で始まる場合、「allowRef」の環境変数が設定される。4行目の「env=allowRef」によって「allowRef」の環境変数が設定がされている場合に許可される。それ以外は拒否される。
もっとも、セキュリティソフトによってリファラを送信しないように設定されていたり、リファラ自体が偽装可能なのでこの辺の考慮も必要になる。
!!!ブラウザ(UserAgent)によるアクセス制限
ダウンロード支援ソフトによるアクセス(短時間に大量のアクセスが発生する)や検索エンジンの巡回ロボットなどのアクセスを制限する。
## .htaccess 記述例
#BrowserMatch "Downloader" denyUA
SetEnvIf User-Agent "Downloader" denyUA
order allow,deny
allow from all
deny from env=denyUA
「[BrowserMatch|http://httpd.apache.org/docs/2.0/ja/mod/mod_setenvif.html#browsermatch]」を利用して、HTTP User-Agent に基づいて環境変数を設定する。大文字小文字を区別しない場合は「[BrowserMatchNoCase|http://httpd.apache.org/docs/2.0/ja/mod/mod_setenvif.html#browsermatchnocase]」を利用する。
BrowserMatch は SetEnvIf の特例で、以下は同じ効果になる
BrowserMatch "Downloader" denyUA
SetEnvIf User-Agent "Downloader" denyUA
もっとも、ユーザエージェント自体が偽装可能なのでこの辺の考慮も必要になる。
!!!特定のファイルにアクセスできないようにする
DocumentRoot 配下に置かれているファイルは、リンクが張られていなくても直接アドレスを入力すればアクセスが出来る。特定の拡張子やファイルにアクセスできないようにする。
## .htaccess 記述例
deny from all
「[|http://httpd.apache.org/docs/2.0/ja/mod/core.html#files]」を利用して条件にマッチするファイルに対して制限などを適用する。ファイル名もしくはワイルドカード文字列で指定する。また、"~"を付加することで拡張正規表現が利用できるが、「[|http://httpd.apache.org/docs/2.0/ja/mod/core.html#filesmatch]」を使う方が推奨されている。
!!.htaccess 自体にアクセスできないようにする
せっかく .htaccess を利用してコンテンツを保護しても、.htaccess そのものにアクセスできてしまっては、効果がなくなってしまいます。特に .htpasswd (慣例の名前で任意になるが)は、暗号化されているとはいえパスワードが記述されています。なので、これらのファイルにアクセスできない(403 Forbidden などとなる)ようにする必要があります。
サーバの設定でアクセス拒否されている場合はいいのですが、そうでない場合は以下のように設定する。もっとも、.htpasswd は、DocumentRoot 配下以外に置きそもそもアクセスできないようにする方が安全です。
# deny to access htaccess.
deny from all
!!!リダイレクト機能(ディレクトリ単位)
ディレクトリ構成の変更した場合に、そのURLにアクセスした場合にリダイレクトするように指定する。
## .htaccess 記述例
# /test/wiki/ のアクセスを http://www.example.com/wiki/ へ
Redirect permanent /test/wiki http://www.example.com/wiki
「[Redirect|http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirect]」を利用して外部へリダイレクトします。2番目の status 引数はクライアントに通知するステータスコードをしていする。「permanent」は永久に移動したことを示す(コード301)、「temp」は一時的なリダイレクトを示す(302)、省略した場合は「temp」となる。
また、「[RedirectPermanent|http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirectpermanent]」は「Redirect premanent」と、「[RedirectTemp|http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirecttemp]」は「Redirect temp」と同じ。
上記の例の場合、/test/wiki/wiki.cgi は http://www.example.com/wiki/wiki.cgi へ、/test/wiki/wiki.ccs は http://www.example.com/wiki/wiki.css へとリダイレクトされる。
!!!リダイレクト機能(ファイル単位)
特定のファイルだけ別の場所に移した場合に、そのURLにアクセスした場合にリダイレクトするように指定する。
## .htaccess 記述例
# 画像ファイルのアクセスを http://img.example.com/ へ
Redirect permanent (.*\.jpg) http://img.example.com$1
「[RedirectMatch|http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirectmatch]」を利用して正規表現のマッチするURLを外部へリダイレクトします。2番目の status 引数は「[Redirect|http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#redirect]」と同じ。
!!!ディレクトリにアクセスした際の動き
通常 http://www.example.com/ などにディレクトリにアクセスした場合、ディレクトリ内に特定のファイルがあるかを探し、見つかった場合そのファイルの内容を表示する。
## .htaccess 記述例
DirectoryIndex index.html index.htm index.shtml index.cgi index.php
「[DirectoryIndex|http://httpd.apache.org/docs/2.0/mod/mod_dir.html#directoryindex]」を利用してディレクトリをリクエストしたときに調べるリソースのリストを指定する。列挙された順番でディレクトリ内を探す。
このとき、該当するファイルが見つからない場合で、mod_autoindex が有効(Options +Indexes)の場合、ディレクトリ内の内容一覧が表示される。この一覧を表示するかは「[Options|http://httpd.apache.org/docs/2.0/mod/core.html#options]」で「+Indexes」もしくは「-Indexes」を指定することで表示するかしないかを制御できる。