使用 Windows 內建指令工具 Cacls.exe + Findstr 快速找出權限設定不當的檔案與目錄

如果能輕鬆處理工作的話,誰希望使用麻煩的方法?安全性的設定不是看一下資料夾的安全性設定即可,幹嘛要用到指令?首先,我們都知道 NTFS 的權限具有 "繼承" 的概念,父系目錄的 ACL 設定會影響到子目錄的 ACL,所以一般來說都只會看父系目錄的 ACL 設定。但 NTFS 安全性中有一個選項是可讓子目錄與檔案不繼承父系設定,移除繼承後該資料夾就變成獨立設置的權限了...

 今天下午上班時,朋友突然急發 MSN,提到之前的廠商因為貪圖方便,將網站與其他 LAN 裡面的檔案資料夾安全性都設定為 "Everyone" 可 "完全控制",其中包括了機密的設計圖檔案...等。 “Everyone” 可完全控制的狀況下造成的安全漏洞可想而知,隨便一個有一點底子的惡意人士都可輕易的將檔案複製或刪除,惡搞一點還可以來個竄改。

這時 Will 過來,跟他討論到此事,聊著聊著突然提到一個自 Windows 2000 就存在的古老指令工具: Cacls.exe。聽到之後突然愣了一下,此工具真的好久沒用了,想當初還用得很熟的說...可以說是一個簡單好用的稽核工具啊~!在今天突然又回憶起這位老朋友的時候,當下就先在 Windows 2008 試試看還在不在。恩恩~老朋友還在~而且還有一個更新版本的:ICacls.exe,中間測試的過程發覺功能與語法差不多,但 ICacls.exe 在權限繼承控制方面似乎稍強了些~不過這些不是本文的重點~在此先掠過~

 

為何不用 GUI 介面瀏覽安全性 ACL 即可
如果能輕鬆處理工作的話,誰希望使用麻煩的方法?安全性的設定不是看一下資料夾的安全性設定即可,幹嘛要用到指令?首先,我們都知道 NTFS 的權限具有 "繼承" 的概念,父系目錄的 ACL 設定會影響到子目錄的 ACL,所以一般來說都只會看父系目錄的 ACL 設定。但 NTFS 安全性中有一個選項是可讓子目錄與檔案不繼承父系設定,移除繼承後該資料夾就變成獨立設置的權限了

image

資料夾少可用人工稽核一個目錄一個目錄的看,如果是 100 個資料夾以上,深度又達 8 層的目錄結構我想會讓人瘋掉吧 ,所以輕鬆的使用一行指令就可將資料夾與檔案的權限 LIST 出來,再根據 LIST 中的列表快速設定好適當的權限絕對比 "人肉設定" 快多了~

 

使用 Cacls.exe 找出權限設置達危險程度的區域

  • 在這裡 TigerLin 先建立一個測試資料夾名為 [TTT],使用預設的權限繼承;而在其中的子目錄 [Everyone] 則是不使用繼承權限並指設定讓 Everyone 有完全控制的權限,TTT 與 Everyone 中各有五個文字檔案。
    image
  •  
  • 接下來,使用 /T 參數對 D:\TTT 這個資料夾進行 ACL 的列出清單
    cacls d:\TTT /t

    如果想將結果輸出到文字檔以供查閱可以使用以下指令 --
    cacls d:\TTT /t > D:\ACLCheck.txt

    P.S 參數說明 /t 是變更其目錄與子目錄的 ACL 權限,但因為這裡沒有指定是 /G (Grant) 或是 /R (Revoke),所以只有將 ACL 列出的效果
     
  • 這裡可以看到,每個檔案都會有 ACL 的存取清單,中間抓出兩個差異較大的如下 --

    d:\TTT\TTT (5).txt BUILTIN\Administrators:(ID)F
                       NT AUTHORITY\SYSTEM:(ID)F
                       BUILTIN\Users:(ID)R
                       Everyone:(ID)R

    d:\TTT\Everyone\Everyone-FullControl (1).txt Everyone:(ID)F
                                                 BUILTIN\Users:(ID)R

    其中的 F 代表完全控制,R代表讀取,可以看到 d:\TTT\Everyone\Everyone-FullControl (1).txt  有 Everyone 完全控制的權限,這樣很危險!!
     
  • 那要如何在龐大的目錄中過濾只有 Everyone 完全控制權限的資料夾位置?這時候別忘了更老的朋友 – Findstr 的啦~
    Findstr 可媲美 Linux 下的 grep,多加利用可以擷取很多重要的資訊。

    要過濾 [只有 Everyone 擁有完全控制權限] 的檔案與資料夾時,我們可以這樣下指令 --
    cacls d:\TTT /t | findstr /i everyone:.*F
    其中的 ".*" 代表萬用字元,/i 為忽略大小寫
  • 出現的結果如下, Cacls 與 findstr 已經成功將危險的目錄與檔案抓出來了!!!!

    C:\>cacls d:\TTT /t | findstr /i everyone:.*F
    d:\TTT\Everyone Everyone:(OI)(CI)F
    d:\TTT\Everyone\Everyone-FullControl (1).txt Everyone:(ID)F
    d:\TTT\Everyone\Everyone-FullControl (2).txt Everyone:(ID)F
    d:\TTT\Everyone\Everyone-FullControl (3).txt Everyone:(ID)F
    d:\TTT\Everyone\Everyone-FullControl (4).txt Everyone:(ID)F
    d:\TTT\Everyone\Everyone-FullControl (5).txt Everyone:(ID)F

 

參考資料
Cacls http://technet.microsoft.com/en-us/library/bb490872.aspx
Findstr http://technet.microsoft.com/en-us/library/bb490907.aspx

 

如果覺得這篇文章對你有所幫助,可以透過 Paypal 支持作者唷~