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. 效果验证
配置完成后可执行以下命令验证隔离效果:
- 切到site1用户尝试读取site2的配置文件:
su -s /bin/bash site1 -c "cat /var/www/site2.example.com/public/config.php",应返回Permission denied - 访问站点页面,确认静态资源、PHP页面可正常加载,cache、log目录下有NGINX正常写入的文件
- 用webbackup用户尝试写入非backup目录:
su -s /bin/bash webbackup -c "touch /var/www/site1.example.com/public/test.txt",应返回权限拒绝,写入backup目录则可正常执行。
内容的提问来源于stack exchange,提问作者A. Neumann
相关产品推荐
相关产品推荐

