最标准安全的做法是在服务单元文件的[Service]段添加PrivateTmp=yes,systemd会为服务挂载独立tmpfs到/tmp和/var/tmp,实现完全隔离且服务停止后自动销毁;还可搭配PrivateDevices=true、ProtectSystem=strict等增强纵深防御。

直接在服务单元文件里加 PrivateTmp=yes 就行,这是最标准、最安全的做法。
启用 PrivateTmp 隔离临时目录
systemd 会为该服务自动挂载一个独立的 tmpfs 到 /tmp 和 /var/tmp,与其他服务、用户进程完全隔离。服务停止后,这个私有临时空间自动销毁,不留痕迹。
- 编辑服务文件,比如
/etc/systemd/system/myapp.service - 在
[Service]段添加一行:PrivateTmp=yes - 保存后重载配置:
sudo systemctl daemon-reload - 重启服务生效:
sudo systemctl restart myapp
验证是否生效
不能只看服务是否启动,要确认命名空间确实独立:
- 查配置项:
systemctl show myapp.service | grep PrivateTmp→ 应输出PrivateTmp=yes - 找主进程 PID:
pgrep -f 'myapp' - 进入其 mount namespace 查看:
sudo nsenter -t $PID -m -p ls /tmp→ 只能看到本服务创建的文件,看不到其他服务或用户的临时内容
补充说明与注意事项
默认已足够,一般无需额外操作。但遇到旧应用强依赖全局 /tmp 路径时,可谨慎配合 BindPaths= 显式挂入必要子目录(不推荐,应优先改造应用)。
-
PrivateTmp=yes同时作用于/tmp和/var/tmp - 它不改变应用代码,对程序完全透明
- 不依赖用户登录状态,适用于 systemd-run、容器内服务、后台守护进程等各种场景
- 若服务需访问主机
/tmp下特定文件(极少见),可用BindPaths=/tmp/shared:/tmp/shared:ro只读挂载,但务必评估安全风险
搭配其他安全选项效果更好
PrivateTmp 是基础,再加几项能显著提升纵深防御能力:
-
PrivateDevices=true:屏蔽非必要设备节点(如/dev/sda) -
ProtectSystem=strict:将/usr、/boot、/etc设为只读 -
NoNewPrivileges=true:禁止后续 execve 获得新特权 -
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID:按需限定能力,去掉CAP_SYS_ADMIN等高危权限


















