ACL (Access Control List) 突破傳統「擁有者/群組/其他」三元權限模型,允許對單一檔案/目錄針對特定用戶或群組設定獨立的 r/w/x 權限。
| 命令 | 用途 |
|---|---|
getfacl | 查看檔案/目錄的 ACL 設定 |
setfacl | 設定/修改/刪除 ACL 項目 |
touch acl_test ll acl_test # -rw-rw-r--. 1 jimistephen jimistephen 0 Mar 10 08:21 acl_test
setfacl -m u:jimi:rx acl_test ll acl_test # -rw-rwxr--+ 1 jimistephen jimistephen 0 Mar 10 08:21 acl_test # 注意:權限位後出現 '+' 表示存在 ACL 擴展屬性
setfacl -m u::rwx acl_test ll acl_test # -rwxrwxr--+ 1 jimistephen jimistephen 0 Mar 10 08:21 acl_test
getfacl acl_test # file: acl_test # owner: jimistephen # group: jimistephen user::rwx # 擁有者權限 user:jimi:r-x # 特定用戶 jimi 的權限 group::rw- # 擁有群組權限 mask::rwx # 有效權限遮罩(限制群組與特定用戶的最大權限) other::r-- # 其他用戶權限
mask 定義「群組」與「特定用戶/群組」權限的上限。實際生效權限 = 設定權限 & mask。修改 mask 會影響所有受 ACL 控制的實體:
setfacl -m m::rx acl_test # 將 mask 設為 rx,jimi 實際權限變為 r-x (原 rwx & rx = rx)
為目錄設定 Default ACL,新建檔案/子目錄自動繼承:
# 僅影響當前目錄 setfacl -m u:myuser1:rx /srv/projecta # 遞歸繼承:所有新建檔案/子目錄自動獲得此權限 setfacl -m d:u:myuser1:rx /srv/projecta
查看預設 ACL:
getfacl /srv/projecta # default:user:myuser1:r-x ← 以 default: 前綴標識
# 移除特定用戶 ACL setfacl -x u:jimi acl_test # 移除所有 ACL(保留基本 UGO 權限) setfacl -b acl_test # 移除預設 ACL setfacl -x d:u:myuser1 /srv/projecta
現代檔案系統(ext4、xfs、btrfs)預設支援 ACL。若掛載選項無 acl,需重新掛載:
mount -o remount,acl /mount/point # 或永久生效:/etc/fstab 加入 acl 選項 UUID=xxxx /mount/point ext4 defaults,acl 0 0
www-data 需讀取特定目錄,但不屬於該目錄群組