defaults 不能直接实现二次确认,但可通过 requiretty、env_reset、timestamp_timeout=0 等配置封死绕过路径,并配合审批脚本和日志审计构建强制双人确认机制。

Defaults 本身不能直接实现“二次确认”,它不提供审批逻辑,但能通过收紧执行环境、切断绕过路径,把二次确认变成不可跳过的强制环节。关键在于用 Defaults 封死常见绕过方式,再配合外部脚本和审计机制落地双人确认。
封死自动提权与后台绕过
让所有 sudo 操作必须回到真实终端、每次重新认证,为第二人介入创造条件:
-
强制交互式终端:加
Defaults requiretty,禁止ssh user@host 'sudo cmd'或 cron 脚本调用,确保操作人在场 -
隔离终端会话凭证:启用
Defaults tty_tickets,使不同 tmux 窗口、SSH 标签页各自独立缓存,避免一处认证多处生效 -
禁用密码缓存:设
Defaults timestamp_timeout=0,每次 sudo 都需输入密码,杜绝“借号自动批”或长时间未登出导致的权限滥用
清理执行上下文,阻断注入与伪装
防止攻击者利用环境变量、路径或 LD_PRELOAD 劫持命令流程,保障审批脚本运行可信:
-
重置并精简环境:显式声明
Defaults env_reset,再用env_delete += "LD_PRELOAD SSH_AUTH_SOCK"清除高危变量 -
锁定可信执行路径:配置
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",避免用户自定义 PATH 中的恶意二进制被调用 -
禁止子进程逃逸:对审批包装器添加
Defaults!sudo-req noexec,防止用户在请求脚本里嵌套执行bash -c等任意命令
绑定审批流程,让 Defaults 成为硬性关卡
Defaults 不做审批,但它能让审批脚本成为唯一合法出口:
- 只允许运维组运行审批程序:
%opsadm ALL=(root) NOPASSWD: /usr/local/bin/sudo-approve - 禁止普通提权组直接执行敏感命令,只放行请求包装器:
%requestors ALL=(root) !/usr/bin/systemctl, !/usr/sbin/usermod, /usr/local/bin/sudo-req - 所有请求写入带时间戳的待审队列(如 5 分钟有效期),审批人必须先通过 sudo-approve --confirm [id] 才能动态生成临时规则
日志与审计必须全程覆盖
没有留痕的确认等于没确认。Defaults 要支撑可追溯的操作链:
-
独立记录每次调用:设
Defaults logfile="/var/log/sudo-audit.log",确保 sudo-req 和 sudo-approve 的触发时间、UID、TTY 全部落盘 -
捕获完整操作流:启用
Defaults log_input, log_output并配iolog_dir="/var/log/sudo-io/%{user}",为事后回溯提供输入输出证据 -
联动系统级监控:用 auditd 监控
/usr/local/bin/sudo-req和/usr/local/bin/sudo-approve的 execve 调用,防篡改、防替换










