サーバー関連メニュー

トップページ

Google
WWWを検索
サイト内を検索

.htaccess によるアクセス制限

このエントリーをはてなブックマークに追加 Check Clip to Evernote

Apache のアクセス制限は、httpd.conf という大元の設定ファイルに設定を記述するのが基本です。しかし、ホストの管理者でないと httpd.conf は設定変更できないなど、運用上の問題は多いと言えます。そこで実用に即した .htaccess を利用したアクセス制限の方法を検討しましょう。

AuthConfig の有効化

まずは httpd.conf を .htaccess が利用可能なように設定変更を行います。任意のディレクトリーのディレクティブにある、AllowOverride に AuthConfig を追加するだけです。設定例としては以下のようになります。

httpd.conf の修正

<Directory "/usr/local/apache/www/htdocs">
  Options Indexes FollowSymLinks MultiViews Includes
  AllowOverride FileInfo AuthConfig Limit # ここを変更
  Order allow,deny
  Allow from all
</Directory>

以上のようにディレクティブを修正したら、Apache を再起動してください。

IPアドレスによる制限

まずは IP アドレスを用いた認証を行いましょう。

IP アドレス制限を行う場合は以下のような .htaccess ファイルを作ります。

IP アドレス制限を行う .htaccess

<limit GET POST>
order deny,allow
allow from somewhere.jp 192.168.0.
deny from all
</limit>

上の設定を簡単に解説します。

ここでの<limit GET POST>は、ウェブサーバーのGET機能とPOST機能を制限するという事です。通常の見るだけのアクセスはGET、フォームを通してデーターを送る場合はPOSTだと漠然と考える事ができます。

order deny,allow は、「拒否チェック」で拒否されたアクセスを、「許可チェック」でチェックして、アクセスさせるかどうか決めるということです。allow が許可条件、deny が拒否条件を表し、省略した場合はチェック・スルーでアクセスさせます。

allow from somewhere.jp 192.168.0. は、somewhere.jp というドメインに所属するコンピューターもしくは、192.168.0.xxx というIPアドレスを持つコンピューターからのアクセスを許可するという意味です。何百個と書いた場合はエラーになるようですが、この条件は続けて記述することができます。

deny from all は、全てのアドレスからのIPを拒否するように条件設定しています。

これらの設定がどういう動作になるのか考えましょう。192.168.0.1 のコンピューターがアクセスするとします。order deny,allow であるため、最初に deny のチェックを行い、全て拒否になっているので、192.168.0.1 からのアクセスはいったん拒否されます。しかし、その後に allow のチェックを行うので、そこで192.168.0.1 からのアクセスは許可されることになります。

もし設定をかえて order allow,deny にした場合、192.168.0.1 で許可されるものの、deny from all で結局全て拒否にあうので、アクセスできなくなるので注意してください。

mutual-failure オプション

 deny,allow と同じになりますが、非推奨だそうです。

ユーザー認証による制限

次にユーザー認証によるアクセス制限を行います。

基本的にはユーザー名とハッシュ化されたパスワードが載ったパスワード・ファイルを用意し、それに基づいてユーザー認証を行います。

さっそく .htaccess ファイルを作成してみましょう。

ユーザー認証を行う .htaccess

AuthUserFile /usr/local/apache/www/cgi-dat/.password
AuthGroupFile /dev/null
AuthName "A sample directory"
AuthType Basic
<Limit POST GET>
require valid-user
</Limit>

上の設定を簡単に解説します。

上記の例では、AuthUserFile で指定した .password というユーザー情報の書かれたファイルに応じて認証を行うようにしています。このパスワード・ファイルの指定は絶対パスでないといけません。

AuthName は認証時に出すメッセージです。mozilla 等で文字化けするかも知れませんが、日本語で「ユーザー認証領域」とでも書いたほうが親切かも知れません。

AuthType は BASIC と Digest があります。Digest 認証を使うと、パスワードのやり取りが暗号化されるので安全性が高まります(本文は暗号化されません)。ここでは、一般的な BASIC 認証を選択しています。

肝心の LIMIT の内側ですが、require valid-user(正規ユーザーを要求する)で終わりです。

パスワード・ファイルの中身

uncorrelated:/yKH7J/VjAQ9M
hiro_style2001:XYcpB10xl.Fdo

パスワード・ファイルの中身はテキストファイルで、ユーザー名とパスワードが : で分離されて記録されています。一般的にはパスワードは DES でハッシュ化されています。平文パスワードも用いることもできますが、避けたほうが良いでしょう。

パスワード・ファイルの作り方ですが、htpasswd のような Apache 付属のユーティリティーを使うのが一般的です。以下に例をあげますが、詳しくは htpasswd のヘルプ(引数無しで表示)を参照してください。

htpasswd によるパスワード・ファイルの生成例

$ htpasswd -c .pwdfile uncorrelated
New password:
Re-type new password:
Adding password for user uncorrelated
$ htpasswd .pwdfile raiuaka
New password:
Re-type new password:
Adding password for user raiuaka

パスワード・ファイルは構造が単純なので、スクリプト言語などで簡単に生成することができます。以下にサンプルをあげておきます。

パスワード・ファイル生成 Perl スクリプト

#
# 入力は ユーザー名,パスワード の並んだテキストファイルを
# リダイレクトで行う。
#
my $salt = "apache"; # 乱数的な文字列であれば何でも良い
while(<>){
 s/[\n\r]+$//; # 改行文字の処理
 my($usr,$pwd) = split(',',$_);
 my $hash = crypt($pwd,$salt);
 print "$usr:$hash\n";
}

ただし、crypt 関数が処理系によっては DES アルゴリズムではなくて MD5 アルゴリズムになったいたりするので、利用には注意が必要です。MD5 になっている場合は、DES を明示的に使うモジュールなどを利用してください。

グループ・ファイルによる制限

ユーザー認証に加えて、ユーザーの所属するグループによっても、制限を加える事ができます。

まず、以下のようなグループ・ファイルを作成します。UNIX/Linux の /etc/group と同じような書式です。

グループ・ファイルの例

grp1:uncorrelated,hiro_style2001
grp2:raiuka

このグループ・ファイル(.group)を使ったアクセス制限を行う .htaccess ファイルの中身は以下のようになります。

グループ・ファイルを用いた .htaccess

AuthUserFile /usr/local/apache/www/cgi-dat/.password
AuthGroupFile /usr/local/apache/www/cgi-dat/.group
AuthName "A sample directory"
AuthType Basic
<Limit POST GET>
# grp1 グループだけ認証を許可
require group grp1
require valid-user
</Limit>

IPアドレスとユーザー認証による制限

Apache 1.3.12 からは、IPアドレスとユーザー認証による制限を同時に用いる事もでき、「社内からパスワード無し、社外からはパスワードありでアクセスしたい」などというときに利用する事ができます。

こういう状況における具体的な設定例を以下にあげます。

IP アドレスもしくはユーザー認証で許可を行う .htaccess

AuthUserFile /usr/local/apache/www/cgi-dat/.password
AuthGroupFile /dev/null
AuthName "A sample directory"
AuthType Basic
<Limit POST GET>
order deny,allow
allow from somewhere.jp 192.168.0.
deny from all
require valid-user
Satisfy ANY
</Limit>

Satisfy Any が追加されただけです。なお、特定のIPアドレスからのアクセスで、かつユーザー認証に成功したものだけをアクセス許可する場合は、Satisfy All を指定します。

データベースを用いたユーザー認証

応用として多少こった認証方法を紹介します。

Apache のモジュールで mod_auth_pgsql という PostgreSQL というデータベースに接続するためのモジュールがあります。通常はパスワード・ファイルを参照しますが、このモジュールを使うとデータベースの中の会員情報などで認証を行え、管理や速度面で有利になります。詳細は、モジュール添付のファイルに英文の丁寧な解説があるので、そちらを読んでください。

以下では、.htaccess 側の簡単な設定例あげます。

PostgreSQL によるユーザー認証用いた .htaccess

Auth_PG_host localhost # PostgreSQLのホスト名、もしくはIPアドレス
Auth_PG_port 5432 # PostgreSQLの接続ポート
Auth_PG_database password_database # 認証に使うデータベース名
Auth_PG_user www_user # データベースにアクセスするユーザー
Auth_PG_pwd www_password # データベースにアクセスするユーザーのパスワード
Auth_PG_pwd_table password_table # 認証に使う以下二つのフィールドの入ったテーブル名
Auth_PG_uid_field email # ユーザー名として利用するフィールド名
Auth_PG_pwd_field password # パスワードとして利用するフィールド名
#Auth_PG_grp_table group_table # 認証に使うテーブル名。Auth_PG_uid_field で指定したフィールドと、以下の Auth_PG_gid_field で指定したフィールドが含まれている必要がある。
#Auth_PG_gid_field role # グループとして利用するフィールド名 Auth_PG_encrypted off # DES化したものでなく、平分パスワードを選択
AuthName "mod_auth_pgsql test"
Authtype BASIC
<Limit POST GET>
#require group grp1 # グループ名を指定するには必要
require valid-user
</Limit>

password_table は実体のあるテーブルではなく、VIEW 等でも問題ありません。

なお mod_auth_oracle など他のデータベース用のモジュールや、mod_auth_ldap というLDAP を用いるものなどもあります。要件にあわせて、最適なものを選択してください。

環境変数を用いた制限 - 直リンクを妨害

IP アドレスやユーザー認証だけではなくて、環境変数を用いたアクセス制限も用いる事ができます。ただし環境変数で得られる情報のほとんどは偽装することが容易に可能なので、厳密なアクセス制限には向きません。

ここではソフトなアクセス制限の応用例として、良く画像ファイルへの直リンクを防止したいという要望を受けるるので、一般的なブラウザーの一般的な設定で、直リンク画像を表示させないようにしてみましょう。

画像の直リンクを妨害する .htaccess

SetEnvIf Referer "^http://uncorrelated.no-ip.com/" local_referral
# favicon.ico は例外にしておく
SetEnvIf Request_URI "^.*/img/favicon.ico$" local_referral
<Limit POST GET>
order deny,allow
deny from ALL
allow from env=local_referral
</Limit>

SetEnvIf は第一引数が第二引数にパターン・マッチすれば第三引数を真にセットするので、allow from env=[第三引数] とすればアクセス制限ができます。

以下に主な環境変数をリストしておきます。

SetEnvIf で利用可能な環境変数
環境変数 説明
Host サーバー(リクエスト先)のホスト名
User-Agent ユーザーエージェント(例えば、"Mozilla/4.0 (compatible; MSIE; Win32)")
Referer ページの参照元
Remote_Host リクエストを行なっているクライアントのホスト名
Remote_Addr リクエストを行なっているクライアントの IP アドレス
Request_Method 使用されているメソッド名 (GET, POST など)
Request_Protocol リクエストが行なわれたプロトコルの名前とバージョン (例えば、"HTTP/0.9","HTTP/1.1" など。)
Request_URI URL のスキームとホストの後の部分。要はリクエストされたパス