linux服务通过privatetmp、privatedevices、protectsystem等systemd安全选项实现私有临时目录与进程隔离,无需容器即可降低横向攻击风险;启用privatetmp=true使/tmp和/var/tmp独立挂载,privatedevices=true屏蔽非必要设备节点,protectsystem=strict将关键路径设为只读,nonewprivileges=true和restrictsuidsgid=true阻断提权路径,capabilityboundingset按需限定权限。

Linux服务的私有临时目录和进程隔离,核心是通过PrivateTmp、PrivateDevices、ProtectSystem等systemd安全选项实现,无需额外容器或复杂权限管理,只需合理配置单元文件即可显著降低横向攻击风险。
启用私有临时目录(PrivateTmp)
启用后,服务启动时会自动挂载独立的/tmp和/var/tmp命名空间,其他服务无法访问其临时文件,防止敏感数据泄露或符号链接攻击。
- 在服务单元文件(如
/etc/systemd/system/myapp.service)的[Service]段添加:PrivateTmp=true - 若需兼容旧版应用依赖
/tmp全局路径,可配合BindPaths=显式挂载必要子目录(不推荐,默认已足够) - 验证是否生效:
systemctl show myapp.service | grep PrivateTmp→ 应返回PrivateTmp=yes
再执行sudo nsenter -t $(pgrep -f 'myapp') -m -p ls /tmp,确认仅看到本服务创建的文件
限制设备访问与系统路径保护
避免服务意外读取/dev/sda、写入/etc或遍历/proc获取其他进程信息,是阻断提权链的关键一步。
- 禁用非必要设备节点:
PrivateDevices=true(自动屏蔽/dev下除基础设备外的所有节点) - 只读挂载关键系统路径:
ProtectSystem=strict(将/usr、/boot、/etc全设为只读)ProtectHome=read-only(阻止访问用户主目录) - 隐藏其他进程信息:
ProtectProc=invisible(使/proc中仅显示本进程及内核线程)
强化进程命名空间与能力控制
结合RestrictSUIDSGID、NoNewPrivileges等选项,可有效封堵setuid二进制提权、特权继承等常见逃逸路径。
- 禁止进程获取新特权:
NoNewPrivileges=true(覆盖所有后续execve调用) - 禁用SUID/SGID位效果:
RestrictSUIDSGID=true(即使二进制带s位也无效) - 按需降权:使用
CapabilityBoundingSet=明确限定所需能力,例如仅保留cap_net_bind_service用于绑定低端口,移除cap_sys_admin等高危能力 - 示例最小能力集:
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID
验证与调试技巧
配置后必须验证是否真正生效,避免因拼写错误或版本兼容问题导致“假安全”。
- 重载并重启服务:
systemctl daemon-reload && systemctl restart myapp - 检查命名空间隔离状态:
systemctl status myapp | grep "Namespaces:"(应含mnt、pid、user等) - 查看实际挂载点:
systemctl show myapp --property=MountFlagsfindmnt -n -t tmpfs /tmp(确认挂载源为systemd-private-xxx) - 日志排查:若服务启动失败,检查
journalctl -u myapp -xe,常见报错如Operation not permitted多因能力缺失或路径不可写,需回溯调整CapabilityBoundingSet或ReadWritePaths










