Plan 9/9grid勉強会

3月のPlan 9勉強会に引き続き、@80nashiさんを講師に呼んで勉強会を開催した。当日の資料などは例によって探検隊のページに置かせてもらっている。今回のテーマは9gridとそのベースとなる認証、特にマルチドメイン認証の仕組みだった。この辺は興味はあってもなかなか個人で調べる気力が起きない分野だったので、勉強になった。記憶を頼りにまとめておきたい。

ベル研やLANLをはじめとした組織によって手持ちの計算資源を公開して相互利用しようとはじまったプロジェクトが9gridである。日本でも有澤先生のco.aichiやtip9ugなどがグリッドを構築していた。これが2005年ぐらいの話である*1クラウドの陰に隠れ、すでにグリッドコンピューティングは過去形で語られる方が多く、忘れている人も多いだろうが、Ian FosterがGridと言い始めたのが1998年で、産業界でも盛り上がったのが2000年代前半頃だ*2。グリッドの何がうれしいかというとシングルサインオンという認証の仕組みだ。あちこちに散らばった管理者の異なる計算機資源を利用したい場合、それぞれのサイト(管理ドメイン)で認証を受ける必要はなく、どこかで一度認証を受けるだけで、すべての計算機資源にアクセス可能になる。この相互認証されるサイトの集合を仮想組織(VO)などと言ったりする。グリッドの代表的なミドルウェアであるGlobus ToolkitJavaなどで実装された様々なパッケージの巨大な集合体で、認証の肝はGSI(Grid Security Infrastructure)と呼ばれている。これに対して、9gridはPlan 9の仕組みをそのまま利用して、外部ユーザにCPUサーバやファイルサーバを提供するという非常にシンプルなものだ。

9gridを構築するには、専用の認証サーバを一つ立てる方法と、各ドメインの認証サーバで相互に認証し合うマルチドメイン認証(MDA)の二つの方法が考えられる。ここではMDAを考える。認証サーバの仕事はドメインのユーザの鍵を管理することである。ここでいう鍵とはkey-valueペアのリストで、keyにはユーザ、認証ドメインプロトコル、パスワードなどがなり得る。

Plan 9のセキュリティシステムには認証サーバ以外にも重要なプレイヤとして認証エージェントfactotumが存在する。factotumはアプリと認証サーバの間のプロキシみたいな存在で、認証に関係することはすべてfactotumを介して処理される。アプリとfactotum間の通信は/mnt/factotum/rpcをread/writeすることで実行される。とは言っても直接そのファイルにアクセスするのではなく、ライブラリlibauthが用意されているので通常はそれを利用する。

cpu(1)コマンドを使ってドメインD1からD2のCPUサーバにアクセスする場合を考える。ここでローカル側のfactotumをfactotumC(クライアント)、リモート側のfactotumをfactotumS(サーバ)と便宜上呼ぶことにする。factotumSは認証を受け付けるドメインの鍵を管理する。通常は自分のドメインの鍵(ホストオーナの鍵)が一つ存在するだけであるが、MDAの場合は認証を受け付けるドメイン分の鍵を登録することになる。つまりD1のホストオーナの鍵をD2のfactotumに登録する必要がある。話はいきなり飛ぶが、認証プロトコルも何種類かあって、どの認証プロトコルを使用するか決定するためにp9anyというメタプロトコルが利用される。この例では、factotumSがp9sk1@D1(ドメインD1はp9sk1プロトコルを利用可能の意味。p9sk1はPlan 9 Shared Key Protocol)とp9sk1@D2で認証できると提示してくるので、factotumCはD1でp9sk1プロトコルを使って認証するとfacototumSにリプライする。これでD1側で認証して、D2のCPUサーバにアクセスできる。この辺はやっぱりちゃんとわかってない。

ここで問題となるのがユーザ名の衝突である。ドメインD1、D2の両方にglendaというユーザが存在すると(現在の仕組みだと)その二人を区別できないのだ。ちなみにUNIXのUIDのように(文字列表記とは別に)ユニークな整数値は存在せず、Plan 9のUIDは文字列そのものである。これを解決する手段の一つとしてユーザ名にドメイン名を追加して認証するというパッチを@80nashiさんが提案している。これでユーザ名の衝突は回避できるのだが実用上の細かな問題がいろいろあったりする。ユーザ名の長さが(ドメイン名を含めて)28文字というのは結構大きな制約だな。

んー、差し当たってはこれでもよさそうだが美しくはないよな。GlobusのようにユーザにX.509証明書を発行して、gridmapファイルを利用してUNIXユーザにマッピングするというのも大仰かつメンテナンスが面倒そう。ということで他に何かうまい方法はないのかなと思ったりする。

最後に9grid上のアプリケーションとしてジョブ実行系の話がいくつか紹介されたが、個人的にはMPIライクな並列通信をファイルシステムベースで実現するというMPライブラリが気になった。ソースへのリンクが切れているけどね。。。次回までにXCPUや9gridchanあたりをもう少し追ってみたいと思った。

ところで@80nashiさんは常にacmeプレゼンを実践されているが、私もPlan 9上でプレゼンしてみたいなと少し調べてroffでスライド作ってみることにした。スライド用のマクロもいくつか見つかったが、Russ Coxさんのpptマクロがシンプルでよさそうなので使ってみることにした。しかし、やはりここでも日本語の罠が。nihongoマクロを使ってみたが、どうもうまくいかないので諦めてしまった。たぶん日本語フォントを指定すればよいんだろうけど、どこでやればよいのかよくわからない。一応作ったスライドは(内容はないけど)さらしておく。

(追記:2010-06-10)Webサービスの世界でシングルサインオンというとSAML(Security Assertion Markup Language)がデファクト標準らしい。Google AppsSAMLに対応しているし、Internet2で開発されたShibbolethSAMLベースの認証認可システムである。Shibbolethは欧米を中心に研究機関で広く使われていて、NIIのUPKIでも使われるようである。

*1:ちょっと毛色が違うけど、PlanetLabがはじまったのは2003年頃。

*2:AmazonAWSとしてS3を始めたのが実は2002年なんだけど、EC2が始まる2006年にはクラウドbuzzwordになり始める。