自动化linux权限审计脚本聚焦四类高风险项:禁用shell但有有效凭证的账户、suid/sgid异常文件、sudoers宽泛授权、90天未登录账户;每条结果附处置指令、风险等级、颜色标识,并输出日志、邮件通知、变更追踪,集成白名单与人工抽检机制。

自动化输出Linux权限审计报告,关键不是堆砌所有数据,而是聚焦可处置的风险点,并让每次运行结果具备时间可比性、操作可追溯性。脚本不求大而全,但必须稳定、轻量、带上下文建议。
锁定四类高风险项直接输出
每次审计只检查最可能被利用的配置,避免噪音干扰:
-
禁用shell但有有效凭证的账户:用
awk交叉比对/etc/passwd和/etc/shadow,匹配shell为/bin/false或/usr/sbin/nologin,且shadow中密码字段非*或!的账户 -
SUID/SGID异常文件:用
find / -perm /4000 -o -perm /2000 2>/dev/null找出所有带特权位的文件,再用stat -c "%U %G %a %n" {}过滤出属主非root或修改时间异常的条目 -
sudoers宽泛授权:用
grep -v "^#" /etc/sudoers | grep -E "(ALL\s+ALL|NOPASSWD|!requiretty)"提取高风险行,排除注释和标准模板行 -
90天未登录账户:用
lastlog -b 90 | awk '$6 != "Never" && $6 != "****" {print $1}'列出真实未登录用户,自动跳过UID
报告内容自带处置动作和风险等级
每条发现都附带明确操作指令,而不是仅提示“存在风险”:
- 发现
backup_user: nologin shell but valid password→ 报告中直接写:建议执行:passwd -l backup_user - 发现
/tmp/malware-exec.sh: SUID bit set, owned by deploy_user→ 标注:立即处置(红色):确认是否业务必需,否则chmod u-s /tmp/malware-exec.sh - 发现
user_x ALL=(ALL) NOPASSWD: /bin/bash→ 标注:7日内复核(黄色):改用具体命令白名单,如/usr/bin/systemctl restart nginx
脚本用echo -e "3[31m..."控制颜色输出,终端查看时一目了然;同时将纯文本版写入/var/log/audit-report-$(date +%F).log,供归档比对。
集成到日常运维节奏中
让审计真正跑起来,得解决三个落地问题:
-
cron任务要带完整环境:在crontab中写成
0 2 * * * root PATH=/usr/local/bin:/usr/bin:/bin /opt/scripts/perm-audit.sh > /dev/null,避免因PATH缺失导致awk或lastlog找不到 -
结果必须触达责任人:脚本末尾加
mail -s "Linux权限审计报告 $(date +%F)" admin@company.com ,摘要只含风险项数量+TOP3需处理条目 -
每次变更留痕:脚本开头记录上一次报告路径,对比本次发现的新账户或新SUID文件,自动追加到
/opt/scripts/audit-changelog.log,格式为[2026-06-08] NEW_SUID: /opt/app/bin/update_tool
人工抽检与白名单机制
自动化不能替代判断,每月初固定做两件事:
- 随机打开3个报告中的告警项,手动验证是否误报(例如某SUID文件是内部打包工具,确需保留)
- 把确认合法的条目加入白名单文件
/opt/scripts/audit-whitelist.conf,脚本运行时用grep -vFf /opt/scripts/audit-whitelist.conf过滤掉它们 - 白名单本身纳入Git管理,每次增删都提交并写明原因,比如
git commit -m "add /usr/local/bin/db-migrate: required for nightly backup"
不复杂但容易忽略











