每年年审,审计机构发来的 IT 审计配合需求清单,大概长这样:
请提供所有服务器的用户清单、特权账户列表、密码策略配置、SSH 配置、防火墙规则、已安装软件包清单、日志保留策略、计划任务列表、SUID 文件扫描结果……
原本一台服务器手动采集 ITGC 证据要 1-2 小时:登服务器、敲命令、截图、粘到 Excel、整理格式。十几台服务器排下来,一周就过去了。
作为被审计方的 IT,我决定把这事自动化掉。
这个脚本做什么
一句话:以 root 身份在 Linux 服务器上执行,自动采集审计师关心的所有 ITGC 证据,输出一份结构化的证据包 + Markdown 汇总报告。
覆盖 8 个审计维度:
01_system/ → 主机标识、OS 版本、硬件指纹、NTP 同步状态02_access/ → 用户清单、特权账户、密码策略、SSH 配置、登录记录03_change/ → 软件包清单及变更历史、关键配置文件哈希04_runtime/ → 进程、资源使用、内核参数05_logging/ → rsyslog/journald/auditd 配置、日志保留策略06_filesystem/ → SUID/SGID、世界可写文件、目录权限、磁盘加密07_network/ → 监听端口、防火墙规则、DNS 配置08_services/ → systemd 服务、cron 任务、SELinux/AppArmor 状态
最终产出一个带时间戳的 .tar.gz 压缩包,内含所有原始证据文件和一份 REPORT.md。单台服务器采集时间从 1-2 小时压缩到 2-10 分钟,审计师拿到解压就能用。
几个设计原则
① 只读,绝不改系统
脚本全程不修改被审计系统的任何配置,唯一的写入操作是在 /tmp 下生成采集结果。Ctrl+C 中断会自动清理未完成的目录。
② 不碰敏感明文
/etc/shadow 只采集密码状态("已设置"/"已锁定"/"无密码"),不导出哈希;私钥文件只列路径和权限,不读取内容。这是审计方和被审计方都能接受的红线。
③ 证据可追溯、防篡改
每个采集项都记录了执行命令、开始/结束时间、退出码。打包后自动生成 MANIFEST.sha256,审计师可据此验证证据完整性。
④ 兼容主流发行版
自动识别 RHEL/CentOS/Rocky 系和 Debian/Ubuntu 系,软件包变更采集会根据 rpm/dnf 或 dpkg/apt 自动选择正确的命令。缺失的命令(如 ufw/firewalld 没装)会记录到 missing_commands.log,不会让审计日志被无意义的错误刷屏。
安全创建输出目录(防 /tmp symlink 攻击):
# 用 mktemp 注入随机字符,避免 /tmp 下可预测路径被利用if ! OUTPUT_DIR=$(mktemp -d "${OUTPUT_BASE}/linux_audit_${HOSTNAME_SAFE}_${TIMESTAMP}_XXXXXXXX"); then echo "[错误] 无法创建临时目录" >&2 exit 3fichmod 700 "${OUTPUT_DIR}"
shadow 只采状态,不导哈希:
while IFS=: read -r user pwd lastchg mindays maxdays warn rest; do case "$pwd" in "") pwd_stat="无密码(危险)" ;; "!"|"!!") pwd_stat="已锁定" ;; "*") pwd_stat="禁用登录" ;; \$*) pwd_stat="已设置哈希" ;; esac printf "%-20s %-15s\n" "$user" "$pwd_stat"done < /etc/shadow
全盘文件系统扫描只跑一次——SUID/SGID、世界可写、无属主合并为单次 find,避免 4 次 I/O 冲击生产环境:
find / -xdev \( -path /proc -o -path /sys \) -prune -o \ \( -type f -o -type d \) \ -printf '%y\t%m\t%U\t%G\t%u\t%g\t%s\t%TY-%Tm-%Td\t%p\n' \ > "${SCAN_RAW}"# awk 一次性按权限位分类输出到 4 个文件
怎么用?
# 1. 上传到被审计服务器scp linux_audit.sh root@服务器IP:/root/# 2. 切 root 执行su -bash linux_audit.sh# 3. 取回证据包scp root@服务器IP:/tmp/linux_audit_*.tar.gz ./# 4. 验证 SHA256(与现场记录对比)sha256sum linux_audit_*.tar.gz
支持几个可选参数:
bash linux_audit.sh --days 180 # 改为采集近 180 天的日志bash linux_audit.sh --cleanup # 打包后自动清理原始目录bash linux_audit.sh --help # 查看帮助
产出效果
执行完毕后屏幕会打印采集摘要,包括压缩包路径、SHA256、文件数和耗时。解压后打开 REPORT.md,长这样:
审计师直接看汇总表定位关注点,再点进对应的原始文件查证据。
使用声明
本脚本输出的是客观证据,不替代审计师的判断,也不对"合规/不合规"做任何结论。使用前建议先与审计机构沟通确认证据采集范围是否符合其要求。如果贵司审计有额外的合规基线(如等保 2.0、行业监管指引),可能需要在此基础上补采集。
脚本以 MIT 协议分享,自行担责使用。
拿到脚本后建议先在测试环境跑一遍熟悉产出结构,再上生产。
如果你也在企业做 IT,每年被审计折腾的同行,希望这个工具能帮你省点时间。
脚本获取
在本公众号后台回复"审计脚本"获取