サーバ担当のもしかするとKです。
今回はしばしば利用されるApacheのBasic認証(auth_basic_module)と、もう少し頑張るDigest認証(auth_digest_module)について数回に分けて書いてみようと思います。今回はBasic認証についてです。
Basic認証
Apacheの.htaccessで認証しますと聞くと、一番最初に思いつくのが以下の様な.htaccessを書くBasic認証と言われているものじゃないかと思います。
$ cat .htaccess AuthType Basic AuthName "By Invitation Only" AuthUserFile /tmp/.htpasswd Require user test_user
試しにtelnetでBasic認証されるコンテンツ領域にアクセスしてみます。
$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /k_test_tmp/index.html HTTP/1.0 host: hoge.hoge.jp:80 HTTP/1.1 401 Authorization Required Date: Tue, 24 Jul 2007 04:33:43 GMT Server: Apache WWW-Authenticate: Basic realm="By Invitation Only" Content-Length: 463 Connection: close Content-Type: text/html; charset=iso-8859-1 :省略: Connection closed by foreign host.
この接続ではパスワード情報を入力していないので、上の省略部分では401 Authorization Requiredで怒られているのですがそれは置いておいて、ここでの注目部分はWWW-Authenticate:の部分。文中にBasicという文字が確認できます。これはウェブサーバからBasic認証を要求しているという合図みたいなものです。
これに対して認証させてみたいと思います。
Basic認証はAuthorization: Basic <MIME base64でエンコードした’ユーザ名:パスワード>の指定で行うことができます。たとえば、ユーザ名がtest_user、パスワードがtest_passの場合はこんな感じに。
$ echo -n 'test_user:test_pass' | nkf -MB ; printf 'n' dGVzdF91c2VyOnRlc3RfcGFzcw==
これを使って実際にアクセスしてみます。
$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET /k_test_tmp/index.html HTTP/1.0 host: hoge.hoge.jp:80 Authorization: Basic dGVzdF91c2VyOnRlc3RfcGFzcw== HTTP/1.1 200 OK Date: Tue, 24 Jul 2007 06:23:49 GMT Server: Apache Last-Modified: Tue, 24 Jul 2007 04:29:40 GMT ETag: "83b8f-b-d7797500" Accept-Ranges: bytes Content-Length: 11 Connection: close Content-Type: text/html; charset=none test page! Connection closed by foreign host.
エラーも出力されず、テキトーに作った感がすごく漂ってるindex.htmlの中身が確認できました。
しかし、ここからが本エントリーの肝です。もう気づいている人がいると思いますがパスワードはMIME base64でエンコードされた結果です。つまりデコードすると簡単に内容が分かります。
$ echo -n 'dGVzdF91c2VyOnRlc3RfcGFzcw==' | nkf -mB ; printf 'n' test_user:test_pass
もし、パケットを盗み見られていてこのことを知っているのであれば、パスワードが盗まれてしまう可能性が非常に高いということが想像できると思います。お手軽に設定できる認証なのですが、盗聴されるととても弱いことを覚えておくと良いのではないでしょうか。
次回はDigest認証について書いてみたいと思います。


