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

LEMP栈多站点部署的权限配置与安全隔离方案

Debian多站点NGINX+PHP-FPM安全隔离落地方案

核心逻辑是完全收紧全局其他用户权限,用Linux ACL(访问控制列表)给NGINX、备份用户单独精准授权,避免传统属组授权导致的权限溢出,从系统层阻断跨站文件访问。


1. 前置准备

首先安装ACL工具,创建无登录权限的专用备份用户:

apt update && apt install -y acl
# 创建备份用户,禁止ssh登录
useradd -r -s /usr/sbin/nologin webbackup

2. 收紧站点目录基础权限

先把所有站点的全局权限收死,从根源阻止非授权用户跨站访问,以site1为例,其余站点替换对应目录和用户名即可:

# 重置站点目录属主为对应PHP-FPM运行用户
chown -R site1:site1 /var/www/site1.example.com
# 所有目录权限设为700:仅属主有读、写、遍历权限
find /var/www/site1.example.com -type d -exec chmod 700 {} \;
# 所有文件权限设为600:仅属主有读、写权限
find /var/www/site1.example.com -type f -exec chmod 600 {} \;

这一步完成后,site2、site3等其他站点的PHP用户,甚至其他系统普通用户,都无法进入site1的目录,更不可能读取config.php、备份包等敏感文件,跨站访问直接被系统层拦截。

不要用将站点属组设为nginx组的方案:一旦某个站点用户被加入nginx组,就会获得所有站点的读权限,隔离完全失效。

3. 给NGINX分配精准权限

通过ACL单独给nginx用户授权,不开放全局other权限:

# 给nginx授予全站所有目录、文件的读+目录遍历权限(大写X仅给目录加执行位,不给普通文件加执行权限)
setfacl -R -m u:nginx:rX /var/www/site1.example.com
# 单独给cache、log目录授予递归写权限,满足NGINX写缓存、日志的需求
setfacl -R -m u:nginx:rwx /var/www/site1.example.com/cache
setfacl -R -m u:nginx:rwx /var/www/site1.example.com/log

# 配置默认ACL,后续站点内新建的文件、目录会自动继承上述权限,无需重复配置
setfacl -R -d -m u:nginx:rX /var/www/site1.example.com
setfacl -d -m u:nginx:rwx /var/www/site1.example.com/cache
setfacl -d -m u:nginx:rwx /var/www/site1.example.com/log

同时修改每个PHP-FPM池的配置(路径一般为/etc/php/*/fpm/pool.d/site1.conf),用ACL给nginx授予sock文件访问权限,不要放开sock的全局读权限:

; 注释掉原来的listen.mode = 0660这类配置
listen.acl_users = nginx

配置完重启PHP-FPM生效。

4. 给备份用户分配权限

和NGINX授权逻辑一致,给webbackup用户授予全站读权限,仅backup目录开放写权限:

# 全站读+目录遍历权限
setfacl -R -m u:webbackup:rX /var/www/site1.example.com
# 仅backup目录开放递归写权限
setfacl -R -m u:webbackup:rwx /var/www/site1.example.com/backup

# 配置默认ACL自动继承
setfacl -R -d -m u:webbackup:rX /var/www/site1.example.com
setfacl -d -m u:webbackup:rwx /var/www/site1.example.com/backup

后续定时备份任务直接指定用webbackup用户运行即可,不要用root执行备份脚本,避免脚本漏洞导致服务器被完全控制。

5. 应用层加固(额外防护层)

就算系统权限配置疏漏,这部分配置也能兜底阻断攻击:

  • 每个PHP-FPM池配置open_basedir限制,限定PHP仅能访问自身站点目录和临时目录:
    php_admin_value[open_basedir] = /var/www/site1.example.com/:/tmp/
    
  • 禁用高风险PHP函数,关闭远程文件包含:
    php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,putenv
    php_admin_value[allow_url_fopen] = Off
    php_admin_value[allow_url_include] = Off
    
  • NGINX全局配置中拦截backup目录的外网访问,避免备份文件被下载泄露:
    location ~* /backup/ {
        deny all;
        return 403;
    }
    

6. 效果验证

配置完成后可执行以下命令验证隔离效果:

  1. 切到site1用户尝试读取site2的配置文件:su -s /bin/bash site1 -c "cat /var/www/site2.example.com/public/config.php",应返回Permission denied
  2. 访问站点页面,确认静态资源、PHP页面可正常加载,cache、log目录下有NGINX正常写入的文件
  3. 用webbackup用户尝试写入非backup目录:su -s /bin/bash webbackup -c "touch /var/www/site1.example.com/public/test.txt",应返回权限拒绝,写入backup目录则可正常执行。

内容的提问来源于stack exchange,提问作者A. Neumann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:03:32