系统uid 1–999为服务专用硬边界,普通用户不得占用,新建服务账号须限定在1–499或500–999,uid_min须保持1000,违规操作将破坏权限逻辑。

系统用户 UID 范围控制,本质是把服务身份“钉死”在数字层面——不是为了凑数,而是让每个进程运行在它该在的权限边界里。CentOS 7 及主流发行版明确将 UID 1–999 划为系统服务专用区间,这不是建议,是安全契约。
守住系统 UID 的硬边界
这个范围不能混用,否则权限逻辑就乱了:
- 普通用户绝不能落在 1–999 区间,useradd -u 400 alice 是违规操作;
- 新建服务账号必须显式指定 UID,且只允许落在 1–499(基础服务)或 500–999(自定义服务)内;
- /etc/login.defs 中的 UID_MIN 必须保持为 1000,防止 useradd 默认越界分配;
- 检查已有账户:
awk -F: '$3 ,发现误建用户需立即迁移。
禁用交互登录是底线要求
服务账号不该有人去“登录”,只负责跑进程:
- 创建时加 -s /sbin/nologin(CentOS 默认路径),例如:
useradd -r -u 101 -s /sbin/nologin nginx; - 已有账号补救:
usermod -s /sbin/nologin mysql; - 检查 /etc/passwd:所有 UID 1–999 的账号,第七字段(shell)不能是
/bin/bash或/bin/sh。
用组做中间层实现权限落地
Linux 不支持按 UID 段自动授权,但可通过组映射把策略落到实处:
- 创建专用组,如
svc-web(GID 501)、svc-db(GID 502); - 把 UID 100–199 的 Web 类服务统一加入
svc-web; - 网站根目录设为
chown root:svc-web /var/www,权限750; - 上传目录单独设为
770,属组仍是svc-web,确保可写但不越权。
限制服务进程本身的行为
账号锁住了,进程还得管住:
- 在 systemd service 文件中启用 NoNewPrivileges=yes 和 RestrictSUIDSGID=true;
- sudoers 里精确放行:只允许
nginx执行/usr/bin/systemctl reload nginx; - 数据库类服务账号禁止
login和su,仅保留 socket 或网络连接所需的最小能力。











