WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Apache のみで Cookie によるアクセス制御をかける

自分専用のサーバーに Apache をインストールする目的のひとつに、自分専用の Web サイトを構築したい、というのがあるのではないでしょうか。最近は XOOPSTikiWiki、各種 blog など、個人でも手軽に使える CMS が多く開発されていますので、簡単に自分専用のポータルサイトを構築できます。また、よく使う資料などをどこからでもアクセスできるようにしたい、なんてこともよくあります。

こんなとき、問題になるのがアクセス制御の方法です。一番オーソドックスなのは Apache の BASIC 認証を使う方法ですが、これだとアクセスのたびに認証ダイアログが表示されてけっこうウザイです。とくにポータルサイトとしてブラウザのデフォルトページに登録したいときには問題です。CMS にはたいてい認証システムがありますが、CMS の管理外のファイルは保護できません。できれば、Cookie にパスワードを記憶させて、サイト全体に一括してアクセス制限をかけたいものです。

というわけで、今日はそのようなことを実現する Apache の設定をご紹介します。世の中には mod_auth_cookie なる専用のモジュールもありますが、単に特定の Cookie の値をチェックするだけなら標準のディレクティブだけで設定できます。自分だけしかアクセスしないサイトなら、それでじゅうぶんでしょう。

使用するディレクティブ

ApacheCookie の値をチェックするには、以下のディレクティブを使用します。これらは <VirtualHost>、<Directory>、<Location>、そして(許可されていれば).htaccess などに記述できます。

SetEnvIf

リクエストヘッダの内容に応じて環境変数を設定することを指示するディレクティブです。リクエストヘッダの特定のフィールドが正規表現にマッチしたときに、指定した環境変数を設定させることができます。書式は以下のとおりです。

SetEnvIf <フィールド名> <正規表現> <環境変数名>[=<値>]
フィールド名
リクエストヘッダのフィールド名を指定します。ここに "Cookie" と指定すれば、Cookie の値をチェックできます。
正規表現
Perl 互換の正規表現です。フィールド名 で指定したフィールドの値とこの正規表現とのマッチングを行い、マッチしたら指定された環境変数を設定します。
環境変数名
正規表現がマッチしたときに設定する環境変数の名前です。が省略されたときは "1" が設定されます。
正規表現がマッチしたときに環境変数に設定される値です。

このディレクティブは mod_setenvif モジュールにあります。通常はデフォルトで組み込まれていますが、もしエラーが出るようなら "/etc/apache2/httpd.conf" に以下の行があるか確認してください。

LoadModule setenvif_module modules/mod_setenvif.so

実際には、もう少し多くの機能があります。詳細は Apache のドキュメントを参照してください。

Allow from env

実際には、通常の Allow from ディレクトリのバリエーションのひとつです。特定の環境変数が定義されているかどうかによって、アクセスを許可できます。もうおわかりでしょうが、前述の SetEnvIf ディレクティブと組み合わせて Cookie によるアクセス制御が行えます。書式は次のとおりです。

Allow from env=<環境変数名>
環境変数名
ここで指定した名前の環境変数が定義されていたら、アクセスを許可します。

もちろん、これと対を成す Deny from env もあります。

Cookie の設定方法

Cookie にパスワードを設定する方法に関しては、Cookie を使ったユーザー認証を JavaScript で実装するでご紹介したように、JavaScript で簡単に設定できます。

注意しなくてはいけないのは、この Cookie 設定用の JavaScript を含んだページは、保護対象と同一のドメインになくてはならないことです。ということは、そのままでは「パスワードを設定するページにアクセスするためにはパスワードが設定されていなければならい」という卵と鶏の関係になってしまいます。Files ディレクティブなどを使ってパスワード設定ページのみアクセス制御から除外するようにしなければなりません。

設定例

それでは、実際の設定例をご紹介しましょう。以下の設定は、"password" という名前の Cookie に "pass" という値が設定されていた場合のみアクセスを許可します。ただし、"/auth.html" というページだけは無条件にアクセスできるので、ここに Cookie を設定するためのスクリプトを設置しておくことができます。

<VirtualHost *:80>
    ServerName www.sourcewalker.com
    DocumentRoot "/var/www/localhost/htdocs"
    SetEnvIf Cookie password=\x22?pass\x22? site_password
    <Location />
        Order deny,allow
        deny from all
        Allow from env=site_password
    </Location>
    <Files "/var/www/localhost/htdocs/auth.html">
        Order allow,deny
        Allow from all
    </Files>
</VirtualHost>

以上の方法で、サイト全体に Cookie によるアクセス制御をかけることができます。パスワードが平文でネットワークに流れますのでセキュリティーは最低限のレベル(BASIC 認証と同程度)ですが、普通はこの程度でじゅうぶんでしょう。心配であれば SSL を通すとよいかと思います。ただし、XSS による Cookie の盗難にだけは気をつけてください。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles