Shell脚本如何锁定多次登录失败用户:自动化安全防护实战指南
目录导读
- 为什么需要锁定多次登录失败的用户?
- 核心原理:PAM模块与
faillock机制解析 - 手把手编写Shell脚本:从日志分析到账户锁定
- 脚本优化与安全边界:白名单、通知与恢复
- 常见问题问答(Q&A)
为什么需要锁定多次登录失败的用户?
在服务器运维中,暴力破解是常见攻击手段,攻击者通过反复尝试用户名密码,试图非法登录系统,如果不对失败登录进行限制,攻击者可以无限次尝试,直至破解成功。
使用Shell脚本自动化锁定失败登录用户,能有效降低风险:

- 防止暴力破解:超过阈值后自动锁定账户(如尝试5次失败后锁定10分钟)。
- 节省运维成本:无需手动检查日志,脚本可定时执行或结合
systemd实现实时监控。 - 合规性要求:满足ISO 27001、等级保护等标准中“账户锁定策略”条款。
核心原理:PAM模块与faillock机制解析
Linux系统通过pam_tally2(旧版)或pam_faillock(新版)模块记录登录失败次数。
- 日志来源:
/var/log/secure(RHEL/CentOS)或/var/log/auth.log(Debian/Ubuntu)记录每次登录尝试。 - 失败计数存储:
faillock将数据保存在/var/run/faillock/目录下,按用户分隔。 - 锁定动作:通过
pam_faillock.so模块,当失败次数达到设定值(如deny=5),该用户将被拒绝登录(即使密码正确)。
关键命令:
# 查看用户失败记录 faillock --user username # 手动解锁用户 faillock --user username --reset
注意:
pam_faillock需在/etc/pam.d/相关文件中配置(如system-auth或password-auth),否则脚本无法依赖它锁定账户。
手把手编写Shell脚本:从日志分析到账户锁定
以下脚本适用于RHEL/CentOS 7+,兼容pam_faillock机制,逻辑清晰,适合SEO关键词“shell脚本锁定失败用户”。
脚本:lock_failed_users.sh
#!/bin/bash
# 锁定连续登录失败超过阈值的用户
# 作者:运维工程师
# 日期:2025-03-25
# 配置参数
FAIL_THRESHOLD=5 # 失败次数阈值
LOCK_TIME=600 # 锁定时间(秒),0表示永久锁定
EXCLUDE_USERS="root|admin|monitor" # 白名单用户(正则)
# 获取所有失败记录
faillock --list 2>/dev/null | while read line; do
# 解析用户和失败次数
user=$(echo "$line" | awk '{print $1}')
fails=$(echo "$line" | awk '{print $4}')
# 跳过白名单
if echo "$user" | grep -qE "$EXCLUDE_USERS"; then
echo "[INFO] 跳过白名单用户: $user"
continue
fi
# 检查是否达到阈值
if [ "$fails" -ge "$FAIL_THRESHOLD" ]; then
echo "[WARN] 用户 $user 失败次数 $fails,准备锁定"
# 锁定账户(通过passwd -l或usermod -L)
passwd -l "$user" 2>/dev/null
if [ $? -eq 0 ]; then
logger -t "lock_failed_users" "已锁定用户 $user (失败$fails次)"
fi
# 如果需要临时锁定,可配合cron或systemd定时器在$LOCK_TIME后解锁
fi
done
部署步骤:
- 保存脚本:
/usr/local/bin/lock_failed_users.sh - 赋予执行权限:
chmod +x /usr/local/bin/lock_failed_users.sh - 添加定时任务:
crontab -e*/5 * * * * /usr/local/bin/lock_failed_users.sh >> /var/log/user_lock.log 2>&1 - 验证日志输出:
tail -f /var/log/user_lock.log
脚本优化与安全边界:白名单、通知与恢复
1 避免误锁:白名单策略
- 管理员账户(
root)、监控程序(如prometheus)应排除。 - 使用
awk从/etc/group中提取wheel组成员作为管理员白名单。
2 自动解锁机制
脚本锁定后,需配合以下方案恢复:
- 定时解锁:在
cron中加入解锁任务,如at now +10 minutes。 - 手动恢复:生成报告后由管理员通过
passwd -u解锁。
3 集成通知告警
# 在锁定后发送邮件 echo "用户 $user 已被锁定,请处理。" | mail -s "安全警报:账户锁定" admin@example.com
4 日志与审计
- 脚本操作记录到
/var/log/messages(通过logger)。 - 定期分析锁定记录,识别异常模式(如大量不同用户失败)。
常见问题问答(Q&A)
Q1:为什么我的脚本检测不到失败记录?
A:检查pam_faillock是否已配置,运行faillock --list若显示为空,需编辑/etc/pam.d/system-auth,在auth部分添加:
auth required pam_faillock.so preauth silent deny=5 unlock_time=600
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=600
Q2:锁定后如何手动解锁?
A:使用passwd -u username或usermod -U username解锁,若使用faillock,还需运行faillock --user username --reset清除记录。
Q3:脚本中passwd -l和usermod -L有什么区别?
A:passwd -l会锁定密码字段(用前缀),但允许SSH密钥登录;usermod -L完全禁用账户,生产环境推荐passwd -l避免误锁正常密钥连接。
Q4:如何防止脚本误锁root用户?
A:在脚本中加入白名单过滤,或直接跳过UID为0的账户:if [ "$user" == "root" ]; then continue; fi。
Q5:如果攻击者更换IP怎么办?
A:脚本锁定的是本地用户账户,与IP无关,若要基于IP限制,需结合fail2ban或iptables,建议两者配合:脚本锁定账户,fail2ban封禁IP。
Q6:脚本在CentOS 6上能运行吗?
A:CentOS 6使用pam_tally2,需修改脚本使用pam_tally2 --user和pam_tally2 --user --reset,建议升级至CentOS 7+。
通过Shell脚本自动化锁定多次登录失败的用户,是防御暴力破解的高效手段,结合pam_faillock、定时任务与白名单策略,既能提升服务器安全性,又避免影响正常用户,安全策略需持续优化——定期审查日志、调整阈值,并配合其他工具(如fail2ban、多因素认证)构建纵深防御体系。
延伸阅读:
- 红帽官方文档:
man pam_faillock - 开源工具:
denyhosts(基于日志的SSH防护)