需结合faillock与iptables或kysec工具实现IP锁定:先启用faillock记录失败IP,再通过定时脚本解析faillog并调用iptables封禁,或直接运行sudo kysec fix --id SEC-007一键加固,自动部署IP级防护规则。

如果您在麒麟系统中需要实现“用户登录失败达到指定次数后自动锁定IP地址”的安全防护,该需求本质是阻断暴力破解攻击源,不能仅靠PAM账户锁定模块(如pam_faillock.so)完成——它只锁用户,不锁IP。必须结合防火墙规则与登录日志分析工具联动实现。
确认系统是否启用faillock并查看失败记录
先验证PAM失败计数机制是否已激活,避免后续规则无数据可依:在终端执行 sudo faillog -a。若返回空或提示“no such file”,说明pam_faillock未配置生效,【此时直接配置iptables封IP将无效,因无失败IP来源依据】。
执行 sudo faillog --user root 查看root用户的失败登录时间、次数和来源IP(如果已配置pam_faillock且日志完整)。
使用faillock + iptables组合实现IP锁定
该方法适用于SSH远程登录场景,依赖faillock记录的失败IP和iptables实时封禁,无需额外安装软件。
第一步:确保 /etc/security/faillock.conf 中启用了 use_uid = false(默认关闭),否则faillog -a无法显示IP地址;编辑该文件,取消该行注释并设为false。
第二步:在 /etc/pam.d/sshd 文件顶部添加以下两行(顺序不能颠倒):
auth [default=ignore,success=ok,user_unknown=ignore] pam_faillock.so preauth silent deny=3 unlock_time=600 fail_interval=900
auth [default=die] pam_faillock.so authfail deny=3 unlock_time=600 fail_interval=900
第三步:创建定时扫描脚本 /usr/local/bin/block_failed_ips.sh:
#!/bin/bash
faillog -a | awk '$3 ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ && $4 > 3 {print $3}' | 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 IP $ip due to repeated SSH auth failures"
fi
done
第四步:赋予执行权限并加入cron每5分钟运行一次:sudo chmod +x /usr/local/bin/block_failed_ips.sh && echo "*/5 * * * * root /usr/local/bin/block_failed_ips.sh" | sudo tee /etc/cron.d/faillock-ip-block。
使用kysec工具一键加固(推荐桌面版用户)
银河麒麟自带的kysec工具已内置IP级防护逻辑,比手动配置更可靠。
方法一:终端执行 sudo kysec fix --id SEC-007,该ID对应“SSH登录失败N次后封禁源IP”策略,会自动配置faillock参数并部署iptables规则链。
方法二:若kysec提示SEC-007不可用,改用 sudo kysec list | grep lock 查找含“ip”或“source”的加固项ID,再执行对应fix命令。
执行后立即生效,无需重启服务,封禁IP保存在iptables的自定义链KYSEC-LOCK中,可通过 sudo iptables -L KYSEC-LOCK -n 查看当前被锁IP列表。
验证与解锁被锁IP
测试时用另一台机器连续三次输错SSH密码,等待5分钟后执行 sudo iptables -L INPUT -n | grep REJECT,若看到目标IP出现在DROP规则中,即表示成功。
手动解封某IP:执行 sudo iptables -D INPUT -s 192.168.1.100 -j DROP(将192.168.1.100替换为实际IP)。
清空所有封禁IP:sudo iptables -F INPUT(慎用,会清除全部INPUT规则)。











