实施服务器用户最小权限原则的核心是“只让做该做的”,需落实一人一账号、sudo命令级授权、服务非root运行及持续闭环审计四项措施。

实施服务器用户最小权限原则,关键不是“能不能做”,而是“只让做该做的”。核心是把每个用户限制在职责边界内,既防误操作,也防横向渗透。下面从四个实操维度展开。
一、一人一账号,禁用共享与直登root
所有运维人员必须使用独立账户,禁止共用root或任意高权限账号。生产环境必须关闭root远程登录:
- 编辑/etc/ssh/sshd_config,设置PermitRootLogin no,然后运行sudo systemctl restart sshd
- 创建专用账户时加-r(系统用户)和-s /sbin/nologin(禁用交互登录),例如:
sudo useradd -r -s /sbin/nologin appsvc - 定期检查/etc/passwd中UID为0的非root账户,以及shell非/sbin/nologin的系统账户
二、sudo权限必须按命令粒度授权
绝不能把用户加入%sudo或%wheel组并给ALL=(ALL) ALL。应精确到绝对路径的单条命令:
- 用visudo编辑/etc/sudoers,添加类似规则:
deployer ALL=(www-data) NOPASSWD: /usr/bin/systemctl reload nginx - 显式拒绝危险入口:
Defaults:deployer !shell_noop
deployer ALL=(ALL) !/bin/sh, !/bin/bash, !/usr/bin/su - 限制环境变量和工作目录:
Defaults:deployer env_reset, always_set_home, env_keep += "PATH LANG LC_*"
三、服务与进程默认不跑在root下
后台服务应以专用低权限账户运行,而非沿用root启动后降权:
- Nginx配置中明确指定:user nginx_user;(需先创建该用户)
- systemd服务单元文件中设置:
User=nginx_user
Group=nginx_group - 数据库如MySQL,启动时用mysql用户,并确保其home目录不可写、shell为/sbin/nologin
- 敏感服务可进一步用Linux capabilities替代root,例如:
sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx(允许绑定1024以下端口)
四、权限不是设完就结束,要闭环审计
最小权限是持续过程,不是一次性配置:
- 每月执行sudo -l -U username核对实际生效权限,注意/etc/sudoers.d/下的覆盖规则
- 启用sudo日志:Defaults logfile="/var/log/sudo.log",并确认rsyslog已采集该路径
- 用find /etc -type f -perm -o+w 2>/dev/null扫描全局可写文件,重点清理/tmp外的异常项
- 离职或转岗人员账户立即锁定:sudo usermod -L username,并从所有sudoers规则中移除
不复杂但容易忽略:真正落地最小权限,靠的是把“谁需要什么”变成可验证的配置项,而不是靠信任或口头约定。每次加权限前,先问一句——这个命令不给,他还能完成本职工作吗?











