このページの本文へ

前へ 1 2 次へ

Windows Info 第324回

WindowsのACL(Access Control List)を解説する【定義編】

2022年04月24日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

Windowsでファイルやディレクトリにアクセスできないことがあるが、それはアクセス権を持っていないから。それぞれのファイルやディレクトリに対するアクセス権を定義しているのがACLである

 WindowsのACL(Access Control List)がわかりにくいのは、ユーザーが見ることができる「ACLのようなもの」とWindowsが内部で持っている「情報としてのACL」の間に隔たりがあるからだ。

 というのも、前回の【準備編】で紹介したようなエクスプローラーの機能やicaclsコマンドは、ユーザーに使いやすいように、「情報としてのACL」を加工して「ACLのようなもの」を表示している。実体としてのACLは、ユーザーが持つアクセス権を示すビットでしかなく、実利用での「書き込み禁止」といった設定に対して複数のビットを操作しなくてはならず、これをユーザーにやらせると、間違った操作になる可能性が高く、場合によっては、ユーザー自身で解決ができなくなるケースも生じうる。

 また、エクスプローラーなどにある「フルアクセス」などは、対応するアクセス権があるのではなく、アクセス権の一部を有効にする操作がなされるだけで、ACL自体に「フルアクセス」というアクセス権があるわけではない。

 もう1つの理由としては、ACLは、ファイルだけでなく、セキュリティ保護が可能なオブジェクトすべてで使われるため、そのドキュメントはどうしても難解なものになりがちである。これに対して、エクスプローラーやicaclsコマンドは、ファイルだけを対象にしている。

 そういうわけで、MicrosoftにあるACLの解説を見ると、エクスプローラーの表示やicaclsコマンドとは隔たりがあり、同じものなのか? と感じてしまうわけだ。

 今回は、ファイルACLの定義を見ていくことにする。定義は、WindowsのSDK(Windows Kit)に含まれているヘッダーファイルの中にある。また、C++などの言語を使って、WindowsのAPIを呼び出すプログラムを開発するためのドキュメントがMicrosoftのサイトに用意されている。

 しかし、これを見るだけでACLを理解するのは、プログラマーでないと難しい。プログラムを組むことができるのなら、自分でプログラムを書いて確かめることができるが、そうでないと、開発者向けドキュメントを理解するのは困難だ。

ACLとACEの関係

 ACLは、ACEの集まりである。

ACLとは、アクセス権を定義したACE(Access Contrl Entry)のリストである

 ACLを表す構造体(メモリ内のデータ構造)には、ACLのバージョン(リビジョン)やACEの数、ACL全体の大きさを表すデータぐらいしかない。なお、ACL自体がセキュリティ保護対象に付属する情報であるため、ACLの中には保護対象を識別するような情報がない。

 ACEは、ACEのタイプなどを表すヘッダ情報とアクセス権を示す32bitのデータ(アクセスマスク)、対象となるプリンシパル(のSID)や対象となるオブジェクトのタイプ(GUIDで表現されている)などが含まれている。

ACE(Access Contrl Entry)とは、プリンシパルごとにアクセス権とその許可、禁止などを定義したもの

 つまり、ACEは、「誰に」「何を」「許可/禁止」するのか、「継承」はできるのか、という情報を持っていて、ACLは、このACEを複数持つことでアクセスの制御を細かく設定できる。

 この中で“キモ”となるのが、アクセスマスクと呼ばれる情報である。簡単に言えば、このアクセスマスクがACEのアクセス権を示す。

 このアクセス権が32bitのバイナリ情報になっているのは、多数のACEを高速に検査して、アクセス権を判定するためである。ACEは、継承されたり、個別に設定されることがある。また、ユーザーのグループなどにもアクセス権を与えることができるため、アクセス権を調べるには、アクセスするプリンシパルに有効なすべてのACEを調べる必要がある。このとき、アクセス権がビットで表された「数値」になっているほうが計算がしやすい。

 具体的には、アクセスマスクは下の図のような32個のビットからなっている。このうち下位の16bit(0~15ビット目)は、ACLでの保護対象となるオブジェクトごとに定義されるオブジェクト固有のアクセス権である。

アクセスマスクは32bitのデータで、ビットのオンオフで、アクセス権の有無を示す。大きく3つの領域があり、下位16bitは、オブジェクト固有のアクセス権を、16~23bitの8bitが標準アクセス権(ACEで共通のアクセス権)、上位4bitがオブジェクト固有と標準アクセス権を要約した汎用アクセス権になっている。禁止や許可はACEヘッダーが示し、アクセスマスクは対象となるアクセス権の有無のみを示す

 上位の16bitは、いくつかの部分に分かれる。16~23ビット目は、「標準アクセス権」と呼ばれ、どのオブジェクトに対しても共通のアクセス権を示す。

 最上位の28~31ビットは、「汎用アクセス権」と呼ばれる。これは、オブジェクトごとに対象ビットは異なるが、基本的には、標準アクセス権とオブジェクト固有アクセス権の特定のビットが有効になっているときにオンになる。標準アクセス権とオブジェクト固有アクセス権を要約したものだ。これは、簡易なアクセス権の判定に使われる。

 アプリケーションによっては、「読めるのか?」「書き込めるかどうか?」「実行できるのか?」といった単純な判定しか必要としないことがある。あるいは「リードオンリーにする」「実行できるようにする」といった簡単なアクセス権設定しかしないソフトウェアも少なくない。汎用アクセス権は、こうした簡易な使い方をするアプリケーション向けに「要約」されたACLを提供する。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン