傳統 chmod 僅支持 User/Group/Other 三元權限,無法滿足「用戶 A 讀寫、用戶 B 唯讀、組 C 無權限」等精細場景。ACL (Access Control List) 提供針對任意用戶/組的額外權限條目,本文詳解 getfacl/setfacl 實戰。
一、 核心命令
| 命令 | 作用 |
getfacl 文件 | 查看 ACL 信息 |
setfacl -m u:用戶:權限 文件 | 添加/修改用戶 ACL |
setfacl -m g:組:權限 文件 | 添加/修改組 ACL |
setfacl -x u:用戶 文件 | 刪除用戶 ACL |
setfacl -b 文件 | 刪除所有 ACL |
setfacl -d -m u:用戶:權限 目錄 | 設置默認 ACL (繼承) |
二、 getfacl 輸出解讀
# file: test.txt
# owner: root
# group: root
user::rwx
user:alice:rw-
group::r--
group:dev:rwx
mask::rwx
other::r--
user:: 文件所有者基礎權限 (等同 ls -l 第一組)。
user:alice:rw- 針對用戶 alice 的額外權限。
group:: 所屬組基礎權限。
group:dev:rwx 針對組 dev 的額外權限。
mask:: **有效權限上限**,所有 ACL 權限與 mask 取交集生效。
other:: 其他用戶權限。
三、 實戰案例
場景:項目目錄 /data/project,需求:
- 所有者
root 全控。
- 開發組
dev 讀寫執行。
- 用戶
alice (不在 dev 組) 唯讀。
- 用戶
bob 無任何權限。
- 新建文件自動繼承上述規則。
操作步驟
# 1. 基礎權限
chown root:dev /data/project
chmod 770 /data/project
# 2. 設置 ACL
setfacl -m u:alice:r-x /data/project
setfacl -m g:dev:rwx /data/project
# mask 自動計算為 rwx,無需手動設
# 3. 設置默認 ACL (關鍵:新建文件/目錄自動繼承)
setfacl -d -m u:alice:r-x /data/project
setfacl -d -m g:dev:rwx /data/project
setfacl -d -m m::rwx /data/project
# 4. 驗證
getfacl /data/project
# default:user:alice:r-x
# default:group:dev:rwx
# default:mask::rwx
測試繼承
su - alice
touch /data/project/alice_file.txt
ls -l /data/project/alice_file.txt
# -rw-r-----+ 1 alice dev 0 ... (權限受 mask 限制為 r--)
getfacl /data/project/alice_file.txt
# user:alice:r--
# group:dev:rwx
四、 進階技巧
1. 批量複製 ACL
getfacl source_file | setfacl --set-file=- target_file
# 或遞歸
getfacl -R /data/project | setfacl --set-file=- -R /backup/project
2. 刪除特定條目
setfacl -x u:alice /data/project
setfacl -x g:dev /data/project
3. 完全清除 ACL
setfacl -b /data/project
4. 文件系統支持檢查
# 掛載選項需包含 acl (ext4/xfs 默認支持)
mount | grep acl
# 或
tune2fs -l /dev/sda1 | grep "Default mount options"
五、 lsattr / chattr 擴展屬性補充
| 屬性 | chattr 參數 | 效果 |
| 不可修改 | +i | root 也無法刪除/修改/重命名,需 -i 解除 |
| 只追加 | +a | 只能追加寫入,不能覆蓋/刪除,日志文件適用 |
| 同步寫入 | +S | 數據同步寫入磁盤 |
| 無訪問時間更新 | +A | 不更新 atime,減少磁盤 I/O |
| 壓縮 | +c | 內核透明壓縮 (需文件系統支持) |
# 查看
lsattr /etc/passwd
# 設置
chattr +i /etc/passwd
chattr +a /var/log/messages
六、 ACL vs 傳統權限 選型指南
| 場景 | 推薦方案 |
| 簡單的用戶/組/其他區分 | chmod/chown |
| 多組/多用戶差異化權限 | ACL |
| 目錄樹繼承權限模板 | 默認 ACL (setfacl -d) |
| 防誤刪關鍵系統文件 | chattr +i |
| 審計日志只追加不覆蓋 | chattr +a |