IT技术博客大学习 共学习 共进步

一句话crontab实现防ssh暴力破解

昔我往矣 2022-06-19 18:15:01 浏览 4,564 次

   将vps在公网上,难免会有居心叵测的人扫描,及时换了非标准的端口,依旧难以避免。因此编写一条Bash命令,放在crontab里,发现坏人立刻封掉ip。

   一句话命令如下:

$ crontab -l
* * * * *  journalctl -u ssh.service --since="24 hours ago" | awk '/Failed password/{if(NF>15){ips[$13]++}else{ips[$11]++}}END{for(ip in ips){if(ips[ip]>3){print ip}}}' | while read ip; do grep $ip$ /etc/hosts.deny > /dev/null || echo "ALL: "$ip | sudo tee -a /etc/hosts.deny ; done

   功能:24小时内输错5次ssh密码的客户端ip,将立刻被添加到 /etc/hosts.deny 文件里做黑名单处理。

   简单解析:

   该条语句可以按三个管道符号进行分割,下面分别讲解。

   管道的第一部分:使用 journalctl 命令查询最近24小时内的登录日志,该命令适用于使用systemd的系统,如果非systemd,可以换成从 /var/log/secure 文件过滤日志。

   管道的第二部分:主要是awk过滤登录失败日志,关键字Failed password。对登录失败的ip地址进行统计,输出失败次数大于3次的ip地址。此处用到了awk的数组功能做统计。

   管道的第三部分:去重,避免重复添加IP到/etc/hosts.deny文件中。使用while语句判断ip地址是否已经在 /etc/hosts.deny中,如果不在,则使用tee命令进行追加。

   该命令不仅实用,而且还很有趣。个人以为十分有学习价值。

建议继续学习

  1. Linux shell脚本使用while循环执行ssh的注意事项 (阅读 8,061)
  2. 在ssh服务里使用chroot (阅读 5,841)
  3. 为什么要用公钥/私钥而不是密码去做SSH身份验证 (阅读 5,701)
  4. 如何让ssh登录更加安全 (阅读 5,602)
  5. ssh连接超时解决办法 (阅读 5,503)
  6. 懒人连ssh不输密码若干大法 (阅读 5,481)
  7. SSH无密码登录 (阅读 5,481)
  8. ssh命令 (阅读 5,223)
  9. 共享会话的ssh连接配置 (阅读 4,702)
  10. SSH下连接Oracle的方法 (阅读 4,502)