ACLの覚書

話はバックアップの仕事依頼から始まる

バックアップの話をいただいたので最初は「何か（データ）」を記憶媒体（メディア）に保存するだけと思っていた。詳しく聞くと**ただ単なる保存ではない。<font color="red">ファイルやフォルダへのアクセス権限情報を取得した上での保存</font>**　である。

セキュリティは全くの<font color="red">専門外</font>です。
下準備がいるな思った。

### ■言語の選別
PowerShellの**get-aclコマンド**でもACLからの情報を得ることができる。一部のアクセス権の表示が数値表示になってしまうなど、不完全な部分がある。そういうわけで、ファイルシステムのACLに関する情報を得るなら、**icacls.exe**を使うのが今のところもっともACLに近づくことができるらしい。

（仮）工程表
|No| 工程 | 
|:-:|:-:|
|１|タスクスケジューラーを動かして|
|２|コマンドプロンプトorパワーシェルでアクセス権限の情報をそれぞれのファイルから抜き出して|
|３|保存する|
|４|保存したデータを復元|
|５|復元データを確認|


### ■プリンシパルとは

ACE（Access Control Entry）によるアクセス権を付与される対象を「<font color="red">**プリンシパル**</font>」という。**なぜユーザーとかアカウントでないのか**というと、実際にオブジェクトを扱うのは、ユーザーが起動したプログラムやそこから発生したスレッドであったり、あるいはサービスのようなプログラム、人でない管理用のユーザー（コンピュータアカウント）であったりするからだ。

><参照>Windows Info 第323回
>**WindowsのACL（Access Control List）を解説する【準備編】**
>https://ascii.jp/elem/000/004/089/4089448/

### ■SIDとは
SID（Security IDentifier）とは、Windowsのユーザーアカウントやユーザーグループに与えられる、固有の識別番号です。
（例）S-1-1-0


### ■ACEとは
アクセス制御エントリ (ACE) 。特定のプリンシパルのアクセス権を記述しています。
ACEのタイプ(許可/拒否)などを表すヘッダ情報とアクセス権を示す32bitのデータ（**アクセスマスク**）、対象となるプリンシパル（のSID）や対象となるオブジェクトのタイプ（GUIDで表現されている）などが含まれている。

※SID[^1]
[^1]:注釈：アカウント名以外にACLではセキュリティ識別子（SID）を使ってセキュリティ プリンシパルまたはセキュリティグループを識別しています。


| ACEデータ名 | 詳細 |
|:-:|:-:|
|ACEヘッダ|タイプ（許可・禁止）・サイズなど|
|アクセスマスク|ビット数で表現したアクセス権情報|
|オブジェクト関連情報|オブジェクとのタイプや継承などの情報|
|プリンシパル|ACEの対象|

### ■ACLとは
 **ACL**は**ACEの集まり**である。つまりACLとは、アクセス権を定義したACE（Access Contrl Entry）のリストである


<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/1de48e01-8313-fb04-7a15-d9e9b582a708.png">

><参照>Windows Info 第324回
**WindowsのACL（Access Control List）を解説する【定義編】**
>https://ascii.jp/elem/000/004/090/4090013/

### ■アクセス マスクとは

オブジェクトでサポートされているアクセス権に対応するビットを持つ 32 ビット値です。 すべての Windows セキュリティ保護可能なオブジェクトは、次の種類のアクセス権のビットを含むアクセス マスク形式を使用します。

* 汎用アクセス権
* 標準アクセス権
* SACL アクセス権
* ディレクトリ サービス アクセス権

>参照
>https://learn.microsoft.com/ja-jp/windows-hardware/drivers/ifs/access-mask
>アクセスマスク
>microsoft learn

### ■アクセス権が32bitのバイナリ情報に集約

![スクリーンショット 2024-10-15 092826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/1dcf8e7a-1422-7ed2-bd2b-5d928c0efbe9.png)


<img width=160 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/91db46f2-6207-1a38-448f-e9784004e595.png">

**16～23ビット**は、「**標準アクセス権**」と呼ばれ、どのオブジェクトに対しても共通のアクセス権を示す。

<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/8d3e441d-18d9-05b1-46f8-6b4036db0c76.png">

**28～31ビット**は、「**汎用アクセス権**」と呼ばれる。これは、オブジェクトごとに対象ビットは異なるが、基本的には、標準アクセス権とオブジェクト固有アクセス権の特定のビットが有効になっているときにオンになる。標準アクセス権とオブジェクト固有アクセス権を要約したものだ。これは、簡易なアクセス権の判定に使われる。

### ■ファイル固有のアクセス権（32bitのバイナリ情報の0~15bitまで）

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/5cc119a9-3bdd-da67-9826-0d9eff7005b4.png">

 表は、ファイル固有のアクセス権とビットの対応を示したものだ。オブジェクト固有のアクセス権は、全部で**16個**持つことが可能。9～15bitまでは未定義。ファイルやディレクトリでは9ビット(0から8bitまで)しか使っておらず、一部のビットはファイルとディレクトリ（厳密には名前付きパイプなども対象になる）で意味が異なる。
 
※名前付きパイプ 【named pipe】 ネームドパイプ[^2]
[^2]:注釈：概要 名前付きパイプ（named pipe）とは、同じコンピュータ上で動作しているプログラム同士がデータをやり取りするプロセス間通信（IPC）の有力な方式の一つ。UNIX系OSでよく利用される。

![スクリーンショット 2024-10-15 093226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/86ec2a9c-4ec5-ca89-46b7-e7d9cd48bd54.png)

　たとえばビット0は、ファイルでは中身の読み出しを許可するものだが、ディレクトリ（フォルダー）の場合には、ディレクトリ内のファイルの一覧を読み出せるかどうかを許可するものになっている。広い意味では「同じ」ともいえるが、挙動としては異なるものだ。

　これとは別にビット5には、ディレクトリの「横断」を可能にするアクセス権（ファイルの場合には、実行許可）がある。ビット0は具体的にはフォルダーの中身に対するアクセス権だが、ビット6は、フォルダーの一覧をすべて見せずにアクセス可能なサブフォルダーのへと移動できるようにするものだ。パスの下位にある特定のユーザーがアクセス可能なディレクトリーに、途中のディレクトリの中身を見せずにアクセスを可能にするような場合、このアクセス権を与える。Microsoftの日本語ドキュメントでは、これを「フォルダーのスキャン」と表現している。


>Windows Info 第325回
>**icacls.exeコマンドの設定項目とWindows内部のACL設定との関係**
>https://ascii.jp/elem/000/004/090/4090689/2/

### ■標準アクセス権

標準アクセス権は、領域としては8ビットあり、最大8つのアクセス権が設定できるが、現在のWindowsのACLでは、5つしか使っていない。

![スクリーンショット 2024-10-15 094210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/dd4398fa-9645-12f5-a30f-28abdebe5160.png)

ここにあるアクセス権は、おもにアクセス権自体に関するものだ。ファイルやディレクトリのアクセス権を読み出せるのか、変更できるのか、所有者を変更できるのかといったことに対するアクセス権を設定する。ここにある「同期」アクセス権は、ファイルのIO操作の終了などの通知を受け取ることができるかどうかを示す。このアクセス権がないと、事実上ファイルにアクセスできない。



### ■汎用アクセス権

汎用アクセス権には、以下の表のようなものがある。ファイルの汎用読み出しアクセス権（FILE_GENERIC_READ）は、標準アクセス権のREAD_CONTROL、SYNCHRONIZE、ファイル固有アクセス権のFILE_READ_DATA、FILE_READ_ATTRIBUTES、FILE_READ_EAが有効になっているアクセスマスクパターンに対応する。

![スクリーンショット 2024-10-15 094411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/d9cfc700-f233-035a-9c5b-da48917c1997.png)

　Windowsの内部では、ファイルに対するアクセス権は、これだけしか定義されておらず、実際には、標準アクセス権5つとオブジェクト固有アクセス権10個、これらのパターンに対応する汎用アクセス権４つの合計19個だけだ。しかし、icaclsコマンドで設定可能なアクセス権は27種類あり、エクスプローラーの高度なアクセス権には13個しか表示されない。次回は、今回説明したマスクビットのアクセス権とicaclsやエクスプローラーの対応関係を解説する。


### ■icacls.exeの設定

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

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

* コマンドのACEエントリの順序

|No|順序項目|
|:-:|:-:|
|1|明示的な拒否|
|2|明示的な許可|
|3|継承された拒否|
|4|継承された許可|

* 【単純な権限=<font color="red">**基本的なアクセス許可**</font>】

|権限|説明|
|:-:|:-:|
|N|アクセス権なし|
|F|フルアクセス権|
|M|変更アクセス|
|RX|読み取りと実行のアクセス権|
|R|読み取り専用のアクセス権|
|W|書き込み専用アクセス|
|D|削除アクセス権|

* 【特定の権限=<font color="red">**高度なアクセス許可**</font>】

|権限|説明|
|:-:|:-:|
|DE|削除|
|RC|読み取り制御(制御の読み取り)|
|WDAC|DACの書き込み（変更アクセス許可）|
|WO|所有者に書き込み（所有権の取得）|
|S|同期|
|AS|システム　セキュリティへのアクセス|
|MA|無制限（許可される最大数）|
|GR|一般的な読み取り|
|GW|一般的な書き込み|
|GE|一般的な実行|
|GA|一般的なすべての操作|
|RD|データの読み取り/ディレクトリの一覧表示|
|WD|データの書き込み専用アクセス/ファイルの追加|
|AD|テータの追加/サブディレクトリの追加|
|REA|拡張属性の読み取り|
|WEA|拡張属性の書き込み|
|X|実行/スキャン/走査|
|DC|子の削除|
|RA|属性の読み取り|
|WA|属性の書き込み|

●【継承権限】適用先設定
|適用先|説明|
|:-:|:-:|
|(OI)|オブジェクト継承。このフォルダとファイル|
|(CI)|コンテナー継承。このフォルダとサブフォルダ|
|(IO)|継承のみ。「IO」のみは意味がないので、存在しない。|
|(NP)|継承を適用しない。コンテナーおよびオブジェクトによって親コンテナーから継承された ACE ですが、入れ子になったコンテナーには伝達されません。 ディレクトリにのみ適用されます。|
|(I)|親コンテナーから継承した権限|
|(OI)(CI)|このフォルダ、サブフォルダ、ファイルに適用|
|(OI)(CI)(IO)|サブフォルダ、ファイルに適用（**このフォルダのファイルも含む**）|
|(CI)(IO)|サブフォルダにのみ適用|
|(OI)(IO)|ファイルにのみ適用|


![スクリーンショット 2024-10-08 104558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/299b02ac-1c60-3d6f-225a-bc3e0cab8635.png)
![スクリーンショット 2024-10-08 104653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/3b2c7bdf-48e3-17f4-4711-3c71b753a2ed.png)
※このフォルダのみは適用先設定はしない。

>参照
>Windowsアクセス制御エントリ（ACE）の適用先
>https://www.teppi.com/fileblog-column/007-filing-win-acl02

### ■この3ビットの論理上の組み合わせは7通り
「INHERIT_ONLY_ACE」ビット単体では無意味なので、実際には8通りではなく7通りだ。それを文章で表現したものが、アクセス許可エントリのドロップダウンリスト。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/f927ee02-4928-09cc-2c30-27537c6c2568.png">


### ■「単純な権限」は、「特定の権限」の組み合わせでできている

「単純な権限」には、7つの指定があるが、このうち「N」（アクセス権なし）は、アクセス権がない状態を示すものと思われる。この「N」もicacls.exeでは、指定に使うと「無効なパラメーター」エラーとなり、実際には指定できない。「単純な権限」は、「特定の権限」の組み合わせでできている。ただし、変更アクセス権「M」は、未定義のビット12と13を設定している。


<img width="650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/26fbbf70-3588-3cb7-3ce8-14cb36a626d0.png">


### ■注意が必要なのは

注意が必要なのは、「GR」（一般的な読み取り）、「GW」（一般的な書き込み）、「GE」（一般的な実行）、「GA」（一般的なすべての操作）の4つのコードだ。

　これらは、アクセスマスクの汎用アクセス権に対応しているため、対応するマスクビット（28～31ビット）が設定されることはなく、アクセスマスクの「標準アクセス権」と「オブジェクト固有アクセス権」が設定される。この汎用アクセス権GR/GW/GE/GAの指定と、指定されるマスクビットの対応を以下の表に示す。

<iMg width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/8471acd7-4f78-ee8a-72e7-a54fe4ffbecc.png">




### ■アクセス権限について調査
「誰に対して(対象)」「どのような操作」を「許可／拒否するか」という属性を複数定義すること。

| 項目 |具体| 
|:-:|:-:|
|対象|(ファイルやフォルダのある)デバイスにログインできるアカウントがある人|
|操作|ファイルやフォルダを変更したり、削除したり、作成したりすること|
|許可/拒否|上の操作を許可・禁止のいずれかに指定|

というのが**ファイルフォルダ** への**アクセス権の指示**になるようだ。

サブフォルダについては親のフォルダのアクセス権を「**継承**」するという考え方が追加される。何も考えずに上位のフォルダに **「ならえ」** をする形式のようだ。

### ■Excelで具体調査
その他のオプションの確認＞プロパティ＞セキュリティタブ
![スクリーンショット 2024-10-09 155235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/c74ce82c-5e34-dde0-f709-555487a143b6.png)

ここからどのアカウント（誰）でどの操作（書き込みなど）を許可/不許可（チェック）する。


（参照）
![スクリーンショット 2024-10-09 155003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/04571929-10b7-a930-25ff-d9152b9bc274.png)

ファイルやフォルダにもパソコンと同じようにアカウント（ID）で管理されていた。

>参考サイト
>@k-andu(kando)さん
>https://qiita.com/k-andu/items/1200b2077c23365a3cbb#:~:text=%C3%97-,%E3%81%BE%E3%81%A8%E3%82%81,%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

### ■上記Excel情報を取り出すためのコマンド
icacls / cacls

上記がコマンドになるが、caclsは非推奨になっているようで、
icaclsで始めました。

```bat:セキュリティ情報取得bat
@echo off
REM フォルダ内の全ファイルとフォルダのアクセス権データを収集し、保存
ICACLS "C:\Users\maedat\Documents\cacls" /T /C >"C:\Users\maedat\Desktop\downloads\p.txt"

```
解説
icaclsコマンドのオプション /T と /C の意味以下

| オプション名 | 機能 |
|:-:|:-:|
|/T: |指定したディレクトリ内のすべてのサブディレクトリとファイルに対して、コマンドを適用します。つまり、指定したフォルダだけでなく、その中にあるすべてのフォルダとファイルのアクセス権も収集します。|
|/C:| エラーが発生しても処理を継続します。例えば、アクセス権の変更ができないファイルがあっても、他のファイルやフォルダの処理を続行します。|

### ■One Driveの一部導入したので

本日からOne Driveを利用のためフォルダ構成が変わったのと、
どうやら管理者権限でないとコマンドが走らなくなったので修正しました。

```bat:修正版
@echo off
:: 管理者権限で再実行する
:: 管理者権限がない場合、管理者権限で再実行する
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo 管理者権限で再実行しています...
    powershell -Command "Start-Process '%~f0' -Verb RunAs"
    exit /b
)

REM フォルダ内の全ファイルとフォルダのアクセス権データを収集し、保存
ICACLS "C:\Users\maedat\OneDrive - ＸＸＸＸ株式会社\ドキュメント\cacls" /T /C >"C:\Users\maedat\OneDrive - ＸＸＸＸ株式会社\デスクトップ\downloads\p.txt"
```

これでワンドライブ化してもコマンドが走るようには修正できました。