Loading... ## 1. 事情经过 今天登录服务器的时候意外发现了大量通过ssh尝试登录失败的日志,大致如下: ```bash Nov 23 05:08:59 centos-01 sshd[8382]: Failed password for root from 218.92.0.51 port 19892 ssh2 Nov 23 05:09:01 centos-01 sshd[8428]: Failed password for root from 180.101.88.241 port 36909 ssh2 Nov 23 05:09:02 centos-01 sshd[8382]: Failed password for root from 218.92.0.51 port 19892 ssh2 ``` 于是我深入检查了一下系统日志,发现不仅有来自诸多ip的登录尝试,同时登录者还在不停尝试不同的常用用户名: ```bash Nov 23 04:49:33 centos-01 sshd[2819]: Failed password for invalid user dp from 43.156.49.122 port 44560 ssh2 Nov 23 04:50:00 centos-01 sshd[2914]: Failed password for invalid user lucy from 189.203.203.66 port 4533 ssh2 Nov 23 04:50:01 centos-01 sshd[2916]: Failed password for invalid user ruud from 43.156.39.45 port 41570 ssh2 Nov 23 04:50:06 centos-01 sshd[2942]: Failed password for invalid user tai from 206.81.18.4 port 45574 ssh2 Nov 23 04:50:22 centos-01 sshd[2998]: Failed password for invalid user paloma from 45.119.85.88 port 58436 ssh2 Nov 23 04:50:24 centos-01 sshd[3000]: Failed password for invalid user ubuntu from 165.22.242.64 port 52606 ssh2 Nov 23 04:50:32 centos-01 sshd[3041]: Failed password for invalid user hfz from 42.96.47.162 port 14601 ssh2 Nov 23 04:50:42 centos-01 sshd[3083]: Failed password for invalid user ahmadi from 188.166.210.39 port 57826 ssh2 Nov 23 04:50:45 centos-01 sshd[3101]: Failed password for invalid user ttt from 43.156.49.122 port 39482 ssh2 Nov 23 04:51:18 centos-01 sshd[3222]: Failed password for invalid user yjlee from 189.203.203.66 port 4534 ssh2 Nov 23 04:51:23 centos-01 sshd[3242]: Failed password for invalid user lucy from 43.156.39.45 port 47638 ssh2 Nov 23 04:51:24 centos-01 sshd[3244]: Failed password for invalid user joey from 206.81.18.4 port 51070 ssh2 ``` 当然,这里只包含了其中的一小部分,已经足以判断这台服务器受到了ssh爆破。于是我使用指令简单统计了一下有错误登录记录数量 ```bash [root@centos-01 ~]# sudo grep "Failed password" /var/log/secure | wc -l 5491 ``` 也统计了一下ip地址和错误的次数,这里只展示了部分次数比较高的ip,还有其他大量ip在发起攻击。 ```bash [root@centos-01 ~]# sudo grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr 321 216.167.191.198 120 218.92.0.59 117 218.92.0.52 113 180.76.128.214 108 218.92.0.26 107 218.92.0.43 103 218.92.0.45 93 218.92.0.76 93 218.92.0.56 91 218.92.0.47 84 218.92.0.40 81 61.177.172.136 81 180.101.88.196 63 61.177.172.160 63 218.92.0.25 61 35.224.2.98 56 209.97.134.229 ``` 并且通过观察,这些尝试登录的总数正在不断增加,大概10s左右就有一次记录 ## 2. 应对策略 不停地封ip当然是不现实的,修改ssh的端口也依然可以通过端口扫描暴力尝试。于是我采取了强密码+fail2ban+在信任设备上配置密钥对的方式来大力减小端口被爆破成功的风险。 ### 2.1 改密码 这里我使用了Apple设备的密码管理器生成的20位强密码(大小写+数字+特殊字符),字母和数字间没有语义联系,因此本身被破解的难度就巨大了(>1亿年),即使未来多年算力有巨大提升,想要破解这样的密码依然很困难。 `⚠️⚠️`当然,为了防止其他渠道泄露密码,定期修改密码是必须的。同时,搭配后面的其他方法,让信任的设备可以直接登录以及在服务器中使用脚本封锁ip,ssh被成功爆破的可能性无限接近0。爆破者广撒网地尝试登录也是需要付出成本和代价的,当他的脚本发现自己无法在一定次数内完成破解,他当然不可能无限制地尝试下去。 ### 2.2 配置ssh密钥对 在客户端上执行 `ssh-keygen -t rsa -b 4096`生成密钥对,过程中可以根据提示设置其他文件名与路径,一路回车保持默认。 接着执行`ssh-copy-id -i ~/.ssh/mykey.pub username@hostname`将刚刚生成的公钥上传到服务器,注意替换路径和服务器用户名与ip。 再在本地尝试`ssh username@hostname`就可以免密登录服务器了,这样可以避免每次输入很长的密码。 ### 2.3 配置fail2ban > Fail2Ban 扫描日志文件或日志(使用指定的正则表达式,也称为过滤规则)并执行配置的操作以禁止尝试次数过多的失败(匹配指定的过滤规则)。例如,它通过更新系统防火墙规则来拒绝来自这些 IP 地址的新连接,并在可配置的时间内做到这一点。但是你可以写或配置你自己的操作来禁止其他的东西,如主机/IP,如用户或电子邮件。 **安装fail2ban** ```bash yum install epel-release yum install fail2ban ``` 此时应该可以发现fail2ban的配置文件在`\etc\fail2ban`路径中,其中包含了一个`jail.conf`文件,但是我们不应该直接修改它,而是在`jail.d`文件夹中创建配置文件。 **创建配置文件** ```bash vim /etc/fail2ban/jail.d/sshd.local ``` (当然如果你习惯使用nano或者其他编辑器的话,也可以自行调整) 按 i 键,加入下面内容,可以根据实际情况调整。然后按esc,在输入:wq保存文件 ```yaml [sshd] enabled = true port = 22 filter = sshd logpath = /var/log/secure # centos对应这个路径,如果是ubuntu可能不一样 banaction = iptables-multiport maxretry = 3 bantime = 3600 # 封禁一小时 ``` **启动服务并设置开机自动启动** ```bash systemctl start fail2ban systemctl enable fail2ban ``` 此时服务应该已经启动,可以使用`fail2ban-client status sshd`查看哪些运行状态以及哪些ip被禁。 尝试使用某设备登录输错密码3次,再尝试时,会显示`ssh: connect to host xx.xx.xx.xx port 22: Connection refused` 如果有新设备登录,数错密码次数过多被误封,可以使用下面命令解封。 ```bash fail2ban-client set sshd unbanip IP_ADDRESS ``` ## 3. 总结 这套操作下来,其实服务器几乎不可能通过强行尝试密码被爆破了。如果服务器用在生产环境,数据无价,那么不妨关闭ssh的公网访问,加一层跳板机,再配置一个vpn,通过vpn访问。 最后修改:2023 年 11 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 7 如果觉得我的文章对你有用,请随意赞赏