repacls: NTFSセキュリティ情報の確認・操作

# 目的

WindowsのNTFSファイルシステムで、フォルダ権限設定の不備に起因する障害発生。
他部門から引き継いだもので、どういう経緯か分からないが「継承の無効化」を設定し個人のローカルアカウントの権限付与したフォルダがあった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50759/2f4486a4-fe43-e6a1-6c61-7606b1da6fb1.png)

そんなこととはつゆ知らず、システムを引き継いだ我々は、諸事情アプリ実行アカウントを変更することとなり、上位フォルダに権限付与した。
フォルダ権限はサブフォルダへ継承されると考えていたが、このフォルダへ継承されなかったので当該アカウントからの書き込みができなかったことに初回稼働まで気づかず。

予防策として、下位フォルダの権限について、継承設定も含めて事前確認することとした。

なので、フォルダ権限を抽出できるようなツールが欲しい。


# repaclsの紹介

以下をどうぞ。

https://github.com/NoMoreFood/Repacls

xcacls, icacls[^11], setacl, subinaclのreplacementという謳い文句なので、ちょっと期待。

[^11]:もちろん最初に検討したが、再帰的なテキスト出力結果のインデント位置がバラバラとか、出力結果の取扱に難があったので代わりを探した結果、行き当たった次第。


# インストール方法

いつものように[Scoop]で。

[scoop]:<https://qiita.com/tags/scoop>

既存のextras bucketにあるかと思ったけど無かったのでmanifest作成する。

```repacls.json
{
    "version": "2.1.0.1",
    "description": "Windows File Security Utility (replacement for xcacls, icacls, setacl, and subinacl)",
    "homepage": "https://github.com/NoMoreFood/Repacls/",
    "license": "GPL-3.0",
    "architecture": {
        "64bit":{
            "url": "https://github.com/NoMoreFood/Repacls/raw/v2.1.0.1/Build/Release/x64/repacls.exe",
            "hash": "bb5b0f1a6261d75fd02751ec3956a32f08f5573222ef7fc481ccc9602d76d49a"
        },
        "32bit":{
            "url": "https://github.com/NoMoreFood/Repacls/raw/v2.1.0.1/Build/Release/x86/repacls.exe",
            "hash": "5575525c9ee09e078b56bab1b989929d34cfb2e5e505f78619c2c53554d97ab4"
        }
    },
    "bin": "repacls.exe",
    "checkver": "github"
}
```

適当なbucketに置くか、あるいはmanifest直接指定でインストールする。

```
> scoop install repacls.json
```

## 参考

Scoop使いたくない方は、Releasesから直接、実行可能ファイルダウンロード可能です。

https://github.com/NoMoreFood/Repacls/releases

# まずは起動

管理者権限でコマンドプロンプトを開く[^22]。

[^22]:一般権限だとUACプロンプトで昇格を促され、OKを押すと別窓が開いてしまう。

# 単純なレポート出力

`/Report` コマンドで、対象ユーザ名を正規表現で指定して出力。

```
>repacls /Report Owner\fulllist.txt .*

===============================================================================
= Repacls Version 2.1.0.1 by Bryan Berns
===============================================================================

===============================================================================
= Initial Scan Details
===============================================================================
= Scan Path(s): .
= Maximum Threads: 5
= What If Mode: No
= Antivirus Active: On
===============================================================================
===============================================================================
= Total Scanned: 502550
= Read Failures: 0
= Enumeration Failures: 0
= Update Successes: 0
= Update Failures: 0
= Time Elapsed: 22.875
= Note: Update statistics do not include changes due to inherited rights.
===============================================================================

```

SSDを対象にしているとはいえ、50万件の抽出が22秒なので、なかなかの速度。

出力結果を確認する。

```
"Path","Descriptor Part","Account Name","Permissions","Inheritance"
"\??\C:\Users","DACL","NT AUTHORITY\SYSTEM","Full Control","Container Inherit;Object Inherit"
"\??\C:\Users","DACL","BUILTIN\Administrators","Full Control","Container Inherit;Object Inherit"
"\??\C:\Users","DACL","BUILTIN\Users","Read & Execute","None"
"\??\C:\Users","DACL","BUILTIN\Users","Generic Read;Generic Execute","Container Inherit;Object Inherit;Inherit Only"
"\??\C:\Users","DACL","\Everyone","Read & Execute","None"
"\??\C:\Users","DACL","\Everyone","Generic Read;Generic Execute","Container Inherit;Object Inherit;Inherit Only"
"\??\C:\Users","OWNER","NT AUTHORITY\SYSTEM"
"\??\C:\Users","GROUP","NT AUTHORITY\SYSTEM"
"\??\C:\Users\All Users","DACL","\Everyone","List Folder/Read Data","None"
"\??\C:\Users\All Users","DACL","\Everyone","Read & Execute","None"
"\??\C:\Users\All Users","DACL","NT AUTHORITY\SYSTEM","Full Control","None"
"\??\C:\Users\All Users","DACL","BUILTIN\Administrators","Full Control","None"
"\??\C:\Users\All Users","OWNER","NT AUTHORITY\SYSTEM"
"\??\C:\Users\All Users","GROUP","S-1-5-21-3933942852-973373972-2766786355-513"
"\??\C:\Users\Default","DACL","NT AUTHORITY\SYSTEM","Full Control","Container Inherit;Object Inherit"
"\??\C:\Users\Default","DACL","BUILTIN\Administrators","Full Control","Container Inherit;Object Inherit"
"\??\C:\Users\Default","DACL","BUILTIN\Users","Read & Execute","None"
"\??\C:\Users\Default User","DACL","\Everyone","List Folder/Read Data","None"
"\??\C:\Users\Default","DACL","BUILTIN\Users","Generic Read;Generic Execute","Container Inherit;Object Inherit;Inherit Only"
"\??\C:\Users\Default User","DACL","\Everyone","Read & Execute","None"
"\??\C:\Users\Default","DACL","\Everyone","Read & Execute","None"
"\??\C:\Users\Default User","DACL","NT AUTHORITY\SYSTEM","Full Control","None"
"\??\C:\Users\Default","DACL","\Everyone","Generic Read;Generic Execute","Container Inherit;Object Inherit;Inherit Only"
"\??\C:\Users\Default User","DACL","BUILTIN\Administrators","Full Control","None"
"\??\C:\Users\Default","OWNER","NT AUTHORITY\SYSTEM"
"\??\C:\Users\Default","GROUP","NT AUTHORITY\SYSTEM"
"\??\C:\Users\Default User","OWNER","NT AUTHORITY\SYSTEM"
"\??\C:\Users\Default User","GROUP","S-1-5-21-3933942852-973373972-2766786355-513"
"\??\C:\Users\desktop.ini","DACL","BUILTIN\Administrators","Full Control","None"
"\??\C:\Users\desktop.ini","DACL","NT AUTHORITY\SYSTEM","Full Control","None"
"\??\C:\Users\desktop.ini","DACL","BUILTIN\Users","Read & Execute","None"
"\??\C:\Users\Default\AppData","OWNER","NT AUTHORITY\SYSTEM"
"\??\C:\Users\Default\AppData","GROUP","NT AUTHORITY\SYSTEM"

...(以下略)
```

例として `C:\Users` 配下を見てみたのは、UID/GUIまわりの違いを確認しやすいかと思って。。

ただ、[DACL]と所有者、グループが複数行に分かれて逐一出力されるので、50万エントリの出力結果がゆうに100万行超えてしまう。。
継承の有無とか変化点を拾いたいだけなので、これはちょっと辛いかもしれない。

[DACL]:<https://learn.microsoft.com/ja-jp/windows/win32/secauthz/access-control-lists>


# あらためて使用例を見てみる

引数無しで起動するとusageが出る。

いくつか使用例も提示されるので見てみよう。

```
Examples
========
- Replace all instances of DOM\jack to DOM\jill in C:\test:
  repacls.exe /Path C:\Test /ReplaceAccount "DOM\jack:DOM\jill"

- Migrate all permissions for all accounts with matching
  names in DOMA with DOMB:
  repacls.exe /Path C:\Test /MoveDomain DOMA:DOMB

- Update old SID references, remove any explicit permissions that are already
  granted by inherited permissions, and compact all ACLs if not compacted:
  repacls.exe /Path C:\Test /UpdateHistoricalSids /RemoveRedundant /Compact
```

すいません、権限操作の例ばっかりでした。


# 結論

あらためてヘルプちゃんと読んだけど、どちらかというとドメイン移行で権限丸々振り直したいとか、削除されて未解決になったSIDを削除したいとか、権限振り直し系の用途を想定しているみたい。
残念ながらレポート機能はそんなに充実してなさそうでした。

CSVで抽出したあとは、適度に加工するしかないですかね。。

権限ザルになってないかなど、検査内容によっては、 `/FindAccount`, `/FindDomain`, `/FindNullAcl` あたりは有効そうです。