必须用visudo编辑/etc/sudoers,因其强制语法校验、加锁防冲突、阻止错误写入;推荐使用/etc/sudoers.d/模块化管理,遵循最小权限原则精确授权命令路径,并通过sudo -l和日志审计验证。

直接改 /etc/sudoers 是高危操作,90% 的 sudo 失效事故都源于此。必须用 visudo 编辑,它会在保存前强制语法校验——错一行,就拦住你,不写入、不生效、不锁系统。
安全编辑:只用 visudo,别碰原始文件
系统不允许直接编辑 /etc/sudoers,不是限制,而是保护。它的权限是 0440,普通用户不可读,root 用户也必须通过专用工具修改。
- 主配置用
sudo visudo—— 自动检查语法,报错时显示具体行号和错误类型(如 “syntax error near line 27”) - 自定义规则优先写进
/etc/sudoers.d/下的独立文件,例如:sudo visudo -f /etc/sudoers.d/webadmin - 所有规则文件都需以
.defaults或无扩展名保存,且权限必须为 0440(sudo chmod 0440 /etc/sudoers.d/webadmin) - 绝对不要用
vim /etc/sudoers或nano /etc/sudoers手动保存——没有语法防护,改错即失能
授权规则:四要素缺一不可
每条有效规则必须明确“谁、在哪儿、以谁身份、能运行什么”。格式固定为:
用户或组 主机列表 = (目标用户:目标组) 命令列表
- 用户或组:单个用户(
alice)、系统组(%sudo或%wheel,注意前缀 %)或已定义的User_Alias - 主机列表:生产环境建议写
ALL;多机房可限定为web01,db02或用Host_Alias统一管理 - 目标用户:目标组:括号内必填,如
(root)、(www-data:www-data),不写等同于(ALL:ALL) - 命令列表:必须用绝对路径,禁止通配符泛匹配(如
/usr/bin/*),危险命令如/bin/bash、/usr/bin/python3 -c必须显式排除
精细控制:防逃逸、限参数、控交互
只写命令路径远远不够。攻击者常通过参数注入或子进程调起 shell 提权,必须层层设防。
- 用
!排除风险操作:例如alice ALL=(root) /usr/bin/tail /var/log/*.log, !/usr/bin/rm /var/log/*.log - 对分页器禁用子进程:加
Defaults!PAGERS noexec,防止less /etc/shadow中按!执行 shell - 强制终端绑定:
Defaults requiretty写在文件顶部,阻断 cron、web shell 等非交互式调用 - 启用完整审计:
Defaults logfile="/var/log/sudo.log"和Defaults log_input,log_output,记录命令输入输出流
可维护性:用别名替代硬编码
用户增多、命令变杂后,靠逐行写规则极易出错。别名机制把逻辑解耦,提升可读与可管性。
-
User_Alias DBA = alice, bob, %dba-team—— 按角色聚合用户 -
Cmnd_Alias DB_CMDS = /usr/bin/mysql, /usr/bin/mysqldump, /usr/bin/mysqladmin—— 按用途归类命令 -
DBA ALL = (root) DB_CMDS—— 规则简洁清晰,增删命令只需改别名定义 - 组合更灵活:例如
DBA PROD = (root) DB_CMDS,其中PROD是预定义的Host_Alias
改完立即验证:切换到目标用户,运行 sudo -l 查看可见权限,再试一条真实命令,比如 sudo -u www-data ls /var/www。日志查 /var/log/sudo.log 确认执行轨迹。误操作导致锁死?重启进 recovery mode,挂载根分区后用 visudo 修复即可。


















