sudoers 文件不是普通配置文件,而是系统权限的“开关总闸”,写错一条可能直接锁死管理员账户或引发严重安全风险。必须用 visudo 编辑,依赖语法校验,禁止直接用 vim 或 nano 修改保存。
sudoers 基本语法结构:谁在哪儿能干什么
每一行授权规则遵循固定格式:
用户/组 主机列表 = (目标用户:目标组) 命令列表
用户/组:可用用户名(如 alice)、%开头的组名(如 %admin)、别名(见下文)
主机列表:通常写 ALL,多服务器环境可限定为 server01,db02;HOSTALIAS 可预定义主机别名
(目标用户:目标组):默认是 (ALL),即以任意用户身份执行;可细化为 (root:www-data) 表示仅能以 root 用户和 www-data 组身份运行
命令列表:绝对路径必填(如 /bin/systemctl),支持通配符 /usr/bin/apt*,但禁用 /bin/bash、/usr/bin/less 等可逃逸命令
安全授权四条铁律
最小权限原则:只授权具体命令,不给 ALL。例如运维查日志只需 /usr/bin/tail /var/log/nginx/*.log,而非整个 /usr/bin/tail
禁用 shell 逃逸入口:明确禁止 /bin/sh、/bin/bash、/usr/bin/perl -e、/usr/bin/python3 -c 等可通过脚本提权的命令
启用 requiretty(终端绑定):在文件顶部加 Defaults requiretty,防止通过后台任务或 web shell 非交互式调用 sudo
记录所有 sudo 操作:确保 Defaults logfile="/var/log/sudo.log" 和 Defaults log_input,log_output 已启用,便于审计命令输入输出
实用别名机制:让规则清晰可维护
避免重复写长命令或用户列表,用别名分层管理:
User_Alias:如 User_Alias DBA = alice,bob,%dba-team
Host_Alias:如 Host_Alias PROD = web01,web02,db01
Cmnd_Alias:如 Cmnd_Alias RESTART_NGINX = /bin/systemctl restart nginx, /bin/systemctl reload nginx
组合使用示例:DBA PROD = (root) RESTART_NGINX
调试与验证:改完别急着退出
保存前 visudo 自动检查语法,报错则无法退出 —— 这是唯一安全防线
编辑后立即用目标用户测试:sudo -l 查看可见权限,sudo -u root whoami 验证执行能力
检查日志:tail -f /var/log/sudo.log 观察实际调用是否符合预期
误操作锁死?重启进 recovery mode,挂载根分区为读写,用 mount -o remount,rw / 后修改 /etc/sudoers