用shell 脚本来防ssh ftp 暴力破解

  新近刚上的 FTP 备份服务器,例行检查 /var/log/secure 日志时,发现不少 sshd vsftpd 失败认证信息,很明显有人想用暴力破解工具窃取密码,所以需要编写一个安全脚本防止。
脚本需求如下:此 SHELL 脚本放在 crontab 计划任务里,每隔 6 小时(此时间根据实际情况来定义)就去读取 /var/log/secure 脚本,取出里面恶意猜测 IP ,如果单位时间内(一星期)的连接数是高于一个阀值,例如 100 (此阀值也可以根据实际情况来定义),则将其加进 /etc/hosts.deny 黑名单里,如果低于此阀值,则无视此 IP
  /var/log/secure 里认证失败信息如下:
Nov 28 10:18:08 centos2 sshd[7556]: Connection closed by 222.216.30.109
Nov 28 10:18:08 centos2 sshd[7557]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.216.30.109        user=root
Nov 28 10:18:09 centos2 sshd[7559]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.216.30.109        user=root
Nov 28 10:18:10 centos2 sshd[7551]: Failed password for root from 222.216.30.109 port 2391 ssh2
Nov 28 10:18:10 centos2 sshd[7552]: Connection closed by 222.216.30.109
Nov 28 10:18:10 centos2 sshd[7553]: Failed password for root from 222.216.30.109 port 2397 ssh2
Nov 28 10:18:10 centos2 sshd[7554]: Connection closed by 222.216.30.109
Nov 28 10:18:11 centos2 sshd[7557]: Failed password for root from 222.216.30.109 port 2401 ssh2
Nov 28 10:18:11 centos2 sshd[7558]: Connection closed by 222.216.30.109
Nov 28 10:18:11 centos2 sshd[7559]: Failed password for root from 222.216.30.109 port 2403 ssh2
Nov 28 10:18:11 centos2 sshd[7560]: Connection closed by 222.216.30.109
Nov 28 10:37:01 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown
Nov 28 10:37:01 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=hello rhost=centos1.cn7788.com
Nov 28 10:37:01 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user hello
Nov 28 10:37:19 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown
Nov 28 10:37:19 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=yhc rhost=centos1.cn7788.com
Nov 28 10:37:19 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user yhc
Nov 28 10:37:36 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown
Nov 28 10:37:36 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=yuhongchun rhost=centos1.cn7788.com
Nov 28 10:37:36 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user yuhongchun
Nov 28 10:42:44 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown
Nov 28 10:42:44 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=yuhongchun rhost=114.112.169.70
Nov 28 10:42:44 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user yuhongchun
Nov 28 10:42:56 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown
Nov 28 10:42:56 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=andrewyu rhost=114.112.169.70
Nov 28 10:42:56 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user andrewyu
我们观察下 /var/log/secure 文件轮询特征,如下所示:
[root@centos2 log]# ls -lsart secure.*
512 -rw------- 1 root root 516379 11-04 01:31 secure.4
660 -rw------- 1 root root 668192 11-11 00:05 secure.3
304 -rw------- 1 root root 306589 11-17 10:33 secure.2
484 -rw------- 1 root root 488620 11-25 02:33 secure.1
基本上,/var/log/ secure 文件是以星期为轮询周期的,如果对安全要求严格的朋友还可以本着“一个不放过”的原则来抓取上面的旧 secure 的恶意 IP,然后扔进/etc/hosts.deny文件里。 下面我们就们就要想办法高效的来抓取这些恶意 IP ,如果参考原始版本 SHELL 脚本写法,,我们这里要抓取 secure 日志中的侦测 vsftpd sshd 服务的 IP 地址,我们可以用如下命令,命令如下所示:
cat /var/log/secure | awk '/Failed/{print $(NF-3)}'| sort| uniq -c| awk '{print $2"="$1;}'
很明显,这样是取不到 vsftpd 失败的 IP 值的, sshd 日志失败信息跟 vsftpd 日志失败信息不一样,我写了几种 awk 混合 sed 的方法,测试了效率,感觉用 awk 脚本速度是最快的,大家也可以写几种,用 time 命令测试下;最后精简了下代码,完成了整个脚本,脚本内容如下所示:
#!/bin/bash
awk '{for(i=1;i<=NF;i++){if($i ~ /rhost/)print substr($i,7)}}' /var/log/secure | sort | uniq    -c    >/root/black.txt
DEFINE="100"
cat     /root/black.txt |    while read LINE
do
                NUM=`echo $LINE |awk '{print $1}'`
                host=`echo $LINE    |awk '{print $2}'`
                if [ $NUM -gt $DEFINE ];
                then
                 grep $host    /etc/hosts.deny > /dev/null
                    if [ $? -gt 0 ];
                    then
                    echo "sshd:$host"     >> /etc/hosts.deny
                    echo "vsftpd:$host" >> /etc/hosts.deny
                    fi
                fi
done

 
脚本运行一段时间后,我们可以观察此脚本涉及到的一些文件,如 /root/black.txt ,结果如下所示:
[root@centos2 ~]# cat /root/black.txt
                2 113.17.144.156
                4 114.112.51.208
                4 114.112.69.170
            169 118-163-227-50.hinet-ip.hinet.net
                8 119.188.7.200
                8 122.70.130.11
             61 124.248.32.246
             12 183.203.14.121
                3 189.26.255.11
             56 199.204.237.60
                3 199.30.53.220
                5 201.236.80.4
                6 220.172.191.31
             30 222.216.30.109
             60 222.253.159.111
             58 223.4.180.23
            166 58.221.42.178
                1 61.132.4.85
            152 61.142.106.34
             22 61.167.33.222
                7 85.126.166.83
            166 www.b-nets.com

/etc/hosts.deny 脚本内容如下:
sshd:124.248.32.246
vsftpd:124.248.32.246
sshd:199.204.237.60
vsftpd:199.204.237.60
sshd:222.253.159.111
vsftpd:222.253.159.111
sshd:223.4.180.23
vsftpd:223.4.180.23
sshd:58.221.42.178
vsftpd:58.221.42.178
sshd:61.142.106.34
vsftpd:61.142.106.34
sshd:118-163-227-50.hinet-ip.hinet.net
vsftpd:118-163-227-50.hinet-ip.hinet.net
sshd:www.b-nets.com
vsftpd:www.b-nets.com
最后,我们将此 shell 脚本放进 crontab  里,每间隔六小时就运行一次,命令如下:
* */6 * * * root /bin/bash /root/hostsdeny.sh >> /dev/null 2>&1
由于 /var/log/secure 日志是以星期为轮询的,此脚本执行频率可自行设定,如果感觉服务器被频繁侦测,执行频率间隔可设置短些,反之,可设置长些。
 
附注:如果仅仅只是要防止 SSH 暴力破解,这个脚本就没必要更新了,可以采纳我原先的 SHELL 脚本(即原始版本),此更新脚本适合部署在有 FTP 的公网机器上面,目前测试比较稳定,但感觉还是有不完美的地方,欢迎大家来信交流,抚琴煮酒 ([email protected])
本文出自 “ 抚琴煮酒” 博客,请务必保留此出处 http://andrewyu.blog.51cto.com/1604432/1074650

你可能感兴趣的:(shell)