网站目录权限最小化:防跨站篡改
发布时间:2026-06-01 21:01       
更新时间:2026-06-02 18:09
被挂马或页面被篡改的站点复盘下来,除了程序漏洞,另一半原因往往是权限开得太宽。目录权限最小化的思路很简单:运行用户能读的才读,能写的只留白名单。
跨站篡改怎么发生
同一台机器上多个站点共用一个运行用户(都用 www 之类)时,A 站的 PHP 进程能读 B 站的全部文件,包括配置文件里的数据库密码。推演一遍攻击路径:攻击者在 A 站传了个小马,接下来不用碰任何系统命令,用几行 PHP 就能遍历同目录水平的兄弟站点,把 B 站配置、C 站密钥挨个翻一遍。跨站攻击的前提就是共享用户加过宽权限,切断这个前提,风险面立刻缩小。
两条基线
属主与运行分离:代码文件属主设为 root 或运维账号,php-fpm 运行用户只给读权限;部署走运维账号,运行归运行用户,两条线不相交。权限位收敛:目录 755、文件 644,含密码的配置文件 640。上线后用两条命令扫一遍基线:
find /var/www/site -type d -exec chmod 755 {} +
find /var/www/site -type f -exec chmod 644 {} +
有的程序要求更多可写目录(需要自动更新的 CMS 常见),也只逐个放开需要的,不做整站可写。
可写目录白名单
真正需要写的目录通常只有三四个:上传、缓存、日志。把它们单独 chown 给运行用户,权限 750,其余全部收回写权限。可写路径越短,攻击者落地之后能做的事越少。有两个后续动作要跟上:程序运行中自动创建的 runtime、cache 目录会继承父目录权限,偶尔冒出可写项属于正常,但要纳入清单;审计动作每周定时跑一次,find 站点目录 -writable(GNU find 语法)列出运行用户实际可写的路径,和预期清单做 diff,多出来的每一项都查清来源再放行。权限这类配置没有弹性可言,紧一点总比松一点安全;把这套基线做成脚本,新站上线直接跑一遍,一次投入长期受用,基线脚本人手一份。