linux无内置密码字典攻击防御脚本,但可通过pam faillock实现账户锁定(如5次失败锁15分钟)、结合iptables日志解析脚本封禁高频ip,并支持阈值、时间窗口、白名单等策略自定义。

Linux系统本身不提供“密码字典攻击防御脚本”的内置功能,但可通过组合系统机制(PAM、faillock、sshd配置)与轻量级监控脚本实现有效防护。核心思路是:实时识别异常登录尝试 → 触发账户锁定或IP封禁 → 支持策略自定义(如阈值、时间窗口、白名单)。以下为可落地的实现方案。
用PAM faillock 实现基础账户锁定
PAM(Pluggable Authentication Modules)是Linux认证的核心框架,faillock模块可记录失败登录并自动锁定用户。无需额外脚本,开箱即用:
- 启用faillock:编辑 /etc/pam.d/common-auth,添加一行:
auth [default=bad success=ok user_unknown=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 - 追加失败动作行到同一文件末尾:
auth [default=bad success=ok user_unknown=ignore] pam_faillock.so authfail deny=5 unlock_time=900 - 确保成功登录后清除计数:
在 /etc/pam.d/common-account 中添加:account required pam_faillock.so
说明:连续5次失败后锁定账户15分钟(900秒),支持手动解锁(faillock --user username --reset)。
用iptables + 自定义日志解析脚本封禁IP
faillock只锁账户,无法阻止攻击者换用户暴力探测。需结合SSH日志(/var/log/auth.log)识别高频IP并封禁:
- 编写简易检测脚本(如 /usr/local/bin/ssh-brute-block.sh):
#!/bin/bash
# 统计最近10分钟内失败登录超6次的IP
awk -v cutoff=$(date -d '10 minutes ago' '+%b %d %H:%M') \
'$0 > cutoff && /Failed password/ {print $11}' /var/log/auth.log | \
sort | uniq -c | awk '$1 > 6 {print $2}' | while read ip; do
if ! iptables -C INPUT -s "$ip" -j DROP 2>/dev/null; then
iptables -I INPUT -s "$ip" -j DROP
logger "BLOCKED SSH brute IP: $ip"
fi
done
- 通过cron每2分钟执行一次:
*/2 * * * * /usr/local/bin/ssh-brute-block.sh - 建议配合
iptables-persistent保存规则,避免重启丢失。
自定义策略的关键控制点
防御效果取决于策略是否贴合实际场景,而非越严越好。重点关注以下可调参数:
- 失败阈值:普通用户设为5~10次;管理员账户建议更严格(如3次),或单独禁止密码登录(仅允许密钥)
- 时间窗口:短窗口(如5分钟)对突发扫描敏感,长窗口(如1小时)更适合识别慢速持久攻击
- 封禁范围:IP封禁需谨慎——云环境、NAT出口可能造成误伤;可先记录告警,人工确认后再封禁
-
白名单机制:在iptables脚本中加入可信IP段(如公司出口IP),避免自身被锁:
if [[ "$ip" =~ ^(192\.168|10\.|172\.(1[6-9]|2[0-9]|3[0-1])) ]]; then continue; fi
增强防护的实用补充项
单一脚本无法覆盖全部风险,需叠加基础加固:
- 禁用root远程密码登录:
在 /etc/ssh/sshd_config 中设PermitRootLogin no并重载服务(systemctl reload sshd) - 改用非标SSH端口(如2222)可过滤掉大量自动化扫描流量
- 部署
denyhosts或fail2ban替代手工脚本——它们已成熟支持多服务、邮件告警、持久化封禁等,适合生产环境 - 强制使用SSH密钥认证,并禁用密码登录(
PasswordAuthentication no),从源头消除字典攻击面











