为系统服务配置专用运行账号,核心是创建不可登录的系统用户、绑定精准资源权限、限制运行时能力边界;需用useradd -r创建无shell无家目录账户,chown/chmod收紧文件权限,并在systemd中设User/Group、CapabilityBoundingSet及ProtectSystem等防护项。

为系统服务配置专用运行账号,核心是让每个服务在隔离、受限的用户上下文中运行,避免进程间权限交叉或越权访问。不靠经验猜测,而是按标准流程做对三件事:创建不可登录的系统用户、绑定精准资源权限、限制运行时能力边界。
创建无登录能力的服务专属用户
服务账号不是普通用户,不能交互登录,也不需要家目录和 shell。用 useradd -r 创建系统级账户,确保它被识别为服务身份而非人为账户:
-
基础命令:`useradd -r -s /sbin/nologin -M myservice`
其中 -r 标识系统用户(UID 自动落在 1–999 区间),-s /sbin/nologin 禁用所有登录方式,-M 跳过家目录创建 - 避免硬编码 UID:除非集群环境强要求,否则不要加 -u 参数。系统自动分配更安全,也避免与已有账户冲突
- 组管理要干净:默认会创建同名主组(-U 可显式启用)。如需额外权限(例如读取某块设备),再用 usermod -aG disk myservice 追加,不提前堆叠
限定服务可访问的文件与目录权限
账号建好了,但若配置文件、数据目录、日志路径仍属 root 或权限过宽,等于白设。关键动作是“归属+收紧”:
- 全部属主归位:`chown -R myservice:myservice /etc/myservice/ /var/lib/myservice/ /var/log/myservice/`
- 目录权限设为 750(属主全权、同组可读执行、其他无权);配置文件设为 640(属主读写、同组只读、其他无权);敏感密钥文件必须 600
-
禁用 world 可写位:检查
find /etc/myservice -type f -perm /o+w,发现即修复。服务不该依赖全局可写路径
通过 systemd 约束运行时能力
即使用户权限低,Linux capabilities 仍可能赋予进程过高系统调用权限。systemd 单元文件是统一管控入口:
-
强制指定运行身份:在
/etc/systemd/system/myservice.service中添加User=myserviceGroup=myservice -
精简 capabilities:例如仅需绑定 80 端口,就写
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
并显式丢弃高危项:NoNewPrivileges=yes -
附加防护层:启用
ProtectSystem=strict(挂载只读系统目录)、PrivateTmp=yes(隔离临时文件)、RestrictSUIDSGID=yes(禁用 setuid/setgid 二进制)
验证与持续防护要点
配置完不等于生效,得确认进程真正在预期账户下跑,且没偷偷提权:
- 检查进程属主:`ps aux | grep myservice`,确认 USER 列为 myservice,不是 root 或 nobody
-
测试越界行为:手动切换到该用户(
sudo -u myservice bash),尝试cat /etc/shadow或touch /tmp/test,应全部失败 -
审计日志留痕:确保
auditd开启,并配置规则监控该用户对敏感路径的访问,例如:-w /etc/shadow -p wa -k auth_access -
定期扫描越界账户:用
awk -F: '$3 检查是否混入非必要低 UID 账户

















