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での保護対象となるオブジェクトごとに定義されるオブジェクト固有のアクセス権である。
上位の16bitは、いくつかの部分に分かれる。16~23ビット目は、「標準アクセス権」と呼ばれ、どのオブジェクトに対しても共通のアクセス権を示す。
最上位の28~31ビットは、「汎用アクセス権」と呼ばれる。これは、オブジェクトごとに対象ビットは異なるが、基本的には、標準アクセス権とオブジェクト固有アクセス権の特定のビットが有効になっているときにオンになる。標準アクセス権とオブジェクト固有アクセス権を要約したものだ。これは、簡易なアクセス権の判定に使われる。
アプリケーションによっては、「読めるのか?」「書き込めるかどうか?」「実行できるのか?」といった単純な判定しか必要としないことがある。あるいは「リードオンリーにする」「実行できるようにする」といった簡単なアクセス権設定しかしないソフトウェアも少なくない。汎用アクセス権は、こうした簡易な使い方をするアプリケーション向けに「要約」されたACLを提供する。
この連載の記事
-
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ - この連載の一覧へ