You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务进程仅能读取项目代码、对必要的运行时目录有写权限:
    1. 将整个项目的所有者设为部署用的admin用户,所属组设为web进程运行的www-data组:
      sudo chown -R admin:www-data /path/to/your/laravel/project
    2. 统一设置基础权限:所有文件权限为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 {} \;
      
    3. 单独给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
      
  • 适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:51:20