服务账号必须以最低必要权限运行,核心是“不给多余特权,只留刚够用的权限”。需创建独立账户(Linux用useradd -r -s /sbin/nologin -M,Windows建svc_前缀本地用户),精确绑定资源(文件权限640/750、路径级访问控制),剥离高危能力(systemd CapabilityBoundingSet或setcap、禁用SeDebugPrivilege),并持续验证运行身份与越权拦截效果。

服务账号必须以最低必要权限运行,核心是“不给多余特权,只留刚够用的权限”。这不是调低几个数字,而是从账户创建、资源绑定、能力限制到审计验证的闭环控制。
独立账户:每个服务配专属身份
禁用共用账户或 root 直接运行。Linux 下用 useradd -r -s /sbin/nologin -M 创建无家目录、无登录能力的系统用户(如 nginx_user);Windows 下新建本地用户(命名建议带 svc_ 前缀),勾选“此账户用于服务身份验证”,并禁用交互式登录。账户 UID/GID 或 SID 应唯一,避免硬编码冲突。
资源绑定:权限精确到路径与操作
服务只能碰它真正需要的文件、目录和端口:
- 文件权限设为 640(配置)或 750(目录),属主属组均为服务账户,禁用 world 可写
- Web 服务数据目录(如
/var/www/html)仅授予Read & Execute,上传目录单独设Write权限并限制继承 - 日志目录归服务账户所有,但禁止执行权限;数据库数据目录设
Modify但不开放Execute - Windows 下用
icacls阻断继承并显式授权,例如:icacls "C:\MyApp\Data" /inheritance:d /grant:r "svc_app:(OI)(CI)(M)"
进程能力:剥离高危特权,按需启用
避免服务启动时短暂持有 root 权限:
- Linux 用 systemd 单元明确指定 User= 和 Group=,并在
[Service]中设置CapabilityBoundingSet=CAP_NET_BIND_SERVICE等必要能力,禁用CAP_SYS_ADMIN - 对需绑定 80/443 端口的服务,可用
setcap 'cap_net_bind_service=+ep'赋权二进制文件,替代以 root 启动 - Windows 服务在 SCM 中指定登录身份,并通过组策略严格限制 SeServiceLogonRight,禁用 SeDebugPrivilege 等高危特权
持续验证:防止权限漂移与越界行为
最小权限不是一次性配置,而是可验证的状态:
- 定期执行
ps aux | grep [service]检查实际运行用户是否为预期账户 - 用
sudo -u [user] ls /root或icacls C:\Windows验证越权访问是否被有效阻断 - Linux 启用
auditd监控敏感系统调用,Windows 启用高级审核策略跟踪对象访问与特权使用 - 对 sudo 使用,强制开启
Defaults logfile=/var/log/sudo.log并设权限为 600

















