🔐 Linux ACL / Setuid / Setgid / Sticky bit:進階檔案安全與權限管理指南
Linux 的檔案權限控制不只 rwx 和 chmod。
在企業環境、多人協作、專案資料夾與多服務架構下,你常會遇到:
- 同一份資料,需給「多組人」不同權限
- 要讓一般使用者以特定身份執行程式(如 passwd)
- 團隊共用資料夾,但不能互相刪除文件
- 希望建立 UID/GID 變動後,資料夾自動繼承群組與權限
這些需求都屬於「進階權限管理」,需要用到: ACL、Setuid、Setgid、Sticky bit。 本文將用清楚的範例與實戰流程帶你掌握所有細節。
📑 目錄
- 一、ACL:突破 chmod 限制的細粒度權限控制
- 二、Setuid:程式以檔案 Owner 身份執行
- 三、Setgid:自動繼承群組/以群組身份執行
- 四、Sticky Bit:多人共享資料夾的最強保護
- 五、ACL vs chmod vs 特殊權限比較
- 六、實戰情境示範:安全授權與專案資料夾策略
- 七、常見問題 FAQ
- 🔗 延伸閱讀
一、ACL:突破 chmod 限制的細粒度權限控制
傳統 chmod 權限僅支持:
- Owner
- Group
- Others
但在企業環境常需同一資料夾提供多組人不同權限。例如:
- 工程部:讀 + 寫
- 品保部:只能讀
- 外包廠商:只能讀某些檔案
這時就需要 ACL(Access Control List)。
✔ 查看 ACL
getfacl filename
✔ 設定 ACL(新增使用者/群組權限)
# 給 user tom 讀寫權
setfacl -m u:tom:rw file.txt
# 給 group qa 讀取權
setfacl -m g:qa:r file.txt
✔ 移除 ACL
setfacl -b filename
✔ 資料夾自動繼承(default ACL)
# 新增進資料夾的檔案自動帶有 ACL
setfacl -m d:u:tom:rw /project/data
常見用途:
- 多人協作專案
- 多部門共用資料夾(Dev、QA、PM)
- 精準控管 API 或 App 的後端檔案存取
二、Setuid:程式以檔案 Owner 身份執行
當檔案設置 Setuid bit 時,執行者會以「檔案 owner」的身份執行,而不是自己的身份。
最常見的例子:
-rwsr-xr-x 1 root root /usr/bin/passwd
passwd 需要修改 /etc/shadow,因此必須以 root 身份執行。
✔ 設定 Setuid
chmod u+s program
✔ 取消 Setuid
chmod u-s program
⚠ 安全警告
- 絕不要對 shell script(sh, bash, python)設 Setuid
- 容易造成提權漏洞
- 僅適用「經過安全審查」的編譯程式
適用情境:
- 需要一般使用者執行特權操作(修改密碼、掛載裝置…)
三、Setgid:以群組身份執行、資料夾自動繼承群組
Setgid 有兩種用途:
📌(1)檔案:以群組身份執行
chmod g+s script
📌(2)資料夾:新檔案自動繼承群組(最常用)
當資料夾設定 Setgid,新建的檔案或資料夾會自動繼承該資料夾的群組。
# 設定 Setgid
chmod g+s /project/data
這對團隊協作非常重要: 所有人新增檔案都會保持同一個群組,避免產生「不同使用者寫入不同群組」而無法存取的問題。
常見用途:
- 團隊共用資料夾
- CI/CD 產生檔案要保持相同群組(如 Jenkins)
四、Sticky Bit:多人共用目錄的強制保護
Sticky Bit 的作用: 使用者只能刪除自己建立的檔案。
典型例子: /tmp
drwxrwxrwt tmp
↑
Sticky Bit (t)
✔ 設定 Sticky Bit
chmod +t /shared
✔ 移除 Sticky Bit
chmod -t /shared
用途:
- /tmp
- 多人共用資料夾
- 雲端同步暫存資料夾
五、ACL vs chmod vs 特殊權限比較表
| 功能 | chmod | ACL | Setuid | Setgid | Sticky Bit |
|---|---|---|---|---|---|
| 細粒度權限 | ✘ | ✔ | ✘ | ✘ | ✘ |
| 多人共用管理 | 普通 | ✔ 最適合 | ✘ | ✔(資料夾) | ✔ |
| 以 Owner 身份執行 | ✘ | ✘ | ✔ | ✘ | ✘ |
| 避免互刪檔案 | ✘ | ✘ | ✘ | ✘ | ✔ |
六、實戰情境:專案資料夾權限一次配置完成
假設你有一個團隊資料夾:
/project/data
需求:
- Dev:讀寫
- QA:只讀
- 所有新檔案都自動繼承群組
- 每個人不能刪除別人的檔案
✔ 建立群組
groupadd dev
groupadd qa
✔ 設定資料夾基本權限
chown root:dev /project/data
chmod 2770 /project/data # 2 = Setgid
✔ 加上 Sticky Bit
chmod +t /project/data
✔ 設定 ACL 給 QA(只讀)
setfacl -m g:qa:r /project/data
✔ 設 Default ACL(新檔案繼承權限)
setfacl -m d:g:dev:rw /project/data
setfacl -m d:g:qa:r /project/data
🔍 完成後你會得到: 可維護、可擴充、可審計、可自動繼承的專案資料夾權限架構。
七、常見問題 FAQ
Q:ACL 會讓權限變得複雜嗎?
會,但換來的是更高彈性。建議搭配 getfacl 查詢工具與文件控管。
Q:Setuid / Setgid 怎麼看是否啟用?
檔案權限會出現 S / s 例如:
-rwsr-xr-x
Q:Sticky Bit 的 t / T 差在哪?
- t:執行位元存在 → 權限完整
- T:沒有執行位元 → 但 sticky bit 仍在
🔗 延伸閱讀
- 🐧 Linux 使用者與群組管理:useradd、usermod、passwd、sudoers 深度解析
- 🐧 Linux 檔案系統:inode、EXT4、XFS、權限與實體儲存結構
- 🐧 Linux 系統加固:SELinux、AppArmor、auditd、Fail2Ban 全面安全防護
- 🐧 LVM 與磁碟擴容:PV/VG/LV、線上擴展、縮小與快照完整教學
— WWFandy・Linux 權限管理筆記
沒有留言: