WinXP+Apache2.0+BASIC認証

土曜日, 01. 20. 2007  –  Category: News, Tips

以下は検証用にWindowsで手っ取り早くWebサーバを立ててしまいたいぜ! という時のためのメモです。
したがってWindows XPでWebサーバってちょwwwおまwwwwwwwみたいな指摘は受け付けません。
【ポイント】

  • win32ではMD5しか使えないよ。MD5じゃセキュリティ的にアレとか気にしないよ!
  • PerlとかPHPでcrypt関数のスクリプト書く必要なし。htpasswdコマンドで一発です。
  • Server RootとDocument Root間違えないようにね。>自分

まあでもせっかくなので人様が見ることを意識して「webサーバ立てるような人なら誰でも知ってるだろそれくらい」くらい基本的なところから書くようにしますのでよろしくお付き合いのほど。


BASIC認証の設定方法には二種類あります。

  1. .htaccessファイルを編集して当該ディレクトリに設置する
  2. httpd.confに当該ディレクトリの<Directory>セクションを追加する

皆様ISPなどからサーバスペースを借りていてBASIC認証(※)をする場合、.htaccessとかいうファイルを編集する方法でやられていると思うのですが、これはISPが持っているサーバのAdmin権限(この場合httpd.confを編集する権限)を皆様がお持ちじゃないからですね。
実際にはApacheは.htaccessを使うのは極力避けるように、とガイドしております。
▼Apache HTTP Server Documentation
http://httpd.apache.org/docs/
▼.htaccess > いつ .htaccess ファイルを使う(使わない)か。
http://httpd.apache.org/docs/2.0/howto/htaccess.html#when
なので今回はhttpd.confに書く方法でやるよ。
#ちなみに.htaccessでやる場合はallowoverride設定に注意しようね。
#httpd.confの以下の部分を”None”ではなく”AuthConfig”にします。↓

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be “All”, “None”, or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None

使用した環境は
Apache/2.0.59 (Win32) mod_ssl/2.0.59 OpenSSL/0.9.8c
Windows XP ver.2002 SP2
Apacheのインストールディレクトリはpsiの環境ではC:apacheです。以下$ServerRootと書きます。
Program Files以下に入れるとCLIからの操作のとき””入れ忘れてエラー吐かれたりして面倒なので。。。

1. 認証モジュールの確認
Apache2.0ではデフォルトで入っているので通常気にする必要はありませんが一応確認しておきましょう。
$ServerRoot/conf/httpd.confに以下の行が存在することを確認(#でコメントアウトされていないことを確認)

LoadModule auth_module modules/mod_auth.so
LoadModule access_module modules/mod_access.so

$ServerRoot/modules/に、”mod_auth.so”と”mod_access.so”というファイルが存在することを確認
#digest関数を使う場合などはまた話が違ってきますのでご注意をば。

2. セクションの追加
$ServerRoot/conf/httpd.confに以下の行を追加します。.htaccessを編集したことのある方なら大体一緒なので分かるでしょう。

#######For Basic Authentication TEST###########
<Directory “c:/apache/htdocs/basicauth”>
AuthType Basic
AuthUserFile /passwd
AuthGroupFile /dev/null
AuthName “Please enter your ID and password.”
require valid-user
</Directory>
#######For Basic Authentication TEST###########

一行目
Directoryセクションタグには認証をかけたいディレクトリを絶対パスで指定します。Windows XPですから、C:とかD:とかのドライブ名から始まるパスです。
二行目
BASIC認証をしますよ、という意味
三行目
useridとpasswordを書いたファイルがどこにあるか指定します。次のステップで作成しますが、ここで指定した場所に作成してください。ここでは、$ServerRoot(ドキュメントルートじゃないよ)からの相対パスで記述しています。$ServerRoot直下のpasswdというファイルを参照しなさいという意味です
四行目
useridをGroupごとに分けて権限を制限したりできるのですが、今回面倒なので無視です。/dev/null→ゴミ箱行きの意味
五行目
useridとpasswordを聞かれるプロンプトに表示される文字です。下のほうに示したHEADER情報にも含まれていますのでご確認を
六行目
passwdファイルに定義されているユーザでpasswordが有効なら誰でもオッケーですよという意味。複数のディレクトリで認証をかけていて、ディレクトリ1にはaaaさんのみを、ディレクトリ2にはbbbさんのみをアクセスさせたいが、aaaさんとbbbさんのuseridとpassは同一のpasswdファイルに定義されている、といったような場合には、ここで個々のuserを指定します
3. htpasswdの作成
DOSプロンプトを立上げ、$ServerRoot/bin/に移動してhtpassedコマンドを実行します。
▼ htpasswdコマンドのオプション

C:apachebin>htpasswd
Usage:
htpasswd [-cmdpsD] passwordfile username
htpasswd -b[cmdpsD] passwordfile username password
htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c Create a new file.
-n Don’t update file; display results on stdout.
-m Force MD5 encryption of the password (default).
-d Force CRYPT encryption of the password.
-p Do not encrypt the password (plaintext).
-s Force SHA encryption of the password.
-b Use the password from the command line rather than prompting for it.
-D Delete the specified user.
On Windows, NetWare and TPF systems the ‘-m’ flag is used by default.
On all other systems, the ‘-p’ flag will probably not work.

で、最初にも書いたんだけど、Apache2.0のwin32版ではMD5以外使えないらしいです。ので、以下のような感じに。

C:apachebin>htpasswd -c ../passwd userid
Automatically using MD5 format.
New password: ********
Re-type new password: ********
Adding password for user userid

これで、$ServerRootに”passwd”というファイルが生成されます。中身はこんな感じ。
passwd.PNG
userが増えていくとどんどん行が追加されていくのだね。
htpasswdの置き場所はDocumentRootより上にしましょう。DocumentRootがどこかはhttpd.confに書いてあります。デフォルトは以下です。

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot “c:/apache/htdocs”

4. サーバの再起動
httpd.confを再読込みして設定の変更を反映させるために、サーバを再起動します。
▼サービスから
BasicAuth_00.png
▼Apache Monitorから
BasicAuth_01.png


【BASIC認証ってなんじゃらほい、という方】
authprompt_ie.jpg
みたいのが出てきて正しいUSER/PASSを入れた人だけが、該当コンテンツにアクセス出来ます。
腐女子の皆さんは裏を作る際などに使用されるのではないかと。
認証サーバもユーザデータベースも不要でApache(or BASIC認証に対応したwebサーバ)だけあればぉk。
【もう少し詳しい話】
動きとしてはBASIC認証の対象になっているディレクトリにリクエストを投げると、サーバは認証情報寄越せコラ、と401レスポンスを返します。
>> 認証対象のディレクトリにリクエストを投げた時のHTTPヘッダ

GET /basicauth/ HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive

>> 認証情報を求める401応答が返ってくると同時に、ID/PASSの入力を求めるプロンプトが表示される。

HTTP/1.1 401 Authorization Required
Date: Fri, 19 Jan 2007 02:05:10 GMT
Server: Apache/2.0.59 (Win32) mod_ssl/2.0.59 OpenSSL/0.9.8c
WWW-Authenticate: Basic realm=”Please enter your ID and password.”
Content-Length: 505
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

認証情報を求める太字の行を受け取ったブラウザは認証プロンプトを表示。↓
authprompt.JPG
ブラウザはHTTPヘッダに認証情報を入れて再度リクエストを送信。(太字部分が認証情報)

GET /basicauth/ HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive
Authorization: Basic YmlnaXA6YmlnaXA=

ヘッダの中身を評価してサーバはアクセスを許可/拒否。ID/PASSがOKなら200応答、NGなら401のまま画面が表示される。

HTTP/1.1 200 OK
Date: Fri, 19 Jan 2007 02:05:34 GMT
Server: Apache/2.0.59 (Win32) mod_ssl/2.0.59 OpenSSL/0.9.8c
Last-Modified: Mon, 15 Jan 2007 07:28:00 GMT
ETag: “523c-8b-2f6a7ec6”
Accept-Ranges: bytes
Content-Length: 139
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

○200応答
authenticated.JPG
○401応答
401_authrequired.JPG
ご覧の通りヘッダ中に認証情報が含まれるので、ハッシュ化されているとは言え、当然認証強度としてはあんまり期待できません。
【さらに詳しい話】
この認証情報はブラウザのメモリ領域に保存されていて、リクエスト送信するときに、これは以前認証情報を求められたhost名だ!という感じでヘッダ情報を入れるようなのですが、Apacheのドキュメントの記述が紛らわしくてちょっと混乱した。
http://httpd.apache.org/docs/2.0/howto/auth.html#gettingitworking
に、

もちろん、セキュリティ上の理由から、 サーバのホスト名が変わればいつでも必ず、 クライアントは再びパスワードを尋ねる必要があります。

って書いてあるんですが、なんでクライアントがパスワードを尋ねるんだ?
英語版でも同じこと書いてあるし、おそらくクライアントソフト(ブラウザ)がユーザーに、って意味なんだろうな。サーバに聞くのかと思ってびっくりしたよ。
メモリ領域に保存されているので、IEだと、リロードしたりCtrl+Nで新しいウィンドウ立ち上げても再認証は必要ありませんが、新しいプロセス立ち上げると再認証が必要です。

Tags:

Leave a Reply


Recent Entries

Category

Tag Cloud

Twitter

Google AdSense

Archives

Last.fm

more on last.fm