为安全测试人员配置“只读审计”类sudo权限,核心是授予受控查看权而非执行权,通过cmnd_alias限定绝对路径命令、禁用交互与写操作,绑定密码确认、日志审计、终端提示及实时告警联动,并严格验证白名单效力与环境变量限制。

为安全测试人员配置“只读审计”类 sudo 权限,核心不是给执行权,而是给**受控查看权**——允许其以高权限运行特定诊断/审计命令,但禁止修改、逃逸、批量操作,且每次提权都触发明确拦截提示(如日志告警、终端弹窗、邮件通知)。这不是开放权限,而是构建一道“看得见、可追溯、有阻力”的审计探针。
一、用 Cmnd_Alias 定义严格只读命令集
只允许绝对路径 + 显式参数的只读命令,禁用任何带写、执行、交互能力的入口:
- ✅ 安全命令示例: /usr/bin/systemctl list-units --type=service --state=running /usr/bin/ps auxf | /usr/bin/grep -E "(nginx|redis|mysql)" /usr/bin/ss -tuln /usr/bin/find /etc/ssl -name "*.pem" -ls 2>/dev/null
-
❌ 必须禁止的模式:
不带参数的
/usr/bin/systemctl、/bin/bash、/usr/bin/python3 -c、/usr/bin/less /var/log/auth.log(less按 ! 可起 shell) 通配符滥用:/usr/bin/tail -n 100 /var/log/*.log(可能匹配敏感日志目录) - 定义别名(加在
/etc/sudoers.d/sec-audit.conf中):Cmnd_Alias SEC_READ = /usr/bin/systemctl list-units --type=service --state=running, /usr/bin/ps auxf, /usr/bin/ss -tuln, /usr/bin/find /etc/ssl -name "*.pem" -ls
二、绑定用户 + 强制拦截提示机制
不给 NOPASSWD,而是利用 sudo 的密码提示本身作为人工确认环节,并叠加日志与终端反馈:
- 授权行示例:
sec-tester ALL=(root) SEC_READ
(不加NOPASSWD—— 每次执行都需输入自己密码,形成操作确认点) - 在
/etc/sudoers顶部统一启用审计与提示:Defaults logfile="/var/log/sudo-audit.log"Defaults log_input, log_outputDefaults requiretty(阻断 cron/webshell 静默调用)Defaults badpass_message="⚠️ SECURITY AUDIT ACCESS DETECTED — ACTION LOGGED & ALERTED"Defaults lecture="Once" lecture_file="/etc/sudoers.d/audit-notice.txt" - 创建提示文件:
echo "=== SECURITY AUDIT MODE ===" | sudo tee /etc/sudoers.d/audit-notice.txtecho "You are running a privileged read-only audit command." | sudo tee -a /etc/sudoers.d/audit-notice.txtecho "All input/output is logged to /var/log/sudo-audit.log" | sudo tee -a /etc/sudoers.d/audit-notice.txt
三、实时告警联动(让“提示”不止于终端)
仅靠终端提示不够,需秒级外发告警,形成行为闭环:
- 用
auditd监听 sudo 执行事件(已含在上文知识库中):
规则-a always,exit -F path=/usr/bin/sudo -F perm=x -k sec_audit - 写轻量告警脚本(如
/usr/local/bin/sec-alert.sh),监听/var/log/sudo-audit.log新增行,匹配sec-tester.*SEC_READ后:
• 记录到 SIEM 或本地 ELK
• 发送企业微信/钉钉机器人消息(含用户、时间、命令、源 IP)
• 终端输出红色高亮:tput setaf 1; echo "[ALERT] sec-tester triggered audit command"; tput sgr0 - 搭配
inotifywait实时触发,避免轮询延迟
四、验证与兜底控制
配置完必须验证是否真“只读”、真“可感知”:
- 切换至
sec-tester用户,运行:sudo -l→ 确认只列出SEC_READ命令sudo systemctl restart nginx→ 应明确拒绝(非权限不足,而是命令不在白名单) - 执行一条白名单命令,检查:
sudo systemctl list-units --type=service --state=running
• 终端是否显示 lecture 提示
•/var/log/sudo-audit.log是否记录完整命令与 tty
• 告警脚本是否已推送消息 - 限制环境变量防绕过:
Defaults:sec-tester env_resetDefaults:sec-tester env_keep+="LANG LC_ALL PATH"
(PATH 限定为/usr/bin:/bin:/usr/sbin,剔除/home/sec-tester/bin等自定义路径)











