守护进程安全运行的核心是权限最小化,需使用专用低权限用户、能力裁剪(如CAP_NET_BIND_SERVICE)、路径隔离(ProtectSystem=strict等)和系统调用过滤(SystemCallFilter等)来压缩攻击面。

守护进程要安全运行,核心是不让它拿超出需要的权限。不靠root硬扛,而是用专用用户、能力裁剪、路径隔离和系统调用过滤,把攻击面压到最低。
用专用低权限用户启动
绝大多数守护进程根本不需要root身份。应为每个服务创建独立用户,比如nginx、redis或myapp,并确保该用户:
- 登录 Shell 设为
/sbin/nologin - 没有家目录(或设为空目录)
- 不属于
wheel、sudo或其他特权组 - 在 systemd service 文件中明确指定:
User=myappGroup=myapp
低端口绑定不用root,改用能力机制
如果服务需监听 80 或 443 端口,不要直接用 root 启动,而应授予最小必要能力:
- 在 unit 文件中添加:
CapabilityBoundingSet=CAP_NET_BIND_SERVICEAmbientCapabilities=CAP_NET_BIND_SERVICE - 这样进程可绑定低端口,但无法执行其他特权操作(如加载内核模块、挂载文件系统)
- 避免使用
setcap直接给二进制加能力,容易绕过 systemd 约束
限制文件系统可见性与写入范围
防止进程意外或恶意读写系统关键路径:
- 启用只读保护:
ProtectSystem=strict(/usr、/boot、/etc 只读)ProtectHome=true(屏蔽 /home、/root、/run/user) - 显式放开必需路径:
ReadWritePaths=/var/log/myapp /var/cache/myapp - 禁用 SUID/SGID 提权:
RestrictSUIDSGID=true
收紧系统调用与运行环境
从内核层进一步缩小攻击面:
- 禁用高危能力:
CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_MODULE CAP_SYS_PTRACE CAP_AUDIT_WRITE - 启用系统调用白名单:
SystemCallFilter=@system-service或引用自定义 JSON 策略 - 隔离临时空间:
PrivateTmp=truePrivateDevices=trueProcSubset=pid - 阻止提权行为:
NoNewPrivileges=true
配置完记得 reload unit 并 restart 服务,用 systemctl show myapp.service | grep -E "(User|Capability|Protect|Private)" 核对生效项。不复杂但容易忽略细节。











