昔我往矣

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

2021年11月26日

将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命令进行追加。

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

当前暂无评论 »

添加新评论 »