Windowsのアクセス制御
この記事はhydrogen Advent Calender 2024の17日目の記事です。MMA Advent Calender 2024の17日目の記事でもあります。
昨日の記事はshiragi君による携帯電話番号を変えた話でした。
もはや、記事がshiragi君一色になりつつあります。
UNIX系のアクセス権
Windowsにおけるファイルの権限はUNIX系とはまったく異なる仕組みが採用されている。UNIX系のファイルシステムでは、各ファイルには所有者、所有グループが存在し、それら2つ及びそれ以外のユーザーに対して読み取り、書き込み、実行の3種類の権限を設定することができる。そして、所有者はいかなる場合でもそのファイルの権限を変更することができる。それ以外にもフラグとしてスティッキービットや、SUID、SGIDなどの機能が存在するが、後2つは権限と呼ぶべきものではない。スティッキービットはファイルに付与した際の挙動は様々あるが、ディレクトリに付与した場合はそのディレクトリの所有者とディレクトリの内容物の所有者以外に改名や削除を禁ずるものとなる。
WindowsのACL
それに対し、Windowsでは所有者が存在していかなる場合でもファイルの権限を変更できるという点は共通しているがそれ以外の点が全く異なる。まず、所有グループという概念が存在せず、所有者としてグループも設定可能である。権限の管理はACLによって行われているのでより細かく対象を限定して、各ユーザーやグループに対して操作の許可及び拒否の権限エントリを設定することができる。そして、肝心の権限の種類は極めて多種多様に渡り、すべてを細かく説明するのは困難なため、次の表に簡単な説明を示すにとどめる。
識別子 | 権限名 | ファイルに適用時 | ディレクトリに適用時 |
---|---|---|---|
RD | データの読み取り/ディレクトリの一覧表示 | ファイルの読み取り | ディレクトリの内容物の一覧表示 ディレクトリへのアクセス |
WD | データの書き込み/ディレクトリの作成 | ファイルへの書き込み | ディレクトリ内にファイルを作成 |
X | スキャン/実行 | ファイルの実行 | サブディレクトリにアクセス可能 |
AD | データの追加/サブディレクトリの追加 | ファイルへの追記(上書き不可) | サブディレクトリの作成 |
DE | 削除 | ファイルの削除 | ディレクトリの削除 |
DC | 子の削除 | N/A | ディレクトリの内容物の削除 |
RA | 属性の読み取り | ファイルの属性の読み取り | ディレクトリの属性の読み取り |
WA | 属性の書き込み | ファイルの属性の書き込み | ディレクトリの属性の書き込み |
REA | 拡張属性の読み取り | ファイルの拡張属性の読み取り | ディレクトリの拡張属性の読み取り |
WEA | 拡張属性の書き込み | ファイルの拡張属性の書き込み | ディレクトリの拡張属性の書き込み |
RC | 読み取り制御 | ACLの読み取り | ACLの読み取り |
WDAC | DAC の書き込み | ACLへの書き込み | ACLへの書き込み |
WO | 所有者の書き込み | 所有者の変更 | 所有者の変更 |
S | 同期 | ファイルの同期 | ディレクトリの同期 |
AS | システム セキュリティへのアクセス | 監査ログの読み取り | 監査ログの読み取り |
注目すべきは、ACLの書き換え権や所有者の変更権なども権限として設定できる点である。UNIX系のシステムでは、前者は所有者もしくはrootにしかできず、後者は所有者ですらできない。この点を鑑みると、WindowsはUNIX系のアクセス制御と比較してよく言えば柔軟で、悪く言えば複雑な権限管理が可能であると言える。
拒否エントリ
先ほど、ACLには拒否の権限エントリを設定できると述べた。UNIX系のシステムでは、特定のグループにアクセスを許可しつつ、そのうちの特定のユーザーのアクセスを拒否するようなことはできないが、Windowsにおいてはそのグループの許可エントリとそのユーザーの拒否エントリを同時に設定することで実現可能である。なお、アクセス許可の書き換えや所有者の書き込みの権限を拒否することでファイルの権限を書き換えられることを防げるように思えるかもしれないが、ACLは特権による操作を防ぐことはできないので、管理者は特権を用いて所有権を取得することでACLを書き換えることができるという点に留意すべきである。
オブジェクトとACL
実はこのACLはWindows上のセキュリティ保護可能なありとあらゆるものに付与されており、それをセキュリティ保護可能なオブジェクトという。
ファイルのほかにレジストリもそのようなオブジェクトであり、実はACLが設定されている。WindowsにおいてACLがどれほど重要なシステムであるかがうかがえる。