18人参与 • 2026-09-16 • Php
宝塔面板默认常用 www 用户运行 nginx 和 php-fpm,网站文件属主也常是 www。这会导致 web 进程权限过大,一旦 thinkphp 应用出现漏洞,攻击者就能直接修改文件、写入 webshell。本文以 thinkphp 为例,讲解如何创建独立用户、分离属主、设置最小权限,并在 nginx 和 php 层禁止 webshell 执行。
宝塔面板安装后,默认配置通常是:
wwwwwwwww这种配置方便,但存在严重安全隐患:
www 身份执行代码;www 是文件属主,它可以 chmod 目录和文件;555,也能先改成 777,写入 webshell,再改回去。因此,必须打破“web 进程用户 = 文件属主”这个等式。
runtime、storage 等运行时目录可写,但禁止执行 php。通过 ssh 登录服务器,创建一个无登录权限的系统用户,例如 tpuser:
# 创建无登录权限的系统用户 sudo useradd -r -s /sbin/nologin tpuser # 将 tpuser 加入 www 组,方便统一管理 sudo usermod -a -g www tpuser
说明:
-r:创建系统用户;-s /sbin/nologin:禁止登录;tpuser:专门用于运行 php-fpm。假设 thinkphp 项目目录为:
/www/wwwroot/your-thinkphp-app
执行以下命令:
# 项目属主设为 tpuser,组为 www
sudo chown -r tpuser:www /www/wwwroot/your-thinkphp-app
# 目录基线:750
sudo find /www/wwwroot/your-thinkphp-app -type d -exec chmod 750 {} \;
# 文件基线:640
sudo find /www/wwwroot/your-thinkphp-app -type f -exec chmod 640 {} \;
说明:
tpuser:部署用户,拥有代码;www:web 进程组,只读;chmod。thinkphp 需要写缓存、日志、会话、上传文件,这些目录必须可写。
# runtime 目录
sudo chown -r tpuser:www /www/wwwroot/your-thinkphp-app/runtime
sudo chmod -r 770 /www/wwwroot/your-thinkphp-app/runtime
sudo find /www/wwwroot/your-thinkphp-app/runtime -type f -exec chmod 660 {} \;
# public/storage 上传目录
sudo chown -r tpuser:www /www/wwwroot/your-thinkphp-app/public/storage
sudo chmod -r 770 /www/wwwroot/your-thinkphp-app/public/storage
sudo find /www/wwwroot/your-thinkphp-app/public/storage -type f -exec chmod 660 {} \;
注意:
770 表示属主和组可读写执行,因为目录需要 x 才能进入;宝塔面板操作:
user = www group = www
user = tpuser group = www
注意:
进入宝塔面板:
网站 → 找到你的站点 → 设置 → 配置文件
在 server 块内添加:
# 禁止 runtime、storage、uploads 目录执行 php
location ~ ^/(runtime|storage|uploads)/.*\.php$ {
return 403;
}
# 禁止直接访问 runtime
location ^~ /runtime/ {
deny all;
}说明:
public,url 中通常没有 public;storage 的 url 可能是 /storage/...;在宝塔 php 配置或站点 fastcgi 配置中加:
open_basedir = /www/wwwroot/your-thinkphp-app/:/tmp/:/proc/
可选禁用危险函数:
disable_functions = system,exec,shell_exec,passthru,popen,proc_open,putenv,pcntl_exec
注意:
open_basedir 限制 php 只能访问项目目录和 /tmp。执行以下命令检查配置:
# 查看 php-fpm 进程用户 ps aux | grep php-fpm # 查看目录权限 ls -ld /www/wwwroot/your-thinkphp-app ls -l /www/wwwroot/your-thinkphp-app/public # 查看 acl getfacl -p /www/wwwroot/your-thinkphp-app # 查找最近修改的 php 文件 find /www/wwwroot/your-thinkphp-app -type f -name "*.php" -mtime -7 -ls
测试:
runtime 写文件,确认应用正常;http://站点/storage/shell.php,应返回 403;| 检查项 | 期望状态 |
|---|---|
| web 根目录 | 指向 public/ |
| 代码文件属主 | tpuser,不是 www |
| 代码目录权限 | 750,文件 640 |
| runtime/storage | 可写,但禁止执行 php |
| php-fpm 用户 | tpuser,不是 www |
| nginx | 禁止敏感目录执行 php |
| open_basedir | 限制在项目目录和 /tmp |
| 危险函数 | 按需禁用 |
一句话核心:
web 进程用户 ≠ 网站文件属主;代码只读,运行时目录可写但禁止执行 php。
按照这套方案配置后,即使 thinkphp 应用出现漏洞,攻击者也难以直接写入并执行 webshell,服务器安全性将显著提升。
以上就是nginx+thinkphp最小权限安全配置实战的详细内容,更多关于nginx thinkphp最小权限安全配置的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论