Shell脚本如何锁定多次登录失败用户

wen 实用脚本 2

Shell脚本如何锁定多次登录失败用户:自动化安全防护实战指南

目录导读

  1. 为什么需要锁定多次登录失败的用户?
  2. 核心原理:PAM模块与faillock机制解析
  3. 手把手编写Shell脚本:从日志分析到账户锁定
  4. 脚本优化与安全边界:白名单、通知与恢复
  5. 常见问题问答(Q&A)

为什么需要锁定多次登录失败的用户?

在服务器运维中,暴力破解是常见攻击手段,攻击者通过反复尝试用户名密码,试图非法登录系统,如果不对失败登录进行限制,攻击者可以无限次尝试,直至破解成功。
使用Shell脚本自动化锁定失败登录用户,能有效降低风险:

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-authpassword-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

部署步骤:

  1. 保存脚本/usr/local/bin/lock_failed_users.sh
  2. 赋予执行权限chmod +x /usr/local/bin/lock_failed_users.sh
  3. 添加定时任务crontab -e
    */5 * * * * /usr/local/bin/lock_failed_users.sh >> /var/log/user_lock.log 2>&1
  4. 验证日志输出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 usernameusermod -U username解锁,若使用faillock,还需运行faillock --user username --reset清除记录。

Q3:脚本中passwd -lusermod -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限制,需结合fail2baniptables,建议两者配合:脚本锁定账户,fail2ban封禁IP。

Q6:脚本在CentOS 6上能运行吗?
A:CentOS 6使用pam_tally2,需修改脚本使用pam_tally2 --userpam_tally2 --user --reset,建议升级至CentOS 7+。


通过Shell脚本自动化锁定多次登录失败的用户,是防御暴力破解的高效手段,结合pam_faillock、定时任务与白名单策略,既能提升服务器安全性,又避免影响正常用户,安全策略需持续优化——定期审查日志、调整阈值,并配合其他工具(如fail2ban、多因素认证)构建纵深防御体系。

延伸阅读

  • 红帽官方文档:man pam_faillock
  • 开源工具:denyhosts(基于日志的SSH防护)

抱歉,评论功能暂时关闭!