傳統 Linux UGO (User/Group/Other) 權限模型在多人協作、NFS/Samba 共享場景下表達力不足。ACL (Access Control List) 允許**對單一檔案/目錄指定多個用戶/群組的獨立權限**,不改變基本擁有者/群組。本文從啟用 ACL、setfacl/getfacl 操作、預設 ACL 繼承、遮罩機制到備份還原完整實戰。
# Ubuntu/Debian
apt-get install acl
# CentOS/RHEL
yum -y install acl
# Arch
pacman -S acl
# 檢查目前掛載選項
mount | grep acl
# 若無,編輯 /etc/fstab 加入 acl
UUID=xxxx /data ext4 defaults,acl 0 2
# 重新掛載生效
mount -o remount,acl /data
# 給用戶 alice 讀寫執行
setfacl -m u:alice:rwx /data/project
# 給群組 dev 讀執行
setfacl -m g:dev:rx /data/project
# 給其他用戶 (非擁有者、非群組成員) 唯讀
setfacl -m o::r /data/project
# 移除特定 ACL
setfacl -x u:alice /data/project
setfacl -x g:dev /data/project
# 清除所有 ACL (保留基本 UGO)
setfacl -b /data/project
getfacl /data/project
# 輸出範例:
# file: project
# owner: root
# group: root
# user::rwx
# user:alice:rwx
# group::r-x
# group:dev:r-x
# mask::rwx
# other::r--
在目錄設定 default: 規則,**新建檔案/子目錄自動繼承**對應 ACL。
# 目錄 /data/project 設定預設 ACL
setfacl -d -m u:alice:rwx /data/project
setfacl -d -m g:dev:rx /data/project
setfacl -d -m o::- /data/project # other 無權限
# 驗證
getfacl /data/project
# 顯示 default:user:alice:rwx 等
# 新建檔案測試
touch /data/project/newfile
getfacl /data/project/newfile
# 自動擁有 alice:rwx, dev:rx
mask 定義**除擁有者與 other 外**所有 ACL 項目的**最大權限上限**。ACL項目權限 & mask。setfacl -m m::rx /data/project (限制所有額外用戶/群組最高 rx)。getfacl 輸出的 effective 權限已套用 mask。
# 備份整個目錄樹 ACL
getfacl -R /data > /backup/data.acl
# 還原 (覆蓋現有 ACL)
setfacl --restore=/backup/data.acl
| 操作 | 對 ACL 影響 |
|---|---|
chmod 750 file | 修改基本 UGO,**不變動**存取 ACL;但可能改變 mask (group class 變化) |
chown alice:dev file | 擁有者/群組變更,**ACL 項目保留** (user:alice 變為擁有者項目) |
cp file file2 | **不複製 ACL** (除非 cp -p --preserve=mode 且檔案系統支援) |
mv file dir/ | **保留 ACL** (同檔案系統移動) |
tar/cpio | 需 --acls 參數保留 ACL |
vfs objects = acl_xattr 映射 Windows ACL。
# 專案根目錄
mkdir /projects/webapp
setfacl -m u:alice:rwx -m g:frontend:rwx -m g:backend:rx -m o::- /projects/webapp
setfacl -d -m u:alice:rwx -m g:frontend:rwx -m g:backend:rx -m o::- /projects/webapp
setfacl -m m::rwx /projects/webapp
# 前端目錄額外給 designer 寫入
mkdir /projects/webapp/frontend
setfacl -m u:designer:rwx -m d:u:designer:rwx /projects/webapp/frontend
# 後端目錄給 dba 唯讀
mkdir /projects/webapp/backend
setfacl -m u:dba:r-x -m d:u:dba:r-x /projects/webapp/backend


