最近查看了一下日志服务器,这台日志服务器监控来自服务器群里面的一些机器日常运行日志,可以通过网页形式查看,结果有点出乎意料:
总是有那么一些人会不停地扫机器,不停的尝试暴力破解ssh登陆,还好本人用的密码估计可以让这些无聊的人猜个几万年,但是老是这样子也不行啊,想了几个防范的方法:
1.关闭ssh的root登陆选项,这样可以一定程度上面防范,但是今后想用root直接登陆就不行了,安全了但是也麻烦了,随便吐槽一下,公司研发那边人连vpn都不想用,说太麻烦了,结果还是直接给他们开放出来了,这样的“人才”我只能说我跪了。放弃这个想法。
2.vpn登陆,上面就说了,人家嫌麻烦!又放弃之。
3.收集登陆信息,发现登陆次数过多的ip,直接扔到hosts.deny里面,这样就可以防止了。
没错,这里说的是第三种方案了,但是要写脚本!
首先要知道,登陆信息是放在那个文件里面的,我用的centos,一般都是放在/var/log/secure文件里面,直接vi就可以看到里面的各种登陆信息。
那就干活吧,写shell去:
#touch blockip.sh
#vi blockip.sh
#!/bin/bash
datenode=`date -d -15min|awk ‘{print substr($0,10,5)}‘`
blockip=`cat /var/log/secure | grep "$datenode" | awk ‘$6 ~ "Failed" {print $0}‘ | grep -o ‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘ | sort | uniq -c | awk ‘$1>6 {print "sshd:"$2}‘`
echo $blockip >> /etc/hosts.deny
这里解析一下:
- datenode=`date -d -15min|awk ‘{print substr($0,10,5)}‘` 的意思是设置一个监控时间点,我这里设置了15分钟内的
- cat /var/log/secure | grep "$datenode" | awk ‘$6 ~ "Failed" {print $0}‘ 查找15分钟内在第六个字段出现有"Failed"的内容,因为在secure文件里面,出现"Failed"基本上就可以判断是有问题的,这里是根据我服务器情况而定的,具体可以根据服务器实际的内容决定
- | grep -o ‘[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}‘ | sort | uniq -c 在b中找了内容后再匹配如果是出现ip形式的内容,并且sort排序,uniq去除重复,-c是计算次数
- | awk ‘$1>6 {print "sshd:"$2}‘` 最后筛选出来的内容第一列数字如果大于6次(也就是证明这个ip不断尝试了6次ssh登陆(实际如果是我们去登陆的话,写错6次密码的几率很低了),然后打印出来sshd $2,$2第二列是ip,形式就是sshd:x.x.x.x
好了,这下终于筛选出来了最终的格式了sshd:x.x.x.x,然后写到/etc/hosts.deny里面,这样下次再出现这个ip尝试登陆的话,系统会直接禁止访问了,再配合crontab,每15分钟扫一下:
*/15 * * * * sh /opt/blockip.sh > /dev/null 2>&1
再每个晚上23时重置一下hosts.deny文件,/opt/hosts.deny是一个没有新增内容的一个原始文件,为了是以防那天这些ip被好人使用了,又想访问我们的业务的话,那这样就相当于清空了限制了。
* 23 * * * cat /opt/hosts.deny > /etc/hosts.deny
over!