Laravel正确权限配置下admin用户无目录操作权限方案咨询
问题根因
执行usermod -a -G www-data admin后,当前已登录的SSH会话不会自动加载新的用户组权限,执行groups命令就能验证,当前会话的组列表里大概率看不到www-data。另外你贴出的项目根目录权限是drwxr-xr-x,组位本身只有读和执行权限,就算组权限加载成功也没法写入文件,但直接给整个项目根目录开组写权限确实不符合安全规范——Laravel官方仅要求web服务进程对特定运行时目录有写权限,不需要开放整个项目根目录的写权限。
符合安全规范的配置步骤
- 首先让用户组变更生效
执行加组命令后,退出当前SSH会话重新登录即可加载新的组权限;如果不想断开当前会话,也可以执行newgrp www-data临时在当前会话加载www-data组权限,执行groups确认输出包含www-data就说明组权限加载正常。 - 按Laravel官方标准配置目录所有权与基础权限
不要给整个项目开全局或组写权限,正确的权限模型是部署用户拥有项目完整管理权限,web服务进程仅能读取项目代码、对必要的运行时目录有写权限:- 将整个项目的所有者设为部署用的admin用户,所属组设为web进程运行的www-data组:
sudo chown -R admin:www-data /path/to/your/laravel/project - 统一设置基础权限:所有文件权限为640(所有者可读写,组可读,其他用户无权限),所有目录权限为750(所有者可读写进入,组可读进入,其他用户无权限):
sudo find /path/to/your/laravel/project -type f -exec chmod 640 {} \; sudo find /path/to/your/laravel/project -type d -exec chmod 750 {} \; - 单独给Laravel运行必需的可写目录开放组写权限,包含
storage、bootstrap/cache两个核心目录,如果你有自定义的用户上传目录(比如public/uploads)也按相同规则配置:sudo chmod -R 770 /path/to/your/laravel/project/storage sudo chmod -R 770 /path/to/your/laravel/project/bootstrap/cache
- 将整个项目的所有者设为部署用的admin用户,所属组设为web进程运行的www-data组:
- 适配GitHub Actions自动化部署的补充配置
为了避免部署过程中新生成的文件/目录权限不继承,导致后续web进程无法读写,给项目配置默认ACL规则,让新建内容自动继承正确的组和权限,不用每次部署后手动修正:# Debian/Ubuntu系先安装acl工具:sudo apt install acl # CentOS/RHEL系先安装acl工具:sudo dnf install acl # 给整个项目设置默认ACL,新建内容自动归属www-data组并分配对应权限 sudo setfacl -R -m d:g:www-data:rwx /path/to/your/laravel/project # 给运行时可写目录补全组权限 sudo setfacl -R -m g:www-data:rwx /path/to/your/laravel/project/storage sudo setfacl -R -m g:www-data:rwx /path/to/your/laravel/project/bootstrap/cache
不推荐
chmod g+w .方案的原因 直接给项目根目录开组写权限,会让整个项目的所有代码文件都对www-data组可写,一旦web服务出现漏洞,攻击者可以直接篡改项目代码植入后门,安全风险极高,完全不符合生产环境最小权限原则。
内容的提问来源于stack exchange,提问作者JanBoehmer
相关产品推荐
相关产品推荐

