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を表す構造体(メモリ内のデータ構造)には、ACLのバージョン(リビジョン)やACEの数、ACL全体の大きさを表すデータぐらいしかない。なお、ACL自体がセキュリティ保護対象に付属する情報であるため、ACLの中には保護対象を識別するような情報がない。
ACEは、ACEのタイプなどを表すヘッダ情報とアクセス権を示す32bitのデータ(アクセスマスク)、対象となるプリンシパル(のSID)や対象となるオブジェクトのタイプ(GUIDで表現されている)などが含まれている。
つまり、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を提供する。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ














