• 地獄の認証

ユーザーが本人かどうかを確認することを「認証」という。たとえば、パスワード認証とは、本人だけしかしらないはずのパスワードを入力することで、本人であることをコンピュータが確認する。

コンピュータが目の前の1台だけなら、これで終了だが、ネットワークに接続していて、たとえば、ファイル共有とか、印刷などを、別のマシン(サーバー)が実行しているサービスを利用して行う場合、サービス側でもユーザー認証が必要になる。

サーバー数が増えると、毎回のログイン手続きが面倒になる。そこに登場したのが「Single Sign on」(SSO)という考え方だ。なお、どのマシンでも一人のユーザーが使うパスワードを1つだけにするものとは異なり、一回のサインイン処理で、ネットワーク内のサービスへのサインインを抑制するものをSSOという。

SSOを実現する初期のシステムの1つとして、米国のマサチューセッツ工科大学のAthenaプロジェクトで生まれたKerberosがある。AthenaといえばX Windowが著名だが、このプロジェクトでは、1万台程度のワークステーションがネットワーク接続された実行環境を想定していた。こうなると、ユーザー管理だけでも大変そうだが、利便性を高めるためにシングルサインインを可能にすることが求められた。そこで開発が行われたのがKerberosである。そもそもKerberosとはギリシャ神話に出てくる冥界(地獄)の番犬のことで、日本ではギリシャ語読みで「ケルベロス」と発音する。ケルベロスは、冥界から死者が出ていかないように見張る怪物で、3つの首を持つ犬や獅子の体を持つという。その兄弟にはヒドラやキマイラがいるとされる。

ケルベロスでは、どこかにユーザーやサービスのIDとパスワードに相当するものを記録したネットワーク情報データベースがあり、それが安全に利用できることが前提にある。たとえば、Kerberosサーバーとネットワーク情報データベースが同一マシン上で動作しているなどである。

ケルベロスでは、ユーザーやサービスなどの「認証」対象をプリンシパルと呼ぶ。ユーザーは、クライアントマシンにログイン(サインイン)する。このとき、ネットワーク情報データベースを使い、ユーザーが入力したパスワードで認証を行う。

次にクライアントマシン(で動作しているソフトウェア)は、ケルベロスのKDC(key distribution center)にユーザーIDを送信する。KDCは、AS(Authentication Server)とTGS(Ticket Granting Server)から構成されていて、クライアントマシンは、最初ASと通信を行う。


ユーザーがクライアントマシンにログイン
クライアント ⇒ ユーザーID  ⇒ KDC(AS)

ケルベロスでは、ユーザーのパスワードをユーザーの秘密鍵として扱う。このため、ネットワーク情報データベースにアクセスが可能なASは、送られてきたユーザーIDでユーザーの秘密鍵を入手することが可能になる。これを使って、ASは、TGT(ticket-granting ticket。チケット発行許可チケット)とクライアントが、TSGとの通信を暗号化する「セッション秘密鍵」の2つをユーザーの秘密鍵で暗号化してクライアントマシンに返す。なお、TGTは、TGSの秘密鍵で暗号化されているため、クライアント側での改変が不可能になっている。ケルベルスの処理上はクライアントはTGTの中身が分からなくても特に問題はない。


AS ⇒ ユーザーの秘密鍵で暗号化{TGT、セッション秘密鍵} ⇒ クライアント

さて、ユーザーがネットワーク内のサービスを利用する場合、サービスプリンシパルアクセスのためのチケットをTSGに発行してもらう必要がある。そのためには、前述のTGTと対象サービスを表すSPN(service principal name)をTSGに送信する。


クライアント ⇒ セッション秘密鍵で暗号化{TGT、SPN} ⇒ TSG

TSGは、TGTの正当性をチェックする。TGTはTSGの秘密鍵で暗号化されているため、TSGは自身の秘密鍵で正しい中身を取り出せたなら、KDCが発行した正しいTGTと判定できる。

TSGは、クライアントとサービスが暗号化通信を行うための秘密鍵を、毎回乱数から作成する。次に、ネットワーク情報データベースからサービスプリンシパルの秘密鍵を入手し、チケット情報を暗号化して「チケット」を作る。このチケット内にクライアント、サービス用セッション秘密鍵(サービス秘密鍵と略記)が含まれている。

TSGは、チケットとクライアント、サービス用セッション秘密鍵をクライアントの秘密鍵で暗号化してクライアントへ送信し、発行したチケットをサービスに送信する。


TSG ⇒ クライアント秘密鍵で暗号化{チケット、サービス秘密鍵} ⇒ クライアント

クライアントは、送られてきた秘密鍵で通信を暗号化してチケットをサービスに送信する。チケットは、サービスの秘密鍵で暗号化されているので、容易に検証できる。


クライアント ⇒ サービス秘密鍵で暗号化{チケット} ⇒ サービス

また、クライアントは、タイムスタンプをサービスに送り、サービスは、これをセッション鍵(チケットの中にある)で暗号化して送り返す。


クライアント ⇒タイムスタンプ ⇒ サービス
サービス ⇒ サービス秘密鍵で暗号化{タイムスタンプ} ⇒ クライアント

セッション鍵を知っているのは、クライアント、サービスとTSGのみなので、クライアントは、自分の送ったタイムスタンプが正しく暗号化されて戻ってくれば、サービスが正当なものであることを確認できる。以後は、サービスに依存したプロトコルで、クライアントと通信が行われる。

今回のタイトルネタは、「地獄の番犬」から、ジョン・W・キャンベル(John W. Campbell Jr)の「月は地獄だ」(ハヤカワ文庫SF。原題The Moon Is Hell!)である。タイトルからは、アクション的なものを想像してしまそうだが、いわゆる「宇宙ロビンソン・クルーソー」ものである。1719年に書かれた「ロビンソン・クルーソー」(原題The Life and Strange Surprising Adventures of Robinson Crusoe)はいまでも読み継がれているが、1つのジャンルを形成するほど、これをベースした小説や映画などが作られた。古くは、1874年にジュール・ベルヌが「神秘の島」(原題L'Île mystérieuse)を著し、最近ではアンディ・ウィアーの「火星の人」(2011年。2015年にオデッセイのタイトルで映画化)などがある。