保護ドメインと任意アクセス制御リスト

LinuxとWindowsとではファイルやディレクトリといったリソースに対する保護モデルが異なっている。LinuxまたはUNIX系のオペレーティングシステムは基本的に保護ドメインというモデルをファイルやディレクトリアクセスの保護機構として使っている。

Windowsにもファイルやディレクトリアクセスを制御する機能がいくつか備わっている。Linuxと対比させて考えるのは難しいのだが、ユーザが自分で設定するという点で見ると、あえて似ているといえば、Windowsの任意アクセス制御リスト(DACL : Discretionary Access Control Lists)が、Linuxでの保護ドメインに近いと言えないこともない。ただし、WindowsのDACLはアクセス制御リストと呼ばれる制御方法で、保護ドメインとは、これはこれでちょっと考え方が異なっている。

さらに話を難しくするが、LinuxやUNIX系のオペレーティングシステムは保護ドメインとは別にアクセス制御リストの機能を持っている。LinuxやUNIX系オペレーティングシステムではアクセス制御リストは特定の用途でしか使われないのだが、WindowsのDACLと似ているといえば似ている。要するにどちらにも似たような機能があるということだ。

今回はWindowsでDACLの表示や設定を行うコマンドであるicaclsを紹介する。

任意アクセス制御リストを表示/設定する icacls

icaclsコマンドの基本的な使い方は次のとおり。

icaclsの基本的な使い方 ファイル対象

icacls ファイルパス [/grant[:r] SID:パラメータ [...]] [/deny SID:パラメータ[...]] [/remove[:g|:d]] SID[...]] [/t] [/c] [/l] [/q] [/setintegritylevel レベル:ポリシ[...]]

icaclsの基本的な使い方 ディレクトリ対象

icacls ディレクトリパス[/substitute 旧SID 新SID [...]] [/restore ACLファイルパス [/c] [/l] [/q]]

icaclsコマンドに指定するパラメータや権限の内容を簡単にまとめると次のようになる。

パラメータ 内容
/t 指定されたすべてのファイルおよびサブディレクトリに対して処理を適用
/c ファイルエラーが発生しても処理を継続する(エラーメッセージは表示される)
/l シンボリックリンクに対して処理を適用する
/q 成功メッセージの出力を抑制する
/save ACLファイルパス [/t] [/c] [/l] [/q] 指定されたすべてのファイルに関する任意アクセス制御リストを指定されたファイルに保存する。保存したデータは/restoreパラメータで使用できる
/setowner ユーザ名 [/t] [/c] [/l] [/q] 指定されたすべてのファイルのオーナを指定されたユーザに変更
/findSID SID [/t] [/c] [/l] [/q] 指定されたセキュリティ識別子(SID)を持つファイルを表示する
/verify [/t] [/c] [/l] [/q] 正規ではない、または、ACE(アクセス制御エントリ)に関して数が矛盾するアクセス制御リストを持つファイルを表示する
/reset [/t] [/c] [/l] [/q] 指定されたすべてのファイルに対してアクセス制御リストをデフォルトの継承アクセス制御リストに変更する
/grant[:r] SID:[…] 指定されたユーザに関してアクセス権を設定する(以前設定されたアクセス権は置き換えとなる)。:rを指定しなかった場合、以前設定されたアクセス許可に新しくアクセス許可が追加される
/deny SID:[…] 指定されたユーザに関してアクセス権を拒否する
/remove[:g|:d]] SID[…] [/t] [/c] [/l] [/q] 任意アクセス制御リストから指定されたSIDに関する設定を削除。:gが指定された場合には許可権が、:dが指定された場合には拒否権が削除される
/setintegritylevel [(CI)(OI)]レベル:[…] 指定されたすべてのファイルに整合性ACEを追加する。レベルの指定はL、M、Hが可能でそれぞれ低、中、高を意味する。整合性ACEに対する敬称オプションはレベルよりも優先される(ディレクトリに対してのみ適用される)
/substitute 旧SID […] 現行のSIDを指定された新しいSIDに置き換える。ディレクトリパラメータが必要
/restore ACLファイルパス [/c] [/l] [/q] /saveで保存された任意アクセス制御リストを対象ファイルに適用する
/inheritancelevel:[e|d|r] 継承レベルを指定する。eが強化の有効化、dがACEの継承およびコピーの禁止、rがすべての継承ACEの削除を意味する
基本権利 内容
F フルアクセス
M アクセスの変更
RX 読み込みおよび実行アクセス
R 読み込み専用アクセス
W 書き込み専用アクセス
特定権利 内容
D 削除
RC 読み込み制御
WDAC DAC書き込み
WO オーナ書き込み
S 同期
AS システム・セキュリティアクセス
MA 最大許容
GR 一般読み込み
GW 一般書き込み
GE 一般実行
GA 一般すべて
RD データ読み込み/ディレクトリリスト
WD データ書き込み/ファイル追加
AD データ追記/サブディレクトリ追加
REA 拡張属性読み込み
WEA 拡張属性書き込み
X 実行/トラバース
DC 子供の削除
RA 属性読み込み
WA 属性書き込み
継承権 内容
(OI) オブジェクト継承
(CI) コンテナ継承
(IO) 継承
(NP) 継承を伝播しない

ユーザが明示的にicaclsコマンドを使って設定を変更することは、あまりないと思う。なんらかの理由で必要になったら使うこともあるかもしれないが、こういったことができるコマンドがある、という程度に理解しておけばよいだろう。

icaclsコマンドの使用例

ユーザが明示的にicaclsコマンドを使うことはあまりないように思うが、そもそもDACLがどういったものであるのか体感するために数回実行しておくのはアリだろう。たとえば次のようにicaclsコマンドを実行すると、カレントディレクトリ以下のファイルやディレクトリの設定内容を確認できる。

カレントディレクトリ以下の設定の確認

C:\Users\daich\Documents>icacls . /t
. NT AUTHORITY\SYSTEM:(OI)(CI)(F)
  BUILTIN\Administrators:(OI)(CI)(F)
  PARAN10-ONGS\daich:(OI)(CI)(F)

.\batches NT AUTHORITY\SYSTEM:(OI)(CI)(F)
          BUILTIN\Administrators:(OI)(CI)(F)
          PARAN10-ONGS\daich:(OI)(CI)(F)

.\COPYRIGHT.txt NT AUTHORITY\SYSTEM:(F)
                BUILTIN\Administrators:(F)
                PARAN10-ONGS\daich:(F)

.\desktop.ini NT AUTHORITY\SYSTEM:(F)
              BUILTIN\Administrators:(F)
              PARAN10-ONGS\daich:(F)

.\Makefile NT AUTHORITY\SYSTEM:(F)
           BUILTIN\Administrators:(F)
           PARAN10-ONGS\daich:(F)

.\try_inotify2.c NT AUTHORITY\SYSTEM:(F)
                 BUILTIN\Administrators:(F)
                 PARAN10-ONGS\daich:(F)

.\batches\echobatch_01.bat NT AUTHORITY\SYSTEM:(F)
                           BUILTIN\Administrators:(F)
                           PARAN10-ONGS\daich:(F)

.\batches\echobatch_02.bat NT AUTHORITY\SYSTEM:(F)
                           BUILTIN\Administrators:(F)
                           PARAN10-ONGS\daich:(F)

.\batches\echobatch_03.bat NT AUTHORITY\SYSTEM:(F)
                           BUILTIN\Administrators:(F)
                           PARAN10-ONGS\daich:(F)

.\batches\sample.txt NT AUTHORITY\SYSTEM:(F)
                     BUILTIN\Administrators:(F)
                     PARAN10-ONGS\daich:(F)

10 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

C:\Users\daich\Documents>

次のように/saveパラメータを指定すると、先程表示したような設定を指定したファイルに保存することができる。

/saveパラメータを指定してデータをファイルに保存

C:\Users\daich> icacls . /save aclfile.txt /t
処理ファイル: .
処理ファイル: .\.vscode
処理ファイル: .\3D Objects
処理ファイル: .\acltile.txt
処理ファイル: .\AppData
処理ファイル: .\Application Data
処理ファイル: .\Contacts
処理ファイル: .\Cookies
処理ファイル: .\Desktop
処理ファイル: .\Documents
処理ファイル: .\Downloads
処理ファイル: .\Favorites
処理ファイル: .\hoge.txt
処理ファイル: .\Links
処理ファイル: .\Local Settings
処理ファイル: .\MicrosoftEdgeBackups
処理ファイル: .\Music
処理ファイル: .\My Documents
処理ファイル: .\NetHood
処理ファイル: .\NTUSER.DAT
処理ファイル: .\ntuser.dat.LOG1
処理ファイル: .\ntuser.dat.LOG2

...略...

処理ファイル: .\AppData\Local\Programs
処理ファイル: .\AppData\Local\Publishers
処理ファイル: .\AppData\Local\Temp
処理ファイル: .\AppData\Local\Temporary Internet Files
処理ファイル: .\AppData\Local\VirtualStore
.\AppData\Local\Application Data\*: アクセスが拒否されました。
974 個のファイルが正常に処理されました。1 個のファイルを処理できませんでした

C:\Users\daich>

保存されたファイルの中身は次のようになっている。

保存された設定データ

このデータは/restoreパラメータを指定することで再設定用に使用することができる。ユーザが直接利用することはないんじゃないだろうが、こういった機能がWindowsには用意されていること、設定をチェックしたり変更するためのコマンドが用意されていること、などは覚えておいてほしい。

参考資料