摘要
宝塔面板默认常用 www 用户运行 nginx 和 php-fpm,网站文件属主也常是 www。这会导致 web 进程权限过大,一旦 thinkphp 应用出现漏洞,攻击者就能直接修改文件、写入 webshell。本文以 thinkphp 为例,讲解如何创建独立用户、分离属主、设置最小权限,并在 nginx 和 php 层禁止 webshell 执行。
一、背景:宝塔默认配置的风险
宝塔面板安装后,默认配置通常是:
- nginx 运行用户:
www - php-fpm 运行用户:
www - 网站目录属主:
www
这种配置方便,但存在严重安全隐患:
- web 进程用户 = 网站文件属主;
- 一旦应用出现文件上传、rce 等漏洞,攻击者可以以
www身份执行代码; - 由于
www是文件属主,它可以chmod目录和文件; - 即使目录是
555,也能先改成777,写入 webshell,再改回去。
因此,必须打破“web 进程用户 = 文件属主”这个等式。
二、核心原则
- 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 进程组,只读;- web 进程无法写代码目录,也无法
chmod。
五、单独开放 runtime 和 storage
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才能进入; - 但目录可写 ≠ 可以执行 php,必须在 nginx 层禁止。
六、修改 php-fpm 运行用户
宝塔面板操作:
- 进入 软件商店 → 找到正在使用的 php 版本 → 点击 设置;
- 选择 配置修改 选项卡;
- 找到:
user = www group = www
- 修改为:
user = tpuser group = www
- 点击 保存,然后重启 php-fpm 服务。
注意:
- 如果服务器有多个站点共用这个 php 版本,改全局用户会影响所有站点;
- 多站点建议为站点单独配置 php-fpm 池,或使用容器/独立环境;
- 单站点可以直接改。
七、nginx 禁止敏感目录执行 php
进入宝塔面板:
网站 → 找到你的站点 → 设置 → 配置文件
在 server 块内添加:
# 禁止 runtime、storage、uploads 目录执行 php
location ~ ^/(runtime|storage|uploads)/.*\.php$ {
return 403;
}
# 禁止直接访问 runtime
location ^~ /runtime/ {
deny all;
}说明:
- 如果站点根目录指向
public,url 中通常没有public; storage的 url 可能是/storage/...;- 根据实际 web 根调整路径。
八、php 层加固
在宝塔 php 配置或站点 fastcgi 配置中加:
open_basedir = /www/wwwroot/your-thinkphp-app/:/tmp/:/proc/
可选禁用危险函数:
disable_functions = system,exec,shell_exec,passthru,popen,proc_open,putenv,pcntl_exec
注意:
- 可能影响 thinkphp 正常功能,需测试;
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 进程不能写代码目录。
十、总结与检查清单
| 检查项 | 期望状态 |
|---|---|
| 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最小权限安全配置的资料请关注代码网其它相关文章!
发表评论