3 Minutes NetWorking
No.77

3Minutes NetWorking

第77回HTTP(8) 認証

■ 匿名アクセス

インター博士

さて、ネット君。HTTPで最初にした話を覚えているかね?
WWWは3つの技術が基盤となっている、という話だ。

ネット助手

3つの技術? HTTPとHTMLとURIでしたよね?

インター博士

うむ。そこでURIの話をしたはずだ。URI、というかURLの記述はこうだったな。

  • http://ユーザ名:パスワード@Webサーバ:サーバポート番号/ファイルの場所
ネット助手

でしたよ? ユーザ名とパスワードとサーバポート番号は省略可能でしたよね?

インター博士

うむうむ。今回話すのは、その省略されたユーザ名とパスワードの話だ。
ネット君、WWWとはなんだった?

ネット助手

うぇ? 「3つの基盤技術を使った広域情報共有システム」でしたっけ?

インター博士

そうだ。WWWは「広い範囲での情報共有」を前提としているので、FTPやTELNETと違い特にユーザを指定しなくても使用できることがもともとの発想だ。「誰でも簡単に情報を見ることができる」ようにしてるわけだな。

ネット助手

なるほど。誰でも見れるから、ユーザ名やパスワードは省略可能なわけですね。

インター博士

そういうことだな。このように、誰でもアクセスできるのを匿名アクセスと呼ぶ。

ネット助手

とくめい…。名前を隠してアクセスするんですね。

インター博士

名前を隠して、というか。実際は「誰でアクセスしても同じユーザでアクセスしている」という形になるわけだが。

ネット助手

「誰でアクセスしても同じユーザでアクセスしている」?

インター博士

そうだ。誰でアクセスしても同じ特定のユーザでアクセスしている扱いになるわけだな。これを「匿名ユーザ」と呼ぶ。
例えば、WindowsのIISでは、「IUSR_」で始まるユーザが匿名ユーザとして用意されている。

IISの匿名ユーザ

[Figure77-01:IISの匿名ユーザ]

ネット助手

へ〜。

インター博士

Apacheの場合はいろいろあるのだが。
ともかく、基本はこの「匿名アクセス」による「誰でも自由に閲覧が可能」なシステムがWWWというわけだ。

ネット助手

誰でアクセスしても同じユーザだから、名前が隠れるわけですね。
で、そのおかげで自由に見れる、と。

インター博士

だが、Webページによっては特定のユーザしか見て欲しくないページだってあるわけだ。
会員制のページだったり、コミュニティのページだったりすることもあるわけだしな。

ネット助手

そうですね、そういうこともありますよね。

インター博士

そのために使われるのが、認証というわけだ。

ネット助手

認証? あうせんてぃけーしょん?

■ アクセス認証

インター博士

どっちかといえば、「オーセンティケーション」だと思うが。
まぁともかくだ、認証とは「なんらかの手段を用いてアクセスするユーザを特定する」ことだ。

ネット助手

アクセスするユーザを特定する? 誰が特定するんですか?

インター博士

サーバソフトがだ。「今ネット君がアクセスしにきている」とわかるようにする、ということだ。

[Figure77-02:認証]

ネット助手

は〜、その人がホントに会員かどうか「特定」しているわけですね。

インター博士

うむ。まぁ、実際今まで説明してきたプロトコル、TELNETやFTPなどでも行われている処理だな。

ネット助手

ん〜、TELNETは仮想端末へのログイン、かな?
FTPだとUSERやPASSコマンドで「認証」とかそういう話をしてたような。

インター博士

「してたような」ではなく、「してた」のだが。
つまり、この認証というものはHTTPに限らず、TELNETやFTP、後で説明するPOPなどでも使われているものだ、ということだ。

ネット助手

なるほどなるほど。
あれですね、ユーザIDとパスワードで「特定」するんですよね?

インター博士

まぁ、そういう場合がほとんどだな。いわゆるアカウントという奴だ。

ネット助手

あかうんと?

インター博士

「アクセスする権限を保持すること」かな? 多くの場合ユーザIDとそれを確認するためのパスワードだな。正規の認められたアカウントによるアクセスか、ということを「認証」する、というわけだ。

ネット助手

ふむふむ。

インター博士

ユーザIDとパスワードという形が多いが、電子証明書による方式もある。SSLクライアント認証で使われる方式だな。

ネット助手

電子証明書? SSLクライアント認証?

インター博士

ま、それについてはまたいずれ話そう。
ともかくだ。この認証はいくつか方法があるのだが、HTTPは次の2種類の認証方式を持っている。

  • 基本(Basic)認証
  • ダイジェスト(Digest)認証
ネット助手

べーしっく、と、だいじぇすと?

インター博士

そうだ。CGIを使ったり、SSLを使ったりで他にも方法があることはあるが、HTTPが基本として持っているのはこの2種類だな。
IISの設定画面を見てみよう。

IISでの認証つきアクセスの設定

[Figure77-03:IISでの認証つきアクセスの設定]

ネット助手

ん〜〜〜。博士? 3つありますよ? それに、ダイジェスト認証はグレーアウトして選べなくなってますけど?

インター博士

あぁ、IISの場合、ダイジェスト認証にはドメインが必要なのだよ。
それとWindows統合認証はIISの独自方式だ。なので、基本的にはさきほどあげた基本とダイジェストの2つだな。

ネット助手

へ〜。

■ 基本認証

インター博士

では、まず基本認証から説明しよう。基本認証はHTTP1.0からある認証方式だ。
基本認証を有効にしたWebサーバで、アクセスするアカウントに制限がかかっているページにアクセスすると、次のような状態になる。

ユーザ名とパスワード入力画面

[Figure77-04:ユーザIDとパスワード入力画面]

インター博士

これはIEでの画面だが、ユーザIDとパスワードの入力を促されるわけだな。

ネット助手

「アカウントの認証」が必要なんですね!!

インター博士

うむ、覚えた言葉をすぐ使ってみたがるという、子供じみたところは非常に好感が持てる。

ネット助手

そうですか、えへへ。

インター博士

褒めてねぇ

ネット助手

はうっ。

インター博士

ともかくだ、これを実現するのに使われるのが、HTTPレスポンスメッセージのメッセージヘッダの中の、「WWW-Authenticate」だ。

ネット助手

だぶりゅだぶりゅだぶりゅおうせんてぃけいと? 第73回のメッセージヘッダの一覧の中にありましたっけ……?

要求応答一般エンティティ
AcceptAccept-RangesCache-ControlAllow
Accept-CharasetAgeConnectionContent-Encoding
Accept-EncodingETagDateContent-Language
Accept-LanguageLocationPragmaContent-Length
AuthorizationProxy-AuthenticateTrailerContent-Location
ExpectRetry-AfterTransfer-EncodingContent-MD5
FromServerUpgardeContent-Range
HostVaryViaContent-type
If-MatchWWW-AuthenticateWarningExpires
If-Modified-Since  Last-Modified
If-None-Match 
If-Range
If-Unmodified-Since
Max-Forwards
Proxy-Authorization
Range
Referer
TE
User-Agent

[Table73-01:メッセージヘッダ]

ネット助手

博士っ!! 「応答」の中にありますよっ!!

インター博士

当たり前だ。

ネット助手

あれ? 「要求」の「Authorization」も色が変わってますけど、これは何か?

インター博士

うむ。クライアントがHTTPレスポンスメッセージにユーザ名とパスワードを入れて送る場合に使われるのが、「Authorization」なのだよ。実際の動きはこうなる。

[Figure77-05:基本認証]

ネット助手

アクセスしようとすると「認証失敗」と、認証方式がくるので、そこでユーザIDとパスワードを入れて送り返すんですね。

インター博士

うむ、そうだ。
ではこの動きをEtherealでキャプチャしたものを見てみると。

Responseメッセージ

[Figure77-06:Responseメッセージ]

インター博士

クライアントが最初に送ったリクエストに対するレスポンスメッセージだ。
IISなので「401 Access Denid(アクセス拒否)」というメッセージになっているが、やってることは同じだ。

ネット助手

「401」のレスポンスコードと、「WWW-Authenticate」のメッセージヘッダが確かにありますよ?

インター博士

うむ。そしたら、クライアントは「Authorization」にユーザIDとパスワードを入れたリクエストメッセージを返すんだったな。

Requestメッセージ

[Figure77-07:Requestメッセージ]

ネット助手

ありゃ? なんですこの「dGVzdDp0ZXN0」っての? 変なユーザIDですね。

インター博士

あぁ、実際は送られる「ユーザID:パスワード」はBASE64という方式でコード化されて送られる。この「dGVzdDp0ZXN0」ってのがそうだ。

ネット助手

ははぁ、べーす64。

インター博士

ま、BASE64はまた後で説明するとして、このようにやり取りされるわけだな。

ネット助手

なるほどです。

インター博士

ただネット君、1つのページで認証が成功したとして、同じディレクトリにある他の認証が必要なページにアクセスする場合、どうなるんだね?

ネット助手

え? ええぇ?
他にも認証が必要なページですか? じゃあやっぱりまた認証が必要なんじゃないですか?

インター博士

うむ。同じディレクトリや下位ディレクトリにあるページが認証が必要ならば、やっぱり認証を再び行う必要があるのだ。なんとも面倒じゃないかね、ネット君

ネット助手

あ〜、確かに面倒かも。
毎回毎回ページを移動するたびにユーザIDとパスワードを入れるのは結構大変ですよね。

インター博士

だろう? なので、そのページのディレクトリが同じもしくはその下ならば、「認証が必要であろう」と考えて、最初から「Authorization」をつけてリクエストができるのだよ。

ネット助手

ははぁ、「401 Unauthorized」を受け取る前に、「さっきのページは認証が必要だったから、この同じディレクトリにあるページも認証が必要だろう」って考えるんですね?

インター博士

そういうことだ。この場合、前のページで送ったユーザIDとパスワードを「Authorization」に入れて、送ることができるのだ。

ネット助手

なるほど。それなら毎回ユーザIDとパスワードを入れる必要がないですね。

インター博士

うむ、ただし、ブラウザを閉じてしまってはダメだがな。

ネット助手

あ、そうなんですか。

■ ダイジェスト認証

インター博士

さて、基本認証を使えば、ページを「権限のないアクセスから保護」できるわけだが。
基本認証には欠点がある。ヒントは[Figure77-03]をよく見てみたまえ。

ネット助手

ん〜? IISの画面ですか?
……「パスワードはクリアテキストで送信されます」かな?

インター博士

うむ、その通り。

ネット助手

やりぃ。

インター博士

まぁ、他にそれらしいところがないわけだから、気がつかない方がどうかしてる。
まさか当たって喜ぶようなことは考えられないわけだが。なぁ、ネット君。

ネット助手

え、えぇ、そりゃそうですよ、そこしかないですよね。

インター博士

うむ。基本認証の欠点はまさしくその括弧書き、「パスワードはクリアテキストで送信」という点だ。つまり、パスワードがそのまま送られてしまう、というところだ。

ネット助手

パスワードがそのまま、クリアテキスト……、TELNETでも同じ事を聞かされた記憶が。

インター博士

第53回だな。うむ、まったく同じ事を言った。「暗号化されていないため、盗聴の危険性がある」と。セキュリティ面で弱いのだよ。

ネット助手

あれ? でもさっきべーす64とかいうのでコード化されるっておっしゃってませんでしたっけ?

インター博士

あぁ、BASE64でコード化されるが、戻すのが簡単なのだよ。対応表さえあれば簡単に元に戻せる。

ネット助手

あ、そうなんですか。

インター博士

そうなのだ。なので、パスワードを見られないようにしてやりとりをしたいわけだ。
そこで使うのがダイジェスト認証なわけだよ。ダイジェスト認証の場合、実は入力画面が異なる。

ユーザ名とパスワード入力画面(Digest)

[Figure77-08:ユーザIDとパスワード入力画面(Digest)]

ネット助手

あ、なんか微妙に違う。これで区別するんですね。

インター博士

さて、そのダイジェスト認証がどのようにパスワードを隠しながらやりとりするかというと。
チャレンジ&レスポンス方式を使う。

ネット助手

ちゃれんじあんどれすぽんす?
挑戦と応答?

インター博士

うむ。これはPPPのCHAPでも使われている方式だ。
これには一方向関数のハッシュ関数が使われる。

ネット助手

おおぅ、なんだかよくわからない言葉が連発されてきましたよ、博士。ピンチです。

インター博士

うむ、そうか。一方向関数を説明しよう。

[Figure77-09:一方向関数・ハッシュ関数]

ネット助手

へ〜、へんな関数ですねぇ。全然別のビット列を作り出すなんて。

インター博士

そうなのだ。しかもそのビット列は長さが一定で、元のビット列を推測できなくて、同じビット列が出来にくいし、作りにくいという特徴をもっている。有名なものではMD5SHA-1がある。

ネット助手

しゃーわん。

インター博士

現在の暗号・認証技術の中でも必須技術の1つがこのハッシュ関数だ。

ネット助手

へ〜。で、これを使うとどうなるんです?

インター博士

うむ。実際のダイジェスト認証で使われている計算は結構複雑なので、単純化したもので説明しよう。

[Figure77-10:ダイジェスト認証]

ネット助手

ん? ん〜?
ちょっと待ってください。混乱しています。

インター博士

気にするな、いつものことだ。

ネット助手

え〜っと、サーバはなんかしらの文字列を入れて、レスポンスを返す。
クライアントはユーザIDとパスワードと文字列をハッシュして、ハッシュ値を作り出す。

インター博士

そうだ。

ネット助手

そのハッシュ値をサーバに送る。サーバは自分に登録してあるユーザID、パスワード、送った文字列をハッシュして、ハッシュ値を作り出す。

インター博士

ユーザID、パスワード、文字列という同じモノでハッシュ関数を計算しているから、ハッシュ値が同じものになるはずだ。そうでなければ、ユーザID、パスワード、文字列のうちどれかが違うということになる。

ネット助手

文字列が違うわけはないから、ユーザIDかパスワードが違う…。

インター博士

逆にいえば、一致するなら、クライアントのユーザID、パスワードと、サーバに登録してあるユーザID、パスワードは同じモノだという証明になる。

ネット助手

つまり、認証される……なるほど。

インター博士

どうだね、ネット君。この方式ならばパスワードはやりとりされないのだよ。

ネット助手

ん〜っと、やりとりされるのは「文字列」と「ハッシュ値」だけ、ですね。

インター博士

パスワードと関連してるのはハッシュ値だが、ハッシュ関数の特徴より、ハッシュ値がわかったとしても元はわからない、つまり、パスワードはバレない、ということになるわけだ。

ネット助手

や、上手く考えられてますね。

インター博士

だろう?
だが、実際はダイジェスト認証といえども、すごくセキュリティが高い、というわけではない。

ネット助手

え? そうなんですか?

インター博士

うむ。というよりも、SSLの方がセキュリティが高い、といったほうがいいかな。
なので、実際は認証としてはダイジェスト認証よりもSSLを使うのが現在の主流だな。

ネット助手

は〜〜。

インター博士

さてさて、今回はこのぐらいにしておこう。

ネット助手

はい。

インター博士

とりあえず、HTTPはこれくらいにしておこう。
次回からはまた別のプロトコルを説明する。

ネット助手

了解です。 3分間ネットワーキングでした〜♪

匿名アクセス
[Anonymous Access]
読みは「あのにます あくせす」。
いろいろある
Linuxだとrootだったり、apacheだったり、www-dataだったり。
Windows版ApacheはSystemでした。
認証
[Authentication]
アカウント
[Account]
ネットワーク上のコンピュータを使用/アクセスするための権限。
電子証明書
[Digital Certificate]
公開鍵暗号化方式を利用した、電子署名で使用される証明書。実質的には公開鍵の正当性を証明するデータのこと。
ドメイン
[Domain]
WindowsサーバOSによって管理される組織単位。DNSのドメインとは異なる。
区別するためこちらのドメインは「Windowsドメイン」などと呼ぶ。
Windows統合認証
主にWindowsドメインにログオンしているユーザを対象に、自動的にそのアカウントを使って認証を行う方式。Windowsドメイン環境だととても便利。
BASE64
MIMEで使われている符号化方式の1つ。任意のビット(日本語なども含む)をASCIIコードに変換する。詳しくは後述。
CHAP
[Challenge-Handshake Authentication Protocol]
PPPの認証で使用されるプロトコル。
MD5
[Message Digest 5]
一般的なハッシュ関数で使われている技術も多い。
SHA-1
[Secure Hashing Algorithm 1]
MD5よりも強固なハッシュ関数。現在ではMD5に代わり頻繁に使われている。
SSL
[Secure Socket Layer]
共通鍵暗号化方式、秘密鍵暗号化方式、PKIを使った暗号・認証技術。
HTTPでSSLを使った場合は、HTTPSと呼ばれる。
ネット助手ネット君の今日のポイント
  • HTTPは通常は匿名アクセスで誰でもアクセスできる。
  • 特定のユーザのみアクセスできるページなどには認証が必要。
  • HTTPでは2種類の認証方法がある。
    • ユーザIDとパスワードで認証を行う基本認証。
    • 安全にパスワードをやりとりするダイジェスト認証。
  • 現在では認証はSSLが主流。

3 Minutes NetWorking No.77

管理人:aji-ssz(at)selene.is.dream.jp