启用privatetmp=true可为systemd服务创建隔离的/tmp和/var/tmp命名空间;需在服务单元文件[service]段添加该选项,重载并重启后通过systemctl show和nsenter验证;推荐配合/etc/tmpfiles.d/清理规则使用,并注意兼容硬编码/tmp的旧应用。

直接在服务单元文件里加几行关键配置,就能让 systemd 自动完成沙盒隔离,不需要额外装容器或改代码。
启用私有临时目录和设备隔离
这是最基础也最有效的隔离手段,防止服务间互相窥探或污染临时文件:
-
PrivateTmp=true:为服务创建独立的
/tmp和/var/tmp,其他进程完全看不到它的临时文件 -
PrivateDevices=true:自动屏蔽
/dev下绝大多数设备节点(如/dev/sda、/dev/mem),只保留/dev/null、/dev/zero等必需项 -
ProtectProc=invisible:让服务在
/proc中只能看到自己和内核线程,无法遍历其他进程信息
锁定系统路径与运行环境
阻止服务意外读写关键系统区域,切断常见提权链路:
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
-
ProtectSystem=strict:将
/usr、/boot、/etc全部设为只读挂载 -
ProtectHome=read-only 或 ProtectHome=true:禁止访问
/home、/root、/run/user -
NoNewPrivileges=true:禁用所有后续
execve调用中的 setuid/setgid 和 capability 提权能力 - RestrictSUIDSGID=true:即使二进制文件设置了 SUID 位,运行时也完全无效
按需授予最小权限能力
用 capabilities 替代 root,避免“全有或全无”的权限模型:
- 查清服务真正需要的能力,比如绑定 80 端口只需
cap_net_bind_service,修改时间只需cap_sys_time - 在单元文件中设置:CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID
- 务必避开
CAP_SYS_ADMIN——它几乎等于 root 权限,应拆解为更细粒度能力 - 配合 ReadOnlyPaths=/usr /etc 和 RWPaths=/var/lib/myapp /run/myapp 显式声明可读写路径
使用动态用户强化账号安全
让服务不再依赖固定系统账号,从源头消除账号复用和权限残留风险:
- 添加 DynamicUser=yes:启动时自动分配临时 UID/GID,退出后立即回收
- 搭配 StateDirectory=myapp 和 CacheDirectory=myapp,自动创建并管理属主正确的运行时目录
- 无需手动创建用户、设 shell、调权限,systemd 全程托管,且默认禁用登录入口










