轻量高效的关键账户安全审计方案是用Shell脚本+cron定期采集指纹并比对基线:一、采集密码状态、登录权限、sudo/组权限、最后活动时间等核心指纹项;二、脚本输出CSV快照,与基线diff比对,标记空密码等高风险项;三、生成含摘要页、问题清单、变更日志的结构化报表;四、通过crontab每周执行,自动归档快照并设权限。

直接用 Shell 脚本 + cron 定期采集关键账户指纹,再比对基线并生成结构化报表,是轻量高效的做法。重点不在工具多高级,而在指纹选得准、比对逻辑清、结果可追溯。
一、明确要采集的账户指纹项
账户指纹不是指生物特征,而是能反映账户安全状态的关键属性组合。等保2.0和CIS基线都强调以下几项:
-
密码状态:是否为空(
awk -F: '$2=="" {print $1}' /etc/shadow)、是否过期(chage -l $user | grep "Password expires") -
登录权限:能否交互式登录(检查
/etc/passwd中 shell 是否为/bin/bash或/bin/sh,排除/sbin/nologin)、是否禁用(passwd -S $user | awk '{print $2}'输出LK表示锁定) -
权限范围:是否拥有无密码 sudo 权限(
grep -v '^#' /etc/sudoers | grep -E 'NOPASSWD|ALL.*ALL' | grep -v 'root')、是否属于特权组(如sudo、docker、adm) -
最后活动时间:最近一次登录(
lastlog -u $user | tail -1 | awk '{print $5,$6,$7,$8,$9}')、最近一次密码修改(chage -l $user | grep "Last password change")
二、用脚本自动采集与比对
写一个 account_fingerprint.sh,每次运行输出 CSV 格式的当前快照,并与上一次快照做差异比对:
- 采集时按固定顺序输出字段:
username,password_status,shell_status,sudo_status,last_login,pass_change_date,groups - 将上次快照保存为
/var/log/account_baseline.csv,本次结果存为/tmp/account_now.csv - 用
diff或awk找出新增、删除、变更的账户行;例如检测空密码或异常 sudo 权限,直接标为 高风险 - 不建议只存“是/否”,而应记录原始值(如
password_status=empty),便于回溯和审计举证
三、生成可交付的合规性报表
报表不需要花哨,但必须包含三项核心内容:
- 摘要页:总账户数、高风险账户数、中风险账户数、合规率(例如:合规率 = (总账户 − 高风险 − 中风险) / 总账户 × 100%)
-
问题清单:每条含账户名、违规项、依据条款(如“等保2.0 8.1.2.3:禁止存在空口令账户”)、建议操作(如
sudo passwd -l guest) -
变更日志:列出本次比对发现的新建账户、已删除账户、权限变动(如某用户被加入
sudo组),附时间戳
可用 printf 拼接文本报表,或用 csvkit 转成 Excel;若需 PDF,可调用 wkhtmltopdf 渲染 HTML 模板。
四、纳入定时任务与归档机制
在 /etc/crontab 中添加:
0 3 * * 1 root /opt/scripts/account_fingerprint.sh >> /var/log/account_audit.log 2>&1
- 每周一凌晨3点执行,避开业务高峰
- 脚本自身负责备份旧快照(如重命名为
account_baseline_$(date -d 'last week' +%Y%m%d).csv),保留最近4周 - 所有输出文件归属
root:audit,权限设为640,防止非授权读取

















