WindowsのSIDとアクセス制御リスト
トークン内のSIDとDACLの順序を照合し、同じファイルへの読取り・書込みの違いを確認します。
説明
Windowsのアクセス制御では、プロセスやスレッドのアクセストークンと、対象に付いたDACLを照合します。トークンには利用者やグループのSIDが含まれ、DACLの各ACEが特定のSIDに対する許可や拒否を表します。
LAB\ayaが所有するレポートを使い、Editorsグループから継承した変更権限で内容を読みます。その後、ayaの書込みだけを拒否し、同じファイルで読取りと書込みを比べます。拒否を外した後も同じページで更新結果まで確認します。
1利用者をSIDで確認
whoami /userで、現在のトークンの利用者名とSIDを表示します。SIDは名前の変更とは別にアカウントを識別する値です。
whoami /user現在の利用者SIDayaのSID末尾は1001です。名前が同じでも別アカウントならSIDが異なる場合があります。以後のACL判定はこの利用者SIDと、トークンに含まれる有効なグループSIDを対象にします。
2グループSIDと有効状態
ayaが所属するEditorsとUsersを表示します。この場面ではどちらもトークンで有効です。
whoami /groupsグループと属性EditorsのSID末尾は2001です。DACLにaya自身の許可がなくても、有効なEditorsの許可が要求を満たす場合があります。deny-only属性などがある場合は、同じSIDが含まれていても許可への使われ方が変わります。
3継承された変更権限
report.txtのDACLを読みます。ファイル所有者はayaで、親ディレクトリからEditorsの変更権限を継承しています。
icaclsDACLを表示 C:\Lab\report.txt対象ファイル(I)は継承されたACE、(M)はModifyです。この権限には内容の読取り・書込み・削除などが含まれます。所有者であることと、ファイル内容へのアクセスがすべて許可されることは同じではありません。
4グループの許可で内容を読む
現在のトークンとDACLでレポートを読みます。
Get-Content内容を読む C:\Lab\report.txtレポートtotal=42が読めます。今回の読取り要求は、有効なEditors SIDへ与えられた継承許可で満たされています。ファイルを開く前のディレクトリ探索など、他の必要条件も満たした設定です。
5利用者へ明示的な書込み拒否を追加
ayaのWを明示的に拒否します。ayaはこのファイルの所有者としてDACLを変更できる設定です。変更後のDACLも表示します。
WDはファイル内容への書込みです。ここではこの権利だけを拒否します。一般的なWにはREAD_CONTROLなど共通の権利も含まれるため、読取りを残すこの例では使いません。
icaclsDACLを変更 C:\Lab\report.txt対象 /deny拒否ACEを追加 "LAB\aya:(WD)"ayaの書込みを拒否; icacls C:\Lab\report.txt変更後を表示明示的な拒否が継承許可より先に並びます。この順序でayaの書込み要求は拒否されます。「拒否は順序に関係なく常に最後まで優先」という仕組みではなく、DACLのACEを順に処理する規則と並びの両方が関係します。
6拒否された書込み
同じトークンで内容を更新します。読取りと書込みは別の要求なので、直前の読取り成功だけではこの結果を判断できません。
Set-Content内容を更新 C:\Lab\report.txt対象 -Value "total=99"新しい内容 -NoNewline末尾に改行を追加しないayaへ一致する明示的な拒否ACEが内容への書込み(WD)を拒否します。Editorsの変更権限が残っていても、この順序では書込み要求を通せません。内容は更新されていません。
7読取りは引き続き許可される
同じファイルをもう一度読み、拒否した権限の範囲と更新の成否を確認します。
Get-Content内容を再確認 C:\Lab\report.txt同じ対象元のtotal=42です。拒否したのは内容への書込み(WD)であり、今回の読取り要求は継承許可で満たされます。ACEが一つあることだけで全操作が許可または拒否されるわけではありません。
8拒否だけを外して再度更新
/remove:dでayaの拒否ACEを外し、同じ内容の更新を試します。最後に読んで確認します。
icaclsDACLを変更 C:\Lab\report.txt /remove:d LAB\ayaayaの拒否ACEを除去; Set-Content C:\Lab\report.txt -Value "total=99" -NoNewline同じ更新を再試行; Get-Content C:\Lab\report.txt結果を読む更新後はtotal=99です。拒否の除去後、Editorsの継承許可が書込み要求を満たします。/remove:dはそのSIDの拒否ACEを対象とする指定で、すべての許可や継承を初期化する操作とは異なります。
まとめ
アクセス判定には利用者名だけでなく、トークン内のSIDとその属性を使います。
DACLはACEの順序と要求した権限に従って処理され、明示・継承の並びも結果へ影響します。
一つのファイルでも読取りと書込みは別に判定され、変更後は同じ操作で結果を確認します。
操作履歴と解説を振り返れます。
PowerShell 7 / LAB\aya
whoami /userUSER INFORMATION ---------------- User Name SID ========= ============================================== lab\aya S-1-5-21-111111111-222222222-333333333-1001
whoami /groupsGROUP INFORMATION ----------------- Group Name SID Attributes ============== ================================================= ============================== LAB\Editors S-1-5-21-111111111-222222222-333333333-2001 Mandatory group, Enabled by default, Enabled group BUILTIN\Users S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
icacls C:\Lab\report.txtC:\Lab\report.txt LAB\Editors:(I)(M) Successfully processed 1 files; Failed processing 0 files
Get-Content C:\Lab\report.txttotal=42
icacls C:\Lab\report.txt /deny "LAB\aya:(WD)"; icacls C:\Lab\report.txtprocessed file: C:\Lab\report.txt
Successfully processed 1 files; Failed processing 0 files
C:\Lab\report.txt LAB\aya:(DENY)(WD)
LAB\Editors:(I)(M)
Successfully processed 1 files; Failed processing 0 filesSet-Content C:\Lab\report.txt -Value "total=99" -NoNewlineSet-Content: Access to the path 'C:\Lab\report.txt' is denied.
Get-Content C:\Lab\report.txttotal=42
icacls C:\Lab\report.txt /remove:d LAB\aya; Set-Content C:\Lab\report.txt -Value "total=99" -NoNewline; Get-Content C:\Lab\report.txtprocessed file: C:\Lab\report.txt Successfully processed 1 files; Failed processing 0 files total=99
演習完了