必须用 sudo visudo 修改 /etc/sudoers,因其保存前校验语法;错误配置将导致 sudo 失效且无法修复,需进单用户模式;所有修改须先测试或用 sudo visudo -c 校验。

sudoers 文件语法写错会导致无法登录
改 /etc/sudoers 不能直接用普通编辑器保存,必须用 sudo visudo。它会在保存前做语法检查,一旦写错(比如少个空格、多了个逗号),sudo 就会彻底失效——连 root 都没法用 sudo 修回来,只能进单用户模式。
- 所有修改必须通过
sudo visudo,哪怕只是加一行%wheel ALL=(ALL) NOPASSWD: /bin/systemctl - 别用
echo "...">/etc/sudoers或vim /etc/sudoers直接写,出错即锁死 - 生产环境建议先在测试机验证,或用
sudo visudo -c手动校验当前配置 - 注意路径大小写和等号两侧空格:
ALL=(ALL:ALL)和ALL=(ALL: ALL)是不同含义
NOPASSWD 不等于无风险,权限粒度必须收窄
NOPASSWD 常被当成“免密执行”的快捷方式,但实际是把 shell 权限直接交给用户——只要命令路径可预测、参数可控性差,就等于开了后门。
- 禁止写成
%deploy ALL=(ALL) NOPASSWD: ALL,这是最常见也最危险的配置 - 优先锁定绝对路径:
/usr/bin/systemctl start nginx比systemctl安全得多 - 带参数的命令要显式列出:
/bin/mv /var/www/staging/* /var/www/live/,别留*给用户控制 - 如果必须传参,用
sudoers的SETENV和Cmnd_Alias配合白名单,而不是放行整个脚本
group 权限继承不自动生效,需重新登录或重载 session
把用户加进 sudo 组或自定义组(如 %admin)后,当前终端不会立刻获得新权限——因为 sudo 检查的是登录时的 group 列表,不是实时读取 /etc/group。
- 改完
usermod -aG admin alice后,必须让alice完全退出所有 shell,再重新登录 - SSH 连接不能只
exit再ssh,得关掉整个连接进程(否则 session 缓存未更新) - 桌面环境下,注销比开新终端更可靠;systemd 用户服务同理,需
loginctl terminate-user alice - 验证是否生效:运行
id看输出是否含目标组,再试sudo -l
日志审计必须打开,否则权限操作等于黑盒
默认 sudo 只记到 /var/log/auth.log 或 /var/log/secure,但不记录命令实际执行内容、返回码、甚至环境变量——这些对追查越权行为至关重要。
- 在
/etc/sudoers里加Defaults logfile="/var/log/sudo.log"开启独立日志 - 补上
Defaults log_input,log_output才能记录 stdin/stdout,但会显著增大磁盘占用 - 敏感命令建议配合
Defaults requiretty(防后台静默提权)和Defaults env_reset(清空危险环境变量) - 注意
log_input/log_output依赖sudo1.8.15+,老系统(如 CentOS 7 默认 1.8.23)支持,但 Ubuntu 16.04 需升级
真正难的不是配通 sudo,而是确保每次权限变更都可追溯、每条命令边界都不可绕过。一个没引号的通配符、一次忘记重登、一条没开启的 log 选项,都可能让整套控制形同虚设。










