Linux ACL 权限实战:从基础配置到高级继承策略(含默认权限详解)
📅 2026/7/5 12:18:20
👁️ 阅读次数
📝 编程学习
1. Linux ACL权限基础概念
**ACL(Access Control List)**是Linux系统中一种更精细的权限控制机制,它突破了传统UGO(User/Group/Other)权限模型的限制。想象一下你是一个图书馆管理员,UGO权限就像只能给"学生组"或"教师组"发借书卡,而ACL则允许你单独给某个学生特殊权限,比如允许他进入珍本区。
传统UGO权限的局限性在共享目录场景下尤为明显。比如一个项目目录需要给开发组读写权限,但其中某个配置文件只能让组长修改。用传统方法要么单独建组,要么开放整个目录权限,都存在安全隐患。这时候ACL就能精准控制:
# 给开发组读写权限 setfacl -m g:devteam:rw project_dir # 单独给组长配置文件写权限 setfacl -m u:teamleader:rw project_dir/config.cfgACL权限的组成要素包括:
- 主体:用户(user)或组(group)
- 客体:文件或目录
- 权限:读(r)/写(w)/执行(x)
- 类型:访问ACL(针对现有文件)和默认ACL(决定新建文件的继承权限)
2. ACL环境准备与基础操作
2.1 检查与启用ACL支持
大多数现代Linux发行版默认启用ACL,但保险起见可以检查:
# 查看文件系统是否支持ACL tune2fs -l /dev/sda1 | grep "Default mount options" # 临时启用ACL(重启失效) mount -o remount,acl / # 永久启用需要修改/etc/fstab,在挂载选项添加acl我在CentOS 7上实测时遇到个坑:XFS文件系统默认就支持ACL,而EXT4需要手动启用。如果getfacl报"Operation not supported",记得先检查文件系统类型。
2.2 基础命令实战
查看ACL权限:
getfacl /var/www/html # 输出示例: # file: var/www/html # owner: root # group: www-data # user::rwx # group::r-x # other::r-x设置ACL权限:
# 给用户bob添加读写权限 setfacl -m u:bob:rw /var/www/html # 给dev组添加执行权限 setfacl -m g:dev:rx /var/www/html删除ACL权限:
# 删除bob用户的ACL条目 setfacl -x u:bob /var/www/html # 清除所有ACL权限 setfacl -b /var/www/html3. 高级ACL特性详解
3.1 Mask权限机制
Mask是ACL里最容易让人困惑的概念。它像一道"权限过滤器",决定用户/组能获得的最大有效权限。比如:
setfacl -m u:alice:rwx testfile setfacl -m m::r testfile # 此时alice实际只有r权限修改mask值有两种方式:
# 直接设置mask setfacl -m m::rw testfile # 通过chmod影响mask(仅影响组权限位) chmod g-w testfile3.2 默认ACL与权限继承
默认ACL是目录特有的属性,它决定了新建子项的初始权限。配置方法:
# 设置默认ACL(注意d:前缀) setfacl -m d:u:jenkins:rwx /data/build这样在/data/build下新建的文件会自动继承:
mkdir /data/build/workspace getfacl /data/build/workspace # 输出中会有default相关条目实际项目中,Web服务器的上传目录特别适合用默认ACL:
chmod 770 /var/www/uploads setfacl -d -m u:nginx:rwx /var/www/uploads setfacl -d -m g:webdev:rwx /var/www/uploads3.3 递归设置与备份
递归设置ACL(慎用):
# -R递归整个目录树 setfacl -R -m u:backup:rx /dataACL权限备份与恢复:
# 备份整个目录的ACL getfacl -R /data > data_acls.backup # 恢复时 setfacl --restore data_acls.backup4. 实战案例:Web目录权限管理
假设我们有个Web项目目录结构:
/var/www/myapp/ ├── public/ # 静态资源 ├── uploads/ # 用户上传 ├── config/ # 配置文件 └── logs/ # 日志文件4.1 基础权限设置
# 设置属主为www-data chown -R www-data:www-data /var/www/myapp # 公共目录755 find /var/www/myapp/public -type d -exec chmod 755 {} \; find /var/www/myapp/public -type f -exec chmod 644 {} \; # 上传目录特殊权限 setfacl -Rm d:u:www-data:rwx /var/www/myapp/uploads setfacl -Rm d:g:webdev:rwx /var/www/myapp/uploads4.2 精细化控制
# 配置文件只允许管理员修改 setfacl -m u:admin:rw /var/www/myapp/config setfacl -m m::r /var/www/myapp/config # 日志目录允许开发组读取但不可修改 setfacl -m g:dev:r /var/www/myapp/logs setfacl -m m::r /var/www/myapp/logs5. 常见问题排查
问题1:设置了ACL但不起作用?
- 检查文件系统是否支持ACL
- 确认没有mask限制
- 查看SELinux上下文是否冲突
问题2:ACL权限意外丢失?
- 检查文件是否被重写(某些编辑器会新建文件)
- 确认备份恢复时使用了正确参数
问题3:权限继承异常?
- 确保父目录设置了默认ACL
- 检查umask值是否冲突
最后分享个真实踩坑案例:某次用rsync同步数据时忘了加-A参数,导致所有ACL权限丢失。现在我的备份脚本里一定会加上:
rsync -avz --acls --xattrs /source /destination
编程学习
技术分享
实战经验