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

不能靠 Defaults 直接实现“二次确认”,它本身不提供审批逻辑,但可以配合脚本和策略,把二次确认变成强制执行环节。
用 Defaults 控制提权行为边界
Defaults 是 sudo 的行为开关,不是审批引擎。但它能帮你封死绕过路径,让所有提权必须走你设计的流程:
-
禁用后台执行:加
Defaults requiretty,防止脚本或 SSH 远程调用绕过终端交互 -
锁定环境变量:加
Defaults env_reset和Defaults env_keep+="SSH_CONNECTION",避免利用环境变量注入或伪造会话上下文 -
关闭密码缓存:设
Defaults timestamp_timeout=0,每次提权都必须重新认证,为第二人介入留出时间窗口 -
强制记录输入输出:加
Defaults log_input,log_output,确保后续用 tlog 或 auditd 捕获完整操作链时有基础日志支撑
把 Defaults 和审批脚本绑定成“硬性关卡”
真正实现双人确认,得靠外部脚本拦截命令流,而 Defaults 负责让它无法被跳过:
- 在
/etc/sudoers中写一条规则:%opsadm ALL=(root) NOPASSWD: /usr/local/bin/sudo-approve,只允许审批组运行审批脚本 - 再写一条拦截规则:
%requestors ALL=(root) !/usr/bin/systemctl, !/usr/sbin/usermod, /usr/local/bin/sudo-req,把敏感命令全部禁止,只放行提交请求的包装器 - 用
Defaults!sudo-req noexec防止用户在 sudo-req 内部再嵌套执行任意命令(比如传入 bash -c) - 所有 requestor 提交的命令,最终都写进待审队列;只有
sudo-approve --confirm [id]成功后,才动态生成临时 sudoers.d 规则并生效
审计与超时必须由 Defaults 配合系统机制兜底
二次确认若无时效和留痕,就形同虚设。Defaults 要和系统级设置协同:
- 设
Defaults logfile="/var/log/sudo-audit.log",让每次 sudo 调用(包括 sudo-req 和 sudo-approve)都有独立时间戳、UID、TTY 记录 - 配合
auditd监控/usr/local/bin/sudo-req和/usr/local/bin/sudo-approve的 execve 调用,防篡改 - 审批请求文件本身带 5 分钟有效期,靠系统 at 或 systemd timer 清理;Defaults 不管这个,但
Defaults timestamp_timeout=0确保审批人自己登录后也必须输一次密码,杜绝“借账号自动批”










