このページの本文へ

前へ 1 2 次へ

Windows Info 第325回

icacls.exeコマンドの設定項目とWindows内部のACL設定との関係

2022年05月01日 10時00分更新

文● 塩田紳二 編集● ASCII

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

 前々回でWindowsのACL(Access Control List)関連の機能(エクスプローラー、icacl.exeコマンド)を(「WindowsのACL(Access Control List)を解説する【準備編】」)、前回はACLとその中に含まれるACE(Access Control Entry)の構造を解説した(「WindowsのACL(Access Control List)を解説する【定義編】」)。今回は、icacls.exeコマンドの設定項目とWindows内部のACL設定との関係を見ていく。

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

icacls.exeの設定

 icacls.exeのオンラインヘルプを見ると、「単純な権限」と「特定の権限」の2つをアクセス許可マスクの指定で利用できる。設定した権限とアクセスマスクの対応を調べるには、icacls.exeの「/save」オプションを利用する。

 このオプションではファイルやディレクトリのACLを再割り当て可能な形式でファイルに保存する。ファイルの中身はテキスト形式で、SDDL(Security Descriptor Definition Language)という形式で表記される。この中にACEのアクセスマスクに対応した部分がある。これを見ることで、ファイルやディレクトリに設定されているACEのアクセスマスクを直接見ることができる。

 具体的には、以下のような手順でファイルやディレクトリのACLが表示可能だ。

●grantオプションを使いアクセス権を設定する
icacls.exe file /grant:r 〈アクセス権〉

●ACLをSDDL形式で保存する
icacls.exe file /save 〈ファイル名〉

icaclsの「/grant:r」オプションを使うと、指定したプリンシパルのアクセス権を指定できる。アクセス権の表示は、icaclsコマンドに対象ファイル名のみを指定すればよい。また、「/save」オプションを使うことで、SDDLで記述されたACLをファイルに保存できる

 こうして作られた〈ファイル名〉の中身を表示させれば、fileに設定されたACLが表示される。これは、以下のような形式になっている。

D:PAI(A;;〈SDDLアクセス権〉;;;〈プリンシパル〉)

 この形式で1行が1つのACLを表し、1組のカッコが1つのACEを表す。カッコの中にある2つめのセミコロンと3つめのセミコロンの間にあるのが、アクセス権を示す「ACE文字列」だ。この文字列には、「FA」のようなSDDLの定数文字列と「0x1200a9」のような16進数文字列の場合がある。前者については、以下のサイトに文字列と定数値の対応がある。

●ACE 文字列
 https://docs.microsoft.com/ja-jp/windows/win32/secauthz/ace-strings

 また、SDDL自体に関しては、以下のURLに解説がある。

●セキュリティ記述子定義言語
 https://docs.microsoft.com/ja-jp/windows/win32/secauthz/security-descriptor-definition-language

 これらとは別にSDDLの定義は、以下のURLにある。

●[MS-DTYP]: Security Descriptor Description Language(英語)
 https://docs.microsoft.com/ja-jp/openspecs/windows_protocols/ms-dtyp/4f4251cc-23b6-44b6-93ba-69688422cb06

 ただし、ここでACE文字列の定数値として表示される値は、WindowsのSDKに含まれているwinnt.hで定義されている定数名だ。たとえば、ACE文字列「RC」は、上記のサイトによれば、「READ_CONTROL」という値になるが、この値は、winnt.hでは、0x00020000という値だと定義されている。これを前回のマスクビットに当てはめると、17ビット目となるため、標準アクセス権の「アクセス許可の読みとり」であることがわかる。

 実際に調査する場合、無関係なアクセス権は削除しておく必要がある。icacls.exeで特定のユーザー(プリンシパル)のアクセス権を削除するには、「/remove」オプションを使って、指定したプリンシパルに対応したACEをすべて削除する。

 ただし、上位のオブジェクトから継承したアクセス権に関しては、直接削除できない。継承されたアクセス権を削除するには、継承自体を停止させる。継承を停止するには、「/inheritance」オプションを使って、継承アクセス権を削除(/inheritance:r)するか、継承アクセス権を個別指定アクセス権に変換する必要がある(/inheritance:d)。

通常、ファイルやディレクトリは、上位のオブジェクトからACLを継承している。icaclsコマンドの出力に「(I)」となっているのは継承したアクセス権を示す。「/inheritance」オプションで継承したアクセス権を削除できる

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

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

ピックアップ

ASCII.jp RSS2.0 配信中

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