オブジェクトを一意に決めるSID


△ 図をクリックすると拡大されます
図5●SID(セキュリティID)の例

△ 図をクリックすると拡大されます
図6●既知のSID(Well Known SID)の例
 SIDは,システム内やネットワークでアクセスできる他のシステムにおいて一意であることが保証されている。具体的なSIDの形は「S-1-5-21-917267712-1342860078-1792151419-501」のような英数字の羅列だが,このSIDを私たちが普段目にすることはあまりない(図5)。

 ユーザー・アカウントの管理ツールに表示されるのは,あくまでもアカウントを識別する名前の方だからだ。SIDの構成は「SIDを表す“S”」,それに「SIDのリビジョン」「識別子オーソリティ」「サブオーソリティ」の各数字をハイフンで区切った形になっている。

 この中の最初のいくつかの数字には,あらかじめ決められた値が用意されているものがあり,これを「既知のSID」と呼ぶ。そのため,もしエラー・メッセージなどにSIDが表示された場合は,問題がシステム側かユーザー側か,それともユーザーが独自に生成したものか,判断する規準にもなる(図6)。

ACLにはアクセスを決めるリストが書かれている


△ 図をクリックすると拡大されます
図7●セキュリティ記述子の中にある情報
 一方,「随意ACL(アクセス制御リスト)」とは,そのオブジェクトがアクセスされる場合のアクセス権の情報をリストにしたものである。アクセスするオブジェクトが持っているアクセス・トークンの中にも,アクセスされる場合の情報が含まれているのだ。この随意ACLは後述するセキュリティ記述子にも含まれている(図7)。

 アクセスされるリストは,「ACE(アクセス制御エントリ)」というものの集積になっていて,1件のACEには「アクセス制限の対象となるSID」「アクセスの種類」「アクセスの許可/拒否」が記録されている。すなわち,どのユーザーがどのようなアクセスができるかが書き込まれている。ACEを一つひとつ参照して行けば,誰が何をこのオブジェクトに対してできるのかが調べられる。もし,ACLにACEが1つも無い場合は,すべてのアクセスは拒否されてしまう。

 アクセス・トークンには,随意ACLのデフォルト値が含まれている。

 アクセス・トークンは,システムの起動時やユーザーのログオン時に作られる。その後,システムやユーザーが起動したプロセスやスレッドにも付加され,プロセスからファイルなどのオブジェクトにアクセスしようとすると,そのプロセスのアクセス・トークンが参照される仕組みだ。

セキュリティ記述子にもSIDとACLがある


△ 図をクリックすると拡大されます
図8-1●ACLを表示させるにはGUIとコマンドの2通りの方法がある(1)

△ 図をクリックすると拡大されます
図8-2●ACLを表示させるにはGUIとコマンドの2通りの方法がある(2)

△ 図をクリックすると拡大されます
図9●caclsコマンドの使い方
 次は,アクセスされる側のオブジェクトが備える「セキュリティ記述子」について説明しよう。

 セキュリティ記述子は,「所有者のSID」「随意ACL」「システムACL」といった情報を含んでいる(図7)。

 所有者のSIDとは,そのオブジェクトを生成したユーザーのSIDのこと。随意ACLとはアクセス・トークンで述べた通り,オブジェクトに設定されたアクセス権のリストのことである。もう1つのシステムACLは,オブジェクトへのアクセスが成功したり失敗したりしたときに,監査ログに記録するユーザーおよびグループを定義している。

 セキュリティ記述子の生成は,オブジェクトの生成タイミングと同じだが,アクセス権の継承を利用するかしないかで,生成の仕方が違う。

 例えば,アクセス権を継承する設定でフォルダを作っていると,そのフォルダ内で作ったファイルはフォルダのアクセス権を継承する。これは,すなわちセキュリティ記述子が継承されたことを意味する。

 もし,セキュリティ記述子が継承されない場合は,そのオブジェクトを生成するオブジェクトにあるアクセス・トークンが利用される。アクセス・トークンには,デフォルトの随意ACLがあるので,これを取り出してセキュリティ記述子を生成する。

 オブジェクトのACLやACEは,フォルダやファイルなどのプロパティ画面を表示すれば簡単に確認できる(図8-1図8-2)。しかし,バッチ処理などで,この情報を利用したい場合は,コマンド・ラインから参照できれば便利である。

 それには,コマンド・プロンプトからcaclsコマンドを利用する。caclsコマンドを使えば,NTFS上のファイルまたはディレクトリの持つ随意ACLを表示または設定できる(図9)。

アクセスするまでを通して見てみる
 最後に,ユーザーがファイルにアクセスするまでを,今まで登場してきた用語を使って解説してみよう。

 まず,エクスプローラなどでファイルをオープンしようとすると,ファイルを開くためのスレッドが生成される。このスレッドはオブジェクト・マネージャによってオブジェクトとして生成される。このとき,ファイルを開くというスレッドのアクセス・トークンもユーザーのアクセス・トークンを基に作られる。

 次に,オブジェクト・マネージャは,ファイル・オープンの要求に応えてファイル名からファイル・オブジェクトを検索し,そのハンドルを渡すことになる。そのためには,スレッドがファイルに対して読み込めるかどうかを調べる必要がある。そこで,オブジェクト・マネージャは,スレッドのオブジェクトからアクセス・トークンを,ファイル・オブジェクトからセキュリティ記述子を取り出し,セキュリティ参照モニターに渡す。この際,これらのセキュリティ情報は,いったん変更できないようにロックされる。

 セキュリティ参照モニターは,まずセキュリティ記述子に随意ACLがあるかどうかを調べる。もし無いようならアクセス許可となる。随意ACLがある場合は,次にアクセス・トークンにあるユーザーのSIDと,セキュリティ記述子の所有者のSIDを突き合わせ,ファイルの所有者かどうか確認する。もし,所有者であればアクセスは許可となる。

 違う場合,次に随意ACLからACEのポインタをたどり,読み取り許可のあるSIDが無いか上から調べていく。ただしACEが無い場合は,アクセス拒否となる。ACEの途中に読み取り可能なSIDが見つかれば,アクセス許可になる。

 しかし,途中でアクセスを拒否するSIDと一致した場合,または許可が見つからない場合は,アクセス拒否となる。

 このとき注意することは,仮にアクセス許可のSIDが,アクセス拒否のSIDの下にあっても,先に見つけた方が優先されることだ。

 このアクセスの許可と拒否の判断は,セキュリティ参照モニターからオブジェクト・マネージャへ渡る。そして,アクセス許可ならファイル・ハンドルがスレッドに渡りファイルを開けるし,アクセス拒否ならファイルはオープン・エラーとなる。

 このようなプロセスを通じて,アクセス権は厳密に適用されているのである。


■変更履歴
図8-2のサムネイル画像からの拡大画像リンク先が図8-1になっていました。お詫びして訂正します。リンクは修正済みです。 [2008/01/24 19:25]