Linux ACL 权限实战:从基础配置到高级继承策略(含默认权限详解)

📅 2026/7/5 12:18:20 👁️ 阅读次数 📝 编程学习
Linux ACL 权限实战:从基础配置到高级继承策略(含默认权限详解)

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.cfg

ACL权限的组成要素包括:

  • 主体:用户(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/html

3. 高级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 testfile

3.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/uploads

3.3 递归设置与备份

递归设置ACL(慎用):

# -R递归整个目录树 setfacl -R -m u:backup:rx /data

ACL权限备份与恢复

# 备份整个目录的ACL getfacl -R /data > data_acls.backup # 恢复时 setfacl --restore data_acls.backup

4. 实战案例: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/uploads

4.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/logs

5. 常见问题排查

问题1:设置了ACL但不起作用?

  • 检查文件系统是否支持ACL
  • 确认没有mask限制
  • 查看SELinux上下文是否冲突

问题2:ACL权限意外丢失?

  • 检查文件是否被重写(某些编辑器会新建文件)
  • 确认备份恢复时使用了正确参数

问题3:权限继承异常?

  • 确保父目录设置了默认ACL
  • 检查umask值是否冲突

最后分享个真实踩坑案例:某次用rsync同步数据时忘了加-A参数,导致所有ACL权限丢失。现在我的备份脚本里一定会加上:

rsync -avz --acls --xattrs /source /destination