多用户服务器独立临时目录核心是系统级隔离:服务级用systemd的PrivateTmp=yes自动挂载专属tmpfs;PHP-FPM需按pool配置独立upload_tmp_dir并严格赋权;普通用户依赖sticky bit、XDG_RUNTIME_DIR及ACL实现租户级隔离。

多用户服务器上设置独立临时目录,核心是避免用户间通过 /tmp 或 /var/tmp 互相窥探、覆盖甚至提权。不能靠手动建子目录加 chmod 应付,必须借助系统级隔离机制。
用 systemd 的 PrivateTmp 隔离服务级临时空间
如果多个用户各自运行后台服务(如 Web 应用、定时任务、API 守护进程),最稳妥的方式是在对应服务的 systemd 单元文件中启用 PrivateTmp=yes:
- 在
/etc/systemd/system/myapp.service的[Service]段添加该行,无需创建目录,systemd 启动时自动挂载干净的 tmpfs - 该服务内所有进程看到的
/tmp和/var/tmp是专属副本,其他用户或服务完全不可见 - 验证方式:
sudo nsenter -t $(pgrep -f myapp) -m -p ls /tmp,只应列出本服务产生的文件
为 PHP-FPM 多租户实例配置独立 upload_tmp_dir
Web 场景下,PHP 上传临时文件极易冲突。upload_tmp_dir 必须按 pool 隔离,不能共用 /tmp 或 NFS 路径:
- 在每个 pool 配置文件(如
/etc/php/8.2/fpm/pool.d/site-a.conf)中写入:php_admin_value[upload_tmp_dir] = /var/tmp/php-site-a - 提前创建并严格赋权:
mkdir -p /var/tmp/php-site-a && chown www-data:www-data /var/tmp/php-site-a && chmod 700 /var/tmp/php-site-a - 禁止使用
/tmp或带前缀的子路径——PHP 内部生成的临时文件名不保证跨进程唯一性
Linux 用户账户间的基础临时隔离
普通登录用户之间虽无内核级命名空间保护,但可通过权限与策略降低风险:
- 确保
/tmp本身设为 sticky bit:chmod 1777 /tmp,防止用户删除他人文件(但不阻止读取) - 对敏感脚本或工具,强制其使用
$XDG_RUNTIME_DIR(通常为/run/user/$(id -u)),该路径由 pam_systemd 自动创建且仅属主可访问 - 禁用全局可写的临时目录:检查并清理
/var/tmp下非必要开放权限的子目录,尤其避免用户能chown或chmod其他人的临时目录
ACL 辅助实现租户级目录临时区
若需为特定租户提供专用临时工作区(如数据处理沙箱),可用 ACL 精确控制访问边界:
- 创建租户专属临时目录:
mkdir -p /srv/tmp/tenant-a - 清除默认继承权限:
setfacl -b /srv/tmp/tenant-a - 仅授权目标用户:
setfacl -m u:tenant-a:rwx /srv/tmp/tenant-a,同时屏蔽其他租户:setfacl -m u:tenant-b:--- /srv/tmp/tenant-a - 启用默认 ACL 保证新建文件继承:
setfacl -d -m u:tenant-a:rwx /srv/tmp/tenant-a

















