linux服务私有临时目录与进程隔离需在systemd单元文件中配置privatetmp=yes实现/tmp和/var/tmp的自动挂载隔离;搭配protectsystem=strict、protecthome=read-only限制系统访问;restrictsuidsgid=true和nonewprivileges=true阻断提权;dynamicuser=yes可启用动态uid隔离。

Linux系统中,为服务设置私有临时目录和进程隔离,核心是利用systemd的沙箱化特性,避免服务间文件冲突、提升安全性。关键不在于手动创建目录,而是在服务单元文件中正确配置隔离参数。
使用PrivateTmp启用服务级临时目录隔离
启用后,systemd会为该服务自动挂载独立的/tmp和/var/tmp,彼此不可见,也不影响主机和其他服务。
- 在服务单元文件(如
/etc/systemd/system/myapp.service)的[Service]段添加:PrivateTmp=yes - 无需提前创建目录,systemd在启动时自动绑定挂载一个干净的tmpfs;停止后自动清理
- 若需兼容旧版应用依赖
/tmp路径,该设置完全透明——应用仍可直接读写/tmp,实际访问的是专属副本
通过ProtectSystem和ProtectHome限制文件系统访问
这类选项不提供“私有目录”,但能有效防止服务意外或恶意修改关键路径,是进程隔离的重要补充。
-
ProtectSystem=strict:将/usr、/boot、/etc全设为只读,且屏蔽写入挂载点 -
ProtectHome=read-only:使/home、/root、/run/user对服务只读 - 搭配
PrivateTmp=yes使用效果更佳——既隔离临时空间,又锁死系统敏感区域
用RestrictSUIDSGID与NoNewPrivileges阻断提权路径
即使服务以root运行,这些设置也能大幅压缩攻击面,防止通过SUID二进制或特权继承实现越权。
-
RestrictSUIDSGID=true:禁止服务进程创建或执行带SUID/SGID位的文件 -
NoNewPrivileges=true:阻止进程调用execve()获得比父进程更高的权限(如绕过setuid) - 两者均不影响服务正常功能,但可拦截常见提权利用链
结合DynamicUser实现无持久UID的轻量隔离
适合无需固定用户身份、仅需基本文件权限控制的服务(如Web前端、静态API)。
- 设置
DynamicUser=yes后,systemd在启动时动态分配一个未使用的UID/GID,服务退出即释放 - 自动启用
PrivateTmp、ProtectSystem、ProtectHome等保护项(除非显式覆盖) - 注意:不能访问需要固定UID的资源(如特定
/var/lib子目录),此时应配合StateDirectory=声明数据目录










