要让每次 sudo 操作都重新输入密码,需设 defaults timestamp_timeout=0 彻底禁用缓存,并配合 tty_tickets 实现每终端独立验证、requiretty 阻止非交互绕过、env_reset 与 secure_path 加固环境。

要让每次 sudo 操作都重新输入密码,核心是关闭密码缓存机制,而不是“二次确认”——Defaults 本身不提供审批流程,但能强制每次提权都走完整认证环节。
设置 timestamp_timeout=0 彻底禁用缓存
这是最直接有效的方式。默认 sudo 会缓存密码 15 分钟(timestamp_timeout=15),设为 0 后,无论前一次是否刚输过,只要执行新命令,就必须再输一遍密码:
- 在
/etc/sudoers中添加:Defaults timestamp_timeout=0 - 该设置对所有匹配用户或组生效,无需逐条规则重复写
- 配合
sudo -k可手动清空当前缓存,立即触发下一次密码验证
搭配 tty_tickets 防止跨终端复用
仅设 timestamp_timeout=0 还不够——如果用户在多个终端(如 tmux 窗格、SSH 多会话)中操作,可能因共享时间戳文件而绕过验证。启用 tty_tickets 可确保每个终端独立计时:
- 添加:Defaults tty_tickets
- 系统会在
/var/run/sudo/ts/下按 TTY 名(如tty1、pts/3)生成独立时间戳文件 - 即使同一用户在不同窗口执行
sudo,也各自需要输密码
用 requiretty 封死非交互式绕过路径
避免脚本或远程命令(如 ssh user@host 'sudo systemctl restart nginx')跳过密码提示:
- 添加:Defaults requiretty
- 这样任何非真实 TTY 环境下的
sudo调用都会被拒绝,强制必须在交互终端中执行 - 如需保留某些自动化场景,可用例外语法:Defaults !requiretty 配合特定用户或命令单独放行
清除危险变量 + 强制可信路径加固环境
防止攻击者利用环境变量(如 LD_PRELOAD、自定义 PATH)劫持 sudo 流程,间接绕过认证逻辑:
- 重置环境:Defaults env_reset
- 显式删除高危变量:Defaults env_delete += "LD_PRELOAD LD_LIBRARY_PATH PS4 PROMPT_COMMAND"
- 锁定命令搜索路径:Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
改完后务必用 sudo visudo 校验语法,避免锁死自己。这些配置加起来,就能让每次 sudo 都变成一次真实、隔离、不可绕过的密码核验过程。










