必须配置User=和Group=以避免root运行,推荐用useradd -r创建无登录用户;还需设置NoNewPrivileges=true、CapabilityBoundingSet=CAP_NET_BIND_SERVICE(需setcap)、RestrictSUIDSGID=true;用户级服务同理但路径在$HOME/.config/systemd/user/。

直接在服务单元文件的 [Service] 段落里写 User= 和 Group=,就能让 systemd 启动服务时切换到指定用户身份运行。这不是“建议”,而是必须配置的关键安全项——不设 User,默认以 root 运行。
基础写法:User 和 Group 字段
编辑你的 .service 文件(如 /etc/systemd/system/myapp.service),在 [Service] 下添加:
-
User=myapp—— 指定运行该服务的系统用户(推荐用useradd -r -s /sbin/nologin -M myapp创建) -
Group=myapp—— 指定所属主组,通常与用户名一致 - 两者必须同时存在且有效;若只写 User 不写 Group,systemd 会默认使用该用户的主组,但显式写出更清晰、可维护
配套加固:防止提权和能力滥用
仅设 User/Group 不够,还需限制进程后续行为:
-
NoNewPrivileges=true—— 禁止服务进程调用execve()获取新权限(比如 setuid 二进制) -
CapabilityBoundingSet=CAP_NET_BIND_SERVICE—— 若需绑定 1–1023 端口,用此代替 root;再配合setcap 'cap_net_bind_service=+ep' /path/to/binary -
RestrictSUIDSGID=true—— 阻止创建或访问带 SUID/SGID 的文件
用户级服务(--user)同样适用
如果你用的是用户级 systemd(systemctl --user),配置方式完全一样,只是文件放在用户目录下:
- 路径为
$HOME/.config/systemd/user/myapp.service或/usr/lib/systemd/user/ - 仍需写
User=,但此时值应是你自己的登录用户名(如User=john),不能是 root 或其他系统用户 - 用户级服务天然隔离,无需
NoNewPrivileges等硬性限制,但建议保留RestrictSUIDSGID防意外
验证是否生效
启用并启动服务后,用以下命令确认实际运行身份:
-
systemctl status myapp→ 查看 “Main PID” 对应的用户 ps -o pid,user,group,cmd -p $(systemctl show --property MainPID --value myapp)- 检查
/proc/<pid>/status中的Uid:和Gid:行


















