核心是禁用root远程登录与密码认证,创建专用运维账户并精细授权sudo,服务默认以非root用户运行,定期审计权限与行为。

实施服务器最小化 root 使用原则,核心是让 root 账户“不登录、不常驻、不直用”。日常运维全部交由普通用户完成,仅在必要时通过受控方式临时提权。这不是增加复杂度,而是把风险关进笼子。
禁用 root 远程登录与密码认证
这是最基础也最关键的一步。直接关闭 root 的远程入口,能拦截绝大多数自动化攻击。
- 编辑 /etc/ssh/sshd_config,将 PermitRootLogin no(必须设为 no,不是 prohibit-password)
- 同时设置 PasswordAuthentication no,强制使用密钥登录
- 密钥需用 4096 位 RSA 或 Ed25519,私钥权限严格设为 600
- 修改后执行 systemctl restart sshd 生效
创建专用运维账户并精细授权 sudo
每个运维人员应有独立账号,权限按角色划分,避免“一人一root”或多人共用账号。
- 用 useradd -m -s /bin/bash deployer 创建新用户
- 加入系统管理组:usermod -aG sudo deployer(Ubuntu/Debian)或 usermod -aG wheel deployer(RHEL/CentOS)
- 用 visudo 编辑 /etc/sudoers.d/deployer,只授权具体命令,例如:
deployer ALL=(root) /usr/bin/systemctl reload nginx, /usr/bin/rsync - 禁用宽泛授权,如 ALL=(ALL) ALL 或 NOPASSWD: ALL,高危命令如 /bin/bash、/usr/bin/vim 绝对不放行
服务与进程默认以非 root 用户运行
Web、数据库、队列等服务不应长期以 root 身份运行,而应使用专属低权系统用户。
- Nginx/Apache 默认以 www-data 或 apache 用户启动;确认主进程仅在绑定 80/443 端口时短暂提权,之后自动降权
- MySQL/PostgreSQL 配置 user = mysql 或 postgres,数据目录归属该用户,禁止 root 拥有或写入
- 部署脚本、CI/CD Agent(如 Jenkins agent)一律用专用低权用户运行,不继承 root 环境
定期审计与行为监控
权限配置不是一次设置就永久有效,需持续验证是否仍合理、是否被绕过。
- 每周执行 sudo -l -U username 检查各用户实际可执行命令,剔除冗余项
- 查看日志:grep 'sudo:' /var/log/auth.log(Debian系)或 grep 'sudo' /var/log/secure(RHEL系),识别异常频次或非常规命令
- 用 find / -perm -4000 -type f 2>/dev/null 扫描 SUID 文件,重点关注非系统自带的二进制程序
- 启用 auditd 监控关键路径(如 /etc/shadow、/etc/sudoers)和特权调用,设置实时告警

















