必须用visudo编辑sudoers,因其语法极敏感,一个空格或逗号错误即导致sudo瘫痪;应使用User_Alias、Host_Alias和Cmnd_Alias抽象管理,命令须用绝对路径并显式限定参数,同时启用logfile、env_reset和secure_path等审计与安全选项。

安全配置 /etc/sudoers 不是“加个权限”那么简单,而是构建系统可信边界的底层机制。核心就一条:让每个用户只做该做的事,不多也不少,且所有动作可查、可控、可撤。
用 visudo 编辑,永远不用普通编辑器
直接用 vim 或 nano 修改 /etc/sudoers 是高危操作——一个漏掉的逗号、多写的空格,就会导致整个 sudo 系统瘫痪,连 root 都无法恢复(除非有物理控制台或单用户模式)。
visudo 会自动检查语法、加文件锁、防止并发写入。执行后若提示 “syntax error”,它不会保存,给你修正机会。
推荐命令:
sudo visudo(主文件)
sudo visudo -f /etc/sudoers.d/myteam(子配置)
按角色分组,别给单个用户硬编码
用户增减频繁时,逐行改规则极易出错、难审计。应使用 User_Alias 和 Host_Alias 抽象职责与环境:
• 定义运维组:User_Alias OPS = alice, bob, %devops
• 定义生产数据库主机:Host_Alias PROD_DB = db01, db02
• 组合授权:OPS PROD_DB = (postgres) /usr/bin/pg_dump, /usr/bin/psql
这样,新增 DBA 只需加进 %devops 组,无需动 sudoers 主逻辑。
命令必须绝对路径 + 显式参数限制
允许 /bin/ls 没问题,但允许 ls(无路径)等于开放 PATH 注入;允许 /bin/sh 就等于交出 root shell。
关键做法:
• 所有命令写全路径(用 command -v ls 确认)
• 用 Cmnd_Alias 白名单管理,例如:Cmnd_Alias LOG_VIEW = /usr/bin/tail -n [0-9]* /var/log/*.log, /bin/grep -- -E 'error|fail' /var/log/syslog
• 禁止通配符滥用(如 /bin/*)、禁止重定向(>)、禁止管道(|),这些在 sudo 下默认不解析,但显式禁用更稳妥
启用审计与最小化环境暴露
权限不是设完就结束,得知道谁、何时、执行了什么:
• 开启日志:Defaults logfile="/var/log/sudo.log" 并确保 rsyslog 转发到中心服务器
• 重置环境变量:Defaults env_reset,仅保留必要项:Defaults env_keep += "LANG LC_*"
• 锁定搜索路径:Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
• 记录输入输出(高敏感场景):Defaults log_input, log_output,日志存于 /var/log/sudo-io/

















