最小权限服务部署要求每个服务以专用低权账户运行,禁用登录与交互能力,通过useradd -r -s /sbin/nologin创建系统用户,并在配置文件或systemd中显式指定user/group,同步限制文件权限、启用selinux/apparmor及capabilities等资源访问控制。

服务部署时直接用 root 账户启动,看似省事,实则埋下高危隐患。真正安全的服务部署,核心不是“能不能跑起来”,而是“出问题时影响有多大”。最小权限服务部署,就是让每个服务只以它真正需要的身份运行——不多一分,不缺一毫。
创建专用服务账户
不要复用 root 或普通用户,为每个服务单独建一个系统级账户。该账户不用于登录,也不具备交互能力,仅服务于特定进程。
- 用 useradd -r -s /sbin/nologin 创建(如
sudo useradd -r -s /sbin/nologin nginx) - -r 标识为系统用户(UID 默认分配在1–999区间)
- -s /sbin/nologin 彻底禁用 shell 登录,避免被当作跳板
- 后续所有服务配置、文件属主、日志目录归属都统一指向该用户
服务进程降权运行
即使有了专用账户,服务仍可能默认以 root 启动。必须显式指定运行身份,否则权限控制形同虚设。
- Nginx:在
/etc/nginx/nginx.conf中设置user nginx; - Apache:修改
/etc/httpd/conf/httpd.conf中的User和Group - 自研服务:在 systemd unit 文件中添加
User=nginx和Group=nginx - 容器部署:用
--user 1001:1001或USER nginxDockerfile 指令强制降权
限制服务可访问的资源范围
服务账户本身权限小了,还要防止它通过路径遍历、符号链接等方式越界访问。
- 敏感配置文件(如 SSL 私钥)设为
600,且属主为服务账户:chmod 600 /etc/nginx/ssl/private.key && chown nginx:nginx /etc/nginx/ssl/private.key - 启用 SELinux 或 AppArmor,为服务定义最小策略(例如 Nginx 只允许读取
/var/www、监听 80/443 端口) - 对关键目录使用 mount --bind 或 chroot 进一步隔离(适用于高敏感场景)
- 必要时用 Linux Capabilities 替代 root 权限,如仅授权绑定低端口:
setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx
禁止 root 部署与初始化
很多数据库或中间件(如金仓 V9R4C19)已从机制上禁止 root 执行安装脚本。这不是限制运维,而是堵住最粗放的风险入口。
- 安装前先创建专用部署用户(如
kingbase),并赋予必要目录写权限 - 安装命令必须由该用户执行:
su - kingbase -c "./setup.sh" - 集群初始化、节点加入等操作同样需校验 UID,非专用用户直接报错退出
- CI/CD 流水线中,部署任务也应切换到对应服务账户上下文执行











