核心是精准控制sudo权限:只授权必要命令的绝对路径,禁用通配符与高危命令;用cmnd_alias分组管理;按业务组统一授权;慎用nopasswd,仅限低风险操作;强制开启sudo日志审计。

限制普通用户 sudo 权限范围,核心是“只给必要命令,不放行危险操作”。不能简单禁用或全开,而要靠 /etc/sudoers 精准控制,配合组管理与路径锁定,才能兼顾可用性与安全性。
明确授权具体命令,禁用通配符和宽泛路径
sudoers 中禁止使用 /usr/bin/* 或 ALL 这类宽泛写法。攻击者可能利用同名恶意程序或符号链接绕过限制。
- 只写绝对路径:比如允许重启 nginx,写成
/usr/bin/systemctl restart nginx,而不是/usr/bin/systemctl - 拒绝高危命令:显式排除
passwd、visudo、useradd、userdel、su等 - 示例规则:
devuser ALL=(ALL) /usr/bin/systemctl restart nginx, !/usr/bin/passwd, !/usr/sbin/visudo
用 Cmnd_Alias 分组管理,提升可维护性
当多个用户需执行同一组命令时,定义命令别名比逐条重复更清晰、不易出错。
- 在
/etc/sudoers中添加: Cmnd_Alias DB_CMDS = /usr/bin/mysql, /usr/bin/mysqldump, /bin/gzip%dbteam ALL=(ALL) NOPASSWD: DB_CMDS- 之后只需把用户加入
dbteam组,权限自动生效,增删命令只需改别名定义
按组控制,避免逐个用户配置
不推荐为每个用户单独写 sudoers 规则。应先建业务组(如 webadmin、backup),再统一授权。
- 创建组:
sudo groupadd webadmin - 加用户:
sudo usermod -aG webadmin alice - 授权组:
%webadmin ALL=(ALL) /usr/bin/systemctl start httpd, /usr/bin/systemctl stop httpd - 这样新增运维人员只需加组,无需动 sudoers 文件
关闭 NOPASSWD 或限定免密范围
免密虽方便,但大幅降低攻击成本。若必须免密,仅限极少数高频、低风险命令。
- 全局免密
NOPASSWD: ALL严禁用于生产环境 - 推荐写法:
%webadmin ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx(仅 reload 免密,start/stop 仍需密码) - 所有 sudo 操作务必开启日志:
Defaults logfile="/var/log/sudo.log",便于事后审计











