アクセス制御


Table of Contents

1. アクセス制御
アクセス制御ってなに?
アクセス制御の様相
アクセス制御=OS によるリストとパスの照合
クレデンシャル(Credential)をお持ちください
門番への攻撃=インターネットワーム
認証とアクセス制御の独立
クレデンシャルに記録される情報とアクセス制御リスト
認証は知識の一致
クレデンシャルを渡される=クレデンシャルを持った人になる
アクセス制御のプログラミング

Chapter 1. アクセス制御

アクセス制御ってなに?

だんだん世の中が不穏になってきました。何処に入るにも身分を証明するものを見せろと言われます。ほんと嫌になってしまいます。だれの所為だろう?

出入りの許可の仕組みには沢山の関係者(物)がかかわっています。まず、守られるヒト(モノ)、守るヒト、守られているヒトに会いたい(接触したい)ヒト、です。ここでは、それぞれを、アリス女王、近衛兵、ボブ艦長とします。ボブ艦長が敵国への先制攻撃作戦について承認を求めにアリス女王に謁見に行こうとしているとします。

ボブは久しぶり帰国し陸に上がってびっくりしています。すっかり国内が戦時状態になってしまっていました。ボブは久しぶりに自分の古いフェラーリのハンドルを握り王宮に乗り付けました。また制服は着けずにイタリアンスーツで決めていまいした。タダでさえ艦長が王宮に行くというのは敵国のスパイにあやしまれるので、私用という雰囲気にしておきたかったからです。実際、ボブはアリスと大学時代にクラスメイトだったので、アリスが女王に即位しても友人としてよく王宮に出入りしていました。

王宮の門にさしかかり、近衛兵に「やぁ、ご苦労さま、アリスに会いに行くんだ。門を開けてくれないか」と話しかけました。まだ平和だったころは、それで何の問題もありませんでした。その頃の近衛兵はのんきなものだったし、何度もくるので車と顔を覚えられていましたから。下手に自分の身分を言うと彼らが緊張してしまうので、大学時代のクラスメイトであることしか告げていませんでした。

この若いジェンソン近衛兵は「申し訳ございませんが、アリスとはどなたの事をおっしゃっているのでしょうか?まさか、女王陛下のことででしょうか?」と答えました。ボブは「王宮でアリスと言ったら彼女のことに決まってるだろう。今日は遊びに来たんじゃないんだ。早く門を開けてくれないか」と言いました。「それはできません。それにあなたはどなた様ですか?よろしければ身分証を拝見できませんでしょうか?」ボブは身分を明かしたくは無かったので「アリスの大学の時のクラスメイトのボブ・カールソンだ。どうなってるんだ。早く開けてくれ」と言い、軽く近衛兵を睨みました。ジェンソンはこの不審な男の鋭い眼光から、この男が普通ではない事を察知しました。

この門は正面の正門ではなく通用門でした。なので近衛兵はジェンソンと守衛所の中にいるもう一人だけでした。しかしこの派手な車で乗り付けた一見ヤクザ風の男とジェンソンのやりとりを見ていた相棒が他の門や詰所に連絡したので、騒ぎを聞きつけて近衛兵が集まり始めました。

ジェンソンとボブは睨み会っていまいした。その時、初老の近衛兵が近寄ってきました。他の近衛兵たちが敬礼をしはじめした。車に近寄ると「ファット・ブラック・ホーネットは元気かい?」。この初老の近衛兵は車とその男の恰好をみて、昔よく遊びにきていたワルガキではないかと思ったのでした。ボブは懐かしい言葉を聞いて思わず昔と同じ返事をしました「俺のアリスはデブじゃない!」と。

ボブは若い頃、海軍でF/A-18C戦闘戦闘機のパイロットでした。いつもボブは他の機より多めに爆装して飛び立ち、正確な爆撃により多くの戦果を上げていました。しかし、搭載する爆弾が多くて重いため、発艦はヨロヨロ、目的地までの飛行はノロノロ、作戦行動中はいつも撃墜をぎりぎりでかわしヒヤヒヤで、仲間は彼の黒い飛行機をデブの黒いスズメバチと揶揄していました。しかし彼自身は自分の戦闘機のことをアリスと呼んでました。

「ジェンソン君。この方は女王陛下のご学友で海軍パイロットの方だ。カールソンさん。お久しぶりですね。さすがに昔のワルガキの面影はないですな」。ボブは「あぁ。やっぱりチャーリーだ。おっちゃんもフケたね。お互い年をとったって事だ」と軽く答えました。「まったく、口がへらないヒトだね。今日はなんの用だい?女王陛下はお忙しいんだよ」。ボブは「今日は仕事なんだ」と言いながら身分証を見せました。初老のチャーリー近衛兵は最敬礼をして「准将閣下!大変失礼を致しました。ジェンソン。開門せよ」。「まったまった、敬礼は止してくれ。みんなにばれちゃうじゃないか。今は急いでるんだ。平和になったらまた遊びにくるよ。それから、俺が来たことは内緒にしといてくれ。」と行ってフェラーリで門をくぐって行きました。

ボブは無事王宮に入ることができ、アリス女王に極秘の作戦を伝えることができました。敵国の弾道核ミサイル基地を機動艦隊から発進した攻撃機により精密爆撃を行い破壊する先制攻撃により核ミサイルによる先制攻撃の脅威を取りのぞくという作戦でした。ボブは艦隊のパイロットたちをこの作戦の為に厳しく訓練してきていました。

この作戦はアリス女王の勅命により発動され、急襲を受けた敵国の戦略核ミサイル基地はことごとく破壊されました。これにより、弾道核ミサイルによる先制攻撃という外交戦略上の切札を失った敵国は、和平交渉のテーブルに着かざるを得なくなりました。

この爆撃ミッションを行ったF/A-18F戦闘攻撃機の機体は皆黒く塗られ、ファット・ブラック・スーパー・ホーネット部隊と呼ばれました。

アクセス制御の様相

さて、前節の(つまらん)お話の中にはアクセス制御におけるいくつもの様相がうめ込められています。

アクセス制御=OS によるリストとパスの照合

アリス女王がもし自衛できるのであれば、近衛兵は要りません。アリス女王自らが相手を認識し、見方なら受けいれ、敵なら攻撃し、関係ないなら排除します。そんな武闘女王がいたらかっこいいかも知れませんが、そんなことを女王自らがやっていたら、本来の仕事ができません。なので、信頼できる近衛兵に任せることになります。

一般的には計算機の内部にあって守るべきものと考えられるのはファイル(データ)でしょう。つまり動かない受動的なものなので、そもそも自衛等できません。一方それにアクセスしようとするのはプログラム(正確にはプロセスあるいはスレッド)で能動的なものですが、ファイルにアクセスするには OS の API を使わなければなりません。

OS はファイル等へのアクセス要求の API が呼ばれた時に、要求されたファイルに割り当てられたアクセス制御リストと、アクセス要求の API を呼んだプログラム(プロセスあるいはスレッド)が所持している識別情報(通行証のようなもの、クレデンシャル、チケット、トークン等と呼ばれる)の間でチェックを行い、その API を実行するかどうかを判断します。

クレデンシャル(Credential)をお持ちください

ボブ艦長は通用門から何気なく入って行きましたが、実際には宮殿の入口でまた足止めをくらいました。あたりまえです。チェックは何度も行われます。仕方無く、チャーリー近衛兵を呼んでまた開けてもらうことになりました。チャーリー近衛兵から「ボブさん。いまは平時じゃ無いんだから顔パスは無理だよ。私が署名したクレデンシャルです。これをお持ちください。何処でも通してもらえますよ。」と言ってクレデンシャルを渡されました。

計算機の中でも認証が済むとクレデンシャルが発行されます。UNIX系のシステムではユーザID/グループID という二つの整数がプロセスに割り当てられます。Windows (NT系) では、トークンという複雑な構造をもったデータが生成され、スレッドに割り当てられます。

現実世界では、相当に厳しいセキュリティが敷かれているところでもなければ、クレデンシャルを見せれば人の認証は省略されます。計算機の中でも同様で、プロセスやスレッドがファイル等のオブジェクトにアクセスする API を呼びだす際に、OS はクレデンシャルをチェックします。その度に認証が行われることはありません。

最近流行りの Single Sign On というのは、これを単一のサーバの中ではなく、サーバのグループの中で行うというものです。なので、OS が使うクレデンシャルとアクセス制御リストだけでなく、SSO システムとしての別のクレデンシャルとアクセス制御リストをが使われます。なので、非常に複雑で管理が難しいシステムになります。サーバー・グループが Windows だけで構成すると、OS と SSO システムでクレデンシャルとアクセス制御リストを統合することもできますが、それでもかなり複雑です。

門番への攻撃=インターネットワーム

門番は外部からの直接的な接触を受けます。通常は認証によって相手を識別して、それに応じたクレデンシャルを発行し、それによって相手の行動に制御(制限)を加えます。しかし、門番も無敵ではありません。インターネットワームは門番に攻撃を仕掛けます。

ワームはネットワークファイル共有やWebサーバ等に一見普通のお客(クライアント)のフリをして接続します。しかし、そこで異常な(通常は異常に大きな) リクエストを出します。サーバプログラムはリクエストの解析をする際にあまりのデータの多さにクラッシュしてしまいます。そうすると、だれもサーバにアクセスできなくなります。比較的ヌルい攻撃である DOS (Denial of Service)攻撃はこれで成立します。

例えて言うなら、門を守る近衛兵を気絶させて、そのまま逃げてしまうようなものです。

もっと厳しい攻撃では、サーバプログラムがクラッシュして制御不能になった瞬間にプロセスを乗っ取ってしまいます。これはスタックを壊して、リターンアドレスを書き換えてしまうことで、関数の呼び出しから帰ったところが本来のサーバのプログラムの中ではなく、送り込んだリクエストにまぎれこませた小さなプログラムになるようにします。つまり、そのプロセス(あるいはスレッド)の制御を奪うのです。制御を奪われたプロセスのクレデンシャルはまんまと侵入者の手に落ちます。しかも、これは OS も感知できません。

例えて言うなら、門を守る近衛兵を出会い頭に気絶させて、制服などを奪って近衛兵になり済まして王宮内に侵入するようなものです。この状況では、侵入者は門番が持っていたクレデンシャルを持つことになります。通常門番は来客にクレデンシャルを発行できる程の権限をもった特別なクレデンシャルを持っています。なんでもやり放題です。新たな侵入者を招き入れる事など簡単ですし、門を閉じてしまうこともできます。

認証とアクセス制御の独立

先節のような攻撃は日々進歩し強化されていますので、それにも対応しなければなりません。兵士であれば、若くて力強く、かつ、新しい戦法の訓練を受けたものでなければ努まりません。

一方、相手や状況を識別する能力は知識の量に依存します。よって、経験の少ない兵士には努まりません。現実世界では教科書にはのっていない状況というのが常に起こります。不測の状況に対応できなかた兵士はそこで終っています。不測の事態に対応して生き延びた者だけが、それを伝える事ができるのです。

門を物理的に守るのは新しい武器を手にした若い力強い兵士が適していますが、相手の識別や状況の判断は経験を積んだ者が行う必要があります。

計算機で言えば、認証とアクセス制御を独立したモジュールにする必要性があるという事です。実際、最近の UNIX 系システムでは PAM (Portable Authenticate Module)など用いられています。パスワードデータベースにアクセス制御モジュールが直接アクセスすると全員のパスワードが盗まれる可能性が高くなります。

クレデンシャルに記録される情報とアクセス制御リスト

門番が相手が誰であるかを認識できたらからといって誰でも通してよいわけではありません。有名人なら顔パスってわけにはいきません。女王様からもらった誰なら通して良いかのリスト(アクセス制御リスト、ACL)があるはずです。

しかし、リストが個人名によって書かれていたら大変です。着任したばかりの官房長官の名前は載っていないかもしれませんし、逆に収賄罪で解任された大臣の名前が消し忘れて残るかもしれません。つまり、リストには個人の名前はかかれません。管理上の分類コードごとに通して良いかが書かれています。

同じように訪問者が渡されるクレデンシャルにも、訪問者はだれかという情報だけではなく、管理上の分類コードが記録されます。

ボブ艦長がチャーリー近衛兵長から渡されたクレデンシャルにはボブの役職が書かれているのではなく、ボブの名前と女王様の大事なお客様である事を示すコードが書かれています。

認証は知識の一致

ボブ艦長とチャーリー近衛兵は、短い会話のなかで相手を認識しました。これは、この二人しか知らない会話のパターンが一致したことを確認できたからです。

双方が、相手が提示した情報と自分が相手しか知らないと確信ししている情報の一致を確認したので、相手を特定できたのです。

この一致を調べる情報は通常は秘密にします。つまり、相手しかしらないと言うことを積極的にに実現するためです。しかし、秘密である必然性があるのではありません。量の問題です。積極的に秘密にすれば小量の情報でもよいです。一方、積極的に秘密にはしていない情報であっても、大量の情報の一致というのは偶然には起こりません。双方が大量の情報を共有しているのであれば、小さな秘密と変わらないレベルの信頼性があります。

暗号は破られる可能性が有ることを考慮する必要があります。

ボブ艦長とチャーリー近衛兵は長いつき合いという大量の共有情報があるので、小さな確認だけで済みました。しかし、初対面のジェンソン近衛兵はそうはいきません。仕方がないので身分証という手段を取ろうとしました。身分証は他の信用できる機関が発行したものです。

もし、ボブ艦長が偽者で偽造した身分証を提示したら、ジェンソン近衛兵は通してしまったでしょう。しかし、チャーリー近衛兵をだますのは容易ではありません。例え整形しても、この二人の長いつき合いにもとづく想い出(共有情報) までコピーするのは困難です。

暗号の章で詳しく説明しますが、暗号の強度は暗号を解読するのに要する計算量の多さです。要するに解読するのに時間がかかれば良いのです。更に突き詰めれば、現実世界の話としては、暗号を破ることにかかるコストが暗号を破って得られるコストより多ければ暗号としての価値があるのです。つまり、暗号の強度を増す事だけが認証の強度を増す唯一の方法のわけではありません。

クレデンシャルを渡される=クレデンシャルを持った人になる

さて、ボブ艦長が実際に王宮に入るという例えで説明をしてきました。しかし、これは物理世界の話です。計算機の世界で人間に該当するのは動いているプログラム(プロセスあるいはスレッド)です。物理世界では、外部からアクセスするというのは人間がその空間に入る事を意味しますが、計算機の世界ではどうなのか?

例えばネットワーク経由で ssh 等でログインするという状況を考えてみましょう。ログインに成功すると何が起こるでしょうか?サーバマシンの中にリモートから自由に制御できるプロセス(通常はシェル)が起動されます。

これは例えて言うなら、認証が済んで発行されたクレデンシャルを門番の近衛兵に持たせて、あなたが物理的に王宮内に入る代わりに、その近衛兵をリモコン操作であなたの代わりに王宮の中をうろつかせるようなものです。これを偽装(Impersonate)と言います。

このリモコン操作は完全に自由というものではありません。まず、予め用意されたコマンド(インストールされているプログラム)しか受け付けません。また、使えるコマンドも所持しているクレデンシャルによって制限を受けます。

ネットワーク経由ではログイン以外にも色々な種類のサーバにアクセスできます。これは入ろうとした門が違うようなもので、その門を守っている近衛兵が受け付けるコマンドが異なるという事です。

アクセス制御のプログラミング

アクセス制御の仕組みを実現するのは OS (カーネルや標準ライブラリ)です。よって一般的なシステム開発では、アクセス制御をどのように使うかが重要になります。

アクセス制御に使われる API としては各種のオブジェクト(ファイルなど)のアクセス制御リストを変更するものと、プロセスやスレッドのクレデンシャルを変更する(偽装する)ものがあります。どちらも積極的にアクセス制御をプログラムする場合に使うもので、レベル(2,2)以下の人には無縁なものです。

通常のアプリケーションでは、そのアプリケーションを起動したシェル(Windows ならエクスプローラ、MacOS なら Finder)と同じクレデンシャルが渡されます。よってファイルにアクセスできるかどうか等はシェルと同じアクセス権限を持つことになります。普通はそれで問題はありません。

一方、普段から気を付けないといけないのが、ファイル等のオブジェクトの生成です。UNIX なら creat() や open()、Windows では CreateFile() 等です。これらの API にはファイルが生成されるときに与えられる ACL を設定する引数があります。よく有るミスがファイルを生成したユーザ(Owner)しか開けないようにしてしまうケースです。同様に間違えやすいのは、だれでも書き換える可能にしてしまうことです。後者は思わぬセキュリティホールの原因となりますので注意しましょう。