ACL是解决Web服务器多人协作目录权限冲突的有效机制,支持为任意用户或组单独设置读写执行权限而不破坏原有属主结构,需确认系统支持、合理配置默认ACL、注意mask限制并结合自动化工具加固。

ACL(Access Control List,访问控制列表)是解决Web服务器上多人协作时目录权限冲突的有效机制,尤其适用于开发团队共用测试环境、CMS多管理员后台、静态站点多人部署等场景。相比传统Unix权限(user/group/others三级),ACL支持为任意用户或组单独设置读、写、执行权限,且不破坏原有属主/属组结构,灵活性强、可追溯性好。
一、确认系统与文件系统支持ACL
并非所有环境默认启用ACL,需提前验证:
- Linux内核需支持(现代发行版基本都支持),检查挂载选项:
mount | grep " /var/www ",确认输出含 acl(如/dev/sda1 on /var/www type ext4 (rw,relatime,acl)) - 若无acl,需重新挂载:
sudo mount -o remount,acl /var/www;永久生效则修改/etc/fstab,在对应行的挂载选项中加入 acl - 确认工具可用:
getfacl和setfacl命令应存在(通常在acl软件包中,CentOS/RHEL用yum install acl,Ubuntu/Debian用apt install acl)
二、典型协作场景与ACL配置策略
以 /var/www/example.com 为例,团队含:运维(ops)、前端(fe)、后端(be)、内容编辑(editor)。目标是让各角色按需操作,互不越权:
-
基础权限固化:先设好属主/属组与传统权限,例如
sudo chown -R root:www-data /var/www/example.com,sudo chmod -R 755 /var/www/example.com,确保Web服务(如nginx/apache)能读取 -
授予特定用户写权限:前端需更新
/var/www/example.com/assets/,但不能动PHP脚本sudo setfacl -R -m u:fe:rwx /var/www/example.com/assets/sudo setfacl -R -m u:fe:rx /var/www/example.com/(仅根目录可读可执行,防止误删) -
按组批量授权:后端与运维需协同维护
/var/www/example.com/app/sudo setfacl -R -m g:be:rwx,g:ops:rwx /var/www/example.com/app/ -
限制敏感目录:禁止editor访问配置和日志
sudo setfacl -R -m u:editor:--- /var/www/example.com/config/sudo setfacl -R -m u:editor:--- /var/www/example.com/logs/
三、关键实操要点与避坑提醒
ACL易用但细节决定成败,以下为高频问题应对方式:
-
默认ACL(default ACL)必须设:否则新创建的子文件/目录不继承权限。对协作目录执行:
sudo setfacl -d -m g:be:rwx,g:ops:rwx /var/www/example.com/app/(注意 -d 参数) -
权限叠加逻辑要清楚:ACL权限与传统权限是“并集”关系,但最终生效取交集。例如某文件传统权限为
644(即 group 不可写),即使ACL给group加了w,实际仍不可写——务必先确保基础权限允许对应操作 -
排查权限失效?看ACL是否被mask覆盖:ACL有个隐式mask字段,它会限制所有named user/group的最大有效权限。若发现设了w却无法写,运行
getfacl 文件名查看mask值;必要时显式重设:setfacl -n -m m::rwx 目录 -
备份与迁移ACL:用
getfacl -R /var/www/example.com > acl_backup.txt备份;恢复时setfacl --restore=acl_backup.txt
四、配合Web服务与自动化加固协作流
ACL只是基础,需融入工作流才能长效稳定:
-
与Git钩子联动:在pre-receive钩子中校验推送路径是否符合ACL策略(如禁止向
/config/推送PHP文件),失败则拒绝合并 -
部署脚本自动同步ACL:rsync或Ansible部署时,加上
--acls参数(rsync)或acl: yes模块(Ansible),避免覆盖已有ACL规则 -
定期审计权限:用
find /var/www -type d -exec getfacl {} \; | grep -E "(user:|group:|mask:)" | grep -v "default:"快速列出非常规ACL项,人工复核 -
Web应用层兜底:ACL管文件系统,但PHP/Node.js等仍可能因代码缺陷越权。务必关闭目录浏览(nginx中
autoindex off),敏感路径做location deny,上传目录禁用脚本执行

















