必须用visudo编辑sudoers文件,因其具备语法校验、文件锁定和防并发写入功能;直接vim编辑易致sudo瘫痪,且无法恢复。

细粒度授权不是加一行 ALL=ALL 就完事,而是用 visudo 编辑 /etc/sudoers,通过限定用户、目标身份、绝对路径命令和参数范围来控制——写错一条可能锁死自己,必须用 visudo,不能直接 vim /etc/sudoers。
必须用 visudo,而不是直接编辑文件
visudo 是唯一带语法校验的编辑器。它在保存前会调用 sudoers 解析器检查整份文件:漏空格、括号不匹配、用了相对路径、命令名拼错,都会报错并阻止保存。而直接 vim /etc/sudoers 一旦写崩,sudo 就彻底不可用,连 root 都可能被拒之门外(除非进 recovery mode)。
- 改前先备份:
sudo cp /etc/sudoers /etc/sudoers.bak.$(date +%s) - 只在文件末尾新增规则,别动系统默认块(如
%sudo或%wheel) - 非 root 用户需已有 sudo 权限,执行
sudo -u root visudo
细粒度授权的核心写法
每行规则格式固定:谁在哪台机器上=(能切换成谁:哪个组)能运行哪些命令。省略任何一部分都可能扩大权限范围。
- 用户名写具体名字,或用
%devops表示组 -
ALL表示允许从任意主机登录;生产环境建议缩为具体主机名,如web01 -
(root)表示只能以 root 身份执行,不能写(ALL)或留空 - 命令必须用绝对路径:
/bin/systemctl≠systemctl;/usr/bin/apt-get≠apt - 通配符仅限命令末尾:
/usr/bin/apt-get install *合法,apt*不合法 - 禁用带 shell 逃逸能力的命令:
/bin/bash、/usr/bin/python3 -c、/usr/bin/less都不该出现在列表里
安全免密要配合具体命令,不能裸奔
NOPASSWD: 很诱人,但滥用等于裸奔。它只应配合具体命令使用,绝不能单独跟 ALL。
- 错误写法:
bob ALL=(ALL) NOPASSWD: ALL - 正确做法:只对运维必需的只读操作免密,例如
bob ALL=(root) NOPASSWD: /bin/systemctl status *, /usr/bin/tail /var/log/nginx/*.log - 日志类命令要限制路径:
/usr/bin/journalctl -u docker --since "1 hour ago"比/usr/bin/journalctl安全得多 - 如果命令本身支持参数过滤(如
systemctl),就别用*,改用白名单:/bin/systemctl start nginx、/bin/systemctl reload nginx
按组统一管理更易维护
创建自定义组集中授权,比逐个配置用户更可靠、更可持续。
- 新建组:
sudo groupadd sysadmin - 加人:
sudo usermod -aG sysadmin alice、sudo usermod -aG sysadmin bob - 在
/etc/sudoers中添加:%sysadmin ALL=(root) /usr/bin/systemctl, /usr/sbin/useradd, /usr/sbin/userdel - 后续新增成员,只需
usermod -aG sysadmin 新用户名即可继承权限











