ACL(Access Control List,访问控制列表)是Linux系统中用于实现更细粒度文件权限控制的机制,它扩展了传统的Unix权限系统(user/group/others三种权限)。
传统的Unix权限系统有以下局限性: - 只能为一个用户、一个组和其他人设置权限 - 无法为多个用户或多个组设置不同权限 - 无法为特定用户和组组合设置权限
ACL解决了这些问题,允许为任意数量的用户和组设置精确的权限。
在开始使用ACL前,请确认: 1. 文件系统是否支持ACL(ext3/4、xfs、btrfs等现代文件系统通常支持) 2. 系统是否安装了ACL工具
# 检查文件系统是否支持ACL
mount | grep acl
# 如果没有输出,可以重新挂载文件系统启用ACL
mount -o remount,acl /
getfacl 文件名
示例输出:
# file: testfile
# owner: user1
# group: group1
user::rw-
user:user2:r--
group::r--
mask::r--
other::r--
setfacl -m u:用户名:权限 文件名 # 为用户设置
setfacl -m g:组名:权限 文件名 # 为组设置
示例:
setfacl -m u:user2:rw testfile # 给user2读写权限
setfacl -m g:developers:rx project/ # 给developers组读执行目录权限
setfacl -x u:用户名 文件名 # 删除用户ACL
setfacl -x g:组名 文件名 # 删除组ACL
setfacl -b 文件名
-R
: 递归设置(用于目录)-d
: 设置默认ACL(新创建的文件/目录将继承这些权限)-k
: 删除默认ACL# 创建共享目录
mkdir /shared
# 设置组所有权
chown :team /shared
# 设置基础权限
chmod 770 /shared
# 为特定用户添加权限
setfacl -m u:guest:rx /shared
# 为另一个组添加权限
setfacl -m g:contractors:rwx /shared
# 设置默认ACL,使新文件继承权限
setfacl -dm u::rwx,g::rwx,o::--- /shared
# 允许apache用户读取网站文件
setfacl -R -m u:apache:r-x /var/www/html
# 允许开发组完全访问
setfacl -R -m g:webdev:rwx /var/www/html
# 设置默认ACL,使新文件自动获得适当权限
setfacl -R -dm u:apache:r-x,d:g:webdev:rwx /var/www/html
ACL中的mask定义了用户和组能够获得的最大权限。设置ACL时,实际有效权限是请求权限与mask的交集。
查看和设置mask:
getfacl file | grep mask
setfacl -m m::rwx file
# 备份目录ACL
getfacl -R /path/to/dir > acl_backup.txt
# 恢复ACL
setfacl --restore=acl_backup.txt
通过合理使用ACL,您可以实现比传统Unix权限更灵活、更精确的文件系统访问控制。