
当基础权限、默认权限与特殊权限的边界明确之后,权限控制便会进入更贴近生产协作的场景。传统的 owner、group、others 三层模型,在多用户共享、按人分权和目录继承等需求下,往往难以满足精细控制要求。本文围绕 ACL 的概念、启用方式、核心命令、默认 ACL、mask 约束和脚本化配置展开,说明 ACL 的使用逻辑与落地路径。
本节概述 ACL 的用途、启用方式和核心命令。
传统的Unix权限模型(owner/group/others)过于简单,无法满足精细化权限控制需求。ACL(Access Control List)扩展了权限模型,支持对单个用户或组设置独立的权限。
# 检查文件系统是否支持ACL# 主流文件系统 ext4, XFS, Btrfs 默认支持ACL# 检查ACL支持dumpe2fs -h /dev/sda1 | grep "Default mount options"# 或mount | grep acl# RHEL/CentOS 默认启用ACL# Ubuntu 默认启用ACL# 启用ACL(如果需要手动开启)mount -o remount,acl /dev/sda1# 或在 /etc/fstab 中配置# /dev/sda1 /data ext4 defaults,acl 0 2# 查看ACLgetfacl /path/to/file# 示例touch /tmp/acl_test.txtgetfacl /tmp/acl_test.txt# # file: acl_test.txt# # owner: root# # group: root# user::rw-# group::r--# other::r--# 为单个用户设置权限setfacl -m u:john:rw /tmp/acl_test.txtgetfacl /tmp/acl_test.txt# # file: acl_test.txt# # owner: root# # group: root# user::rw-# user:john:rw-# group::r--# mask::rw-# other::r--# 为单个组设置权限setfacl -m g:developers:rx /tmp/acl_test.txtgetfacl /tmp/acl_test.txt# # file: acl_test.txt# # owner: root# # group: root# user::rw-# user:john:rw-# group::r--# group:developers:r-x# mask::rw-# other::r--# 为多个用户/组设置setfacl -m u:alice:rwx,u:bob:r-x,g:qa:rx /tmp/acl_test.txt默认ACL应用于目录,新建的子文件/子目录会自动继承。
# 设置目录的默认ACLmkdir -p /home/sharedsetfacl -R -m u:alice:rwx /home/shared # 递归设置setfacl -R -m g:team:rx /home/shared# 设置默认ACL(仅影响新建文件)setfacl -d -m u:bob:rw /home/sharedsetfacl -d -m g:team:rx /home/sharedsetfacl -d -m o::r /home/shared # 其他用户默认读权限# 查看默认ACLgetfacl /home/shared# # file: shared# # owner: root# # group: root# user::rwx# user:alice:rwx# group::r-x# group:team:r-x# mask::rwx# other::r-x# default:user::rwx# default:user:bob:rw-# default:group::r-x# default:group:team:r-x# default:mask::rwx# default:other::r--# 测试继承效果touch /home/shared/testfile.txtgetfacl /home/shared/testfile.txt# 新文件自动继承默认ACL# 移除特定用户的ACLsetfacl -x u:john /tmp/acl_test.txt# 移除特定组的ACLsetfacl -x g:developers /tmp/acl_test.txt# 移除所有扩展ACL(保留基础权限)setfacl -b /tmp/acl_test.txt# 备份ACLgetfacl -R /home/shared > /tmp/acl_backup.txt# 恢复ACLsetfacl --restore=/tmp/acl_backup.txt# 复制ACL到其他文件getfacl file1.txt | setfacl --set-file=- file2.txt•ACL 权限检查顺序
•1. 如果进程以文件owner身份运行 -> 应用 owner ACL 条目
•2. 如果进程属于文件关联的group或ACL中的某个group -> 应用匹配的最优ACL组条目
•3. 应用 other ACL 条目
•mask 对扩展ACL的影响
•1. mask 限制了所有ACL条目的有效权限(除了owner和other)
•2. 即使单独设置了 u:john:rwx,如果mask是r--,实际权限也是r--
# 调整masksetfacl -m m::r /tmp/acl_test.txt # 设置mask为r--setfacl -m m::rw /tmp/acl_test.txt # 设置mask为rw-#!/bin/bash# setup_shared_directory.sh - 配置共享目录的ACL权限set -euo pipefailSHARE_DIR="${1:-/home/shared}"PRIMARY_GROUP="${2:-developers}"PERMISSIONS="${3:-2775}"# 用户列表(根据实际情况修改)declare -a ALLOWED_USERS=("alice""bob""charlie")declare -a READONLY_USERS=("qa_user""auditor")if [ ! -d "$SHARE_DIR" ]; then echo"错误:目录不存在: $SHARE_DIR" exit 1fiecho"=== 共享目录 ACL 配置 ==="echo"目录: $SHARE_DIR"echo"主组: $PRIMARY_GROUP"echo"权限: $PERMISSIONS"echo""# 设置基础权限echo"[1/4] 设置基础权限..."chown root:"$PRIMARY_GROUP""$SHARE_DIR"chmod "$PERMISSIONS""$SHARE_DIR"# 清理现有ACLecho"[2/4] 清理现有ACL..."setfacl -b "$SHARE_DIR"# 设置默认ACL(递归)echo"[3/4] 设置默认ACL..."for user in"${ALLOWED_USERS[@]}"; do if id "$user" &>/dev/null; then setfacl -R -m u:"$user":rwx "$SHARE_DIR" setfacl -d -R -m u:"$user":rwx "$SHARE_DIR" echo" - 添加读写用户: $user" else echo" - 警告:用户不存在: $user" fidonefor user in"${READONLY_USERS[@]}"; do if id "$user" &>/dev/null; then setfacl -R -m u:"$user":r-x "$SHARE_DIR" setfacl -d -R -m u:"$user":r-x "$SHARE_DIR" echo" - 添加只读用户: $user" else echo" - 警告:用户不存在: $user" fidone# 设置组默认权限setfacl -d -R -m g::rwx "$SHARE_DIR"setfacl -d -R -m g:"$PRIMARY_GROUP":rwx "$SHARE_DIR"setfacl -d -R -m o::rx "$SHARE_DIR"# 设置masksetfacl -R -m m::rwx "$SHARE_DIR"echo"[4/4] 验证配置..."echo""getfacl "$SHARE_DIR"echo""echo"=== 配置完成 ==="echo""echo"测试方法:"for user in"${ALLOWED_USERS[@]}"; do echo"su - $user -c 'touch $SHARE_DIR/${user}_test.txt'"doneACL 的价值并不止于为个别用户补充额外权限,而在于将传统权限模型扩展为适合协作、继承与长期维护的控制体系。将默认 ACL、mask 约束、备份恢复和脚本化配置纳入同一链路后,ACL 才真正具备设计、实施、验证和批量复用的治理意义。
欢迎「长按」下方图片👇,关注我们在公众号上的专业知识分享。