新年好,开年发现服务器被境外IP异常攻击,新买的服务器加固不够,所以多加一层严格防护。具体操作如下:
方案一:使用 PAM 模块(无需安装额外软件,推荐)
麒麟V10默认使用 pam_faillock 模块,我们可以直接配置它来实现登录失败锁定。
-
编辑 PAM 配置文件
bashvi /etc/pam.d/sshd在文件顶部添加以下两行:
iniauth required pam_faillock.so preauth silent audit deny=3 unlock_time=86400 fail_interval=3600 account required pam_faillock.sodeny=3:密码错误3次后锁定unlock_time=86400:锁定时间为1天(秒)fail_interval=3600:在1小时内统计失败次数
-
编辑系统认证文件
bashvi /etc/pam.d/system-auth在
auth段找到pam_env.so行,在其下方添加:iniauth required pam_faillock.so preauth silent audit deny=3 unlock_time=86400 fail_interval=3600在
account段找到pam_unix.so行,在其下方添加:iniaccount required pam_faillock.so -
重启 SSH 服务
bashsystemctl restart sshd -
查看/解锁锁定用户
bash# 查看用户登录失败次数 faillock --user root # 解锁用户 faillock --user root --reset
方案二:通过源码安装 fail2ban(功能更强大)
如果需要更灵活的防护(如自动封禁IP、多服务防护),可以从源码安装 fail2ban。
-
安装依赖
bashyum install -y python3 python3-pip git -
克隆源码并安装
bashgit clone https://github.com/fail2ban/fail2ban.git cd fail2ban python3 setup.py install -
配置 systemd 服务
bashcp build/fail2ban.service /usr/lib/systemd/system/ systemctl daemon-reload -
配置 SSH 防护
创建或编辑 SSH 专用配置文件:
bashvi /etc/fail2ban/jail.d/sshd.local写入以下内容:
ini[sshd] enabled = true port = ssh logpath = /var/log/secure backend = systemd maxretry = 3 # 最大失败次数 bantime = 86400 # 封禁时间(秒),这里是1天 findtime = 3600 # 在1小时内统计失败次数 -
启动并设置开机自启
bashsystemctl enable --now fail2ban systemctl status fail2ban
额外安全建议
-
禁用密码登录,改用密钥认证 :这是最有效的防暴力破解手段。
bashvi /etc/ssh/sshd_config PasswordAuthentication no systemctl restart sshd -
修改 SSH 默认端口:避免大量针对22端口的扫描。
-
限制可登录用户 :在
sshd_config中设置AllowUsers user1 user2,只允许指定用户登录。
查看暴力破解失败的IP地址:
在麒麟V10(或CentOS/RHEL系)系统上,我们可以通过以下几种方式从日志中查询远程登录失败的IP地址:
1. 直接查看系统安全日志(最常用)
SSH 登录失败的日志默认记录在 /var/log/secure 文件中。
查看所有失败登录记录:
bash
grep "Failed password" /var/log/secure
提取并统计所有失败登录的IP地址:
bash
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
$11:提取日志中第11列的IP地址(不同系统日志格式可能略有差异,可根据实际情况调整列号)uniq -c:统计每个IP的失败次数sort -nr:按失败次数从高到低排序
2. 使用 lastb 命令(专门查看失败登录)
lastb 命令可以直接读取 /var/log/btmp 文件,显示所有失败的登录尝试:
bash
lastb
最实用只显示IP地址并统计:**
bash
lastb | awk '{print $3}' | sort | uniq -c | sort -nr
3. 结合 journalctl 查看 systemd 日志
如果你的系统使用 systemd,也可以通过 journalctl 查看 SSH 服务的日志:
bash
journalctl _SYSTEMD_UNIT=sshd.service | grep "Failed password"
提取并统计IP地址:
bash
journalctl _SYSTEMD_UNIT=sshd.service | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -nr
4. 查看 fail2ban 日志(如果已安装)
如果你已经安装并配置了 fail2ban,可以查看它的日志来了解被封禁的IP:
bash
grep "Ban" /var/log/fail2ban.log
补充说明
-
日志文件
/var/log/secure和/var/log/btmp可能会被日志轮转工具(如 logrotate)压缩归档,你可以使用zcat或zgrep查看历史日志,例如:bashzgrep "Failed password" /var/log/secure-*.gz -
如果你发现大量来自同一IP的失败登录,可以使用
fail2ban-client set sshd banip <IP地址>或iptables命令手动封禁该IP。 -
当然,也可以通过物理防火墙来永久封禁。