定期清理服务器闲置与过期账号需建立“识别—确认—处置—记录”闭环,重点在于精准判断、操作留痕与可回溯;识别标准为90天无登录+非交互shell+密码过期且UID≥1000;处置须先禁用(锁定密码、改nologin、设过期日),观察日志后再删除;自动化脚本需定时执行、备份家目录、写审计日志并二次确认;同步加固包括强制首次改密、限制登录方式、细粒度sudo授权及季度空组清理。

定期清理服务器闲置与过期账号,核心是建立“识别—确认—处置—记录”闭环,避免手动遗漏,同时防止误删关键账户。重点不在删得多快,而在判得准、留痕清、可回溯。
一、精准识别闲置与过期账号
闲置 ≠ 从未登录,而是长期无有效活动;过期 ≠ 账号创建久,而是密码失效+无登录+非交互shell三者叠加。需组合判断:
- 查90天内无成功登录:用last -s "-90 days" -n 10000 | awk '{print $1}' | sort | uniq -c | sort -n,过滤出零记录或极低频次用户
- 筛非交互shell且密码已过期:运行awk -F: '$7 ~ /nologin|false/ && $2 != "*" {print $1}' /etc/shadow | while read u; do chage -l "$u" 2>/dev/null | grep -q "Password expires.*never\|Password must be changed"; [ $? -eq 0 ] && echo "$u"; done
- 排除系统账户:只关注UID ≥ 1000的普通用户(awk -F: '$3 >= 1000 {print $1}' /etc/passwd),跳过root、syslog、sshd等必需服务账号
二、安全处置:先禁用,再清理
禁用是缓冲动作,比直接删除更稳妥。观察1–2天系统日志(journalctl -u systemd-logind 或 tail -n 50 /var/log/auth.log)无异常,再执行后续操作:
- 锁定密码:sudo passwd -l username
- 禁用shell登录:sudo usermod -s /usr/sbin/nologin username
- 设账户过期日为当天(立即失效):sudo chage -E 0 username
- 确认禁用状态:sudo passwd -S username(输出含“LK”即成功)
三、自动化清理与审计留痕
人工检查易疏漏,应通过cron定时脚本自动执行识别与归档,并强制记录操作痕迹:
- 每月1日凌晨2点运行清理脚本:0 2 1 * * /usr/local/bin/clean-stale-users.sh >> /var/log/user_cleanup.log 2>&1
- 脚本中必须包含备份步骤:如打包家目录tar -czf /backup/stale_${USER}_$(date +%F).tar.gz /home/${USER}(即使最终删除,也先存档)
- 每次操作写入审计日志:echo "$(date): DISABLED ${USER} (last login: $(lastlog -u ${USER} | tail -1 | awk '{print $5,$6,$7}'))" >> /var/log/user_cleanup.log
- 删除前二次确认:脚本中加入read -p "Delete ${USER}? [y/N] " -n 1 -r; echo; [[ $REPLY =~ ^[Yy]$ ]] && userdel -r ${USER}
四、配套加固,阻断新增隐患
清理是结果,预防才是根本。同步落实以下措施,减少未来产生闲置账号:
- 新用户强制首次登录改密:chage -d 0 username
- 所有非必要账号统一设为/usr/sbin/nologin,禁用密码登录,仅允SSH密钥访问
- 禁用默认wheel组无限制sudo权限,改用细粒度组授权(如%ops ALL=(ALL) /usr/bin/systemctl restart nginx)
- 每季度执行getent group | cut -d: -f1 | xargs -I{} members {} 2>/dev/null | grep -v "^$" | wc -l检查空组,及时清理孤立用户组

















