方案3 自动判断用户登录,封禁非法SSH入侵
实施方法有两种:
安装DenyHost软件
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件,当发现重复的攻击时就会记录I P 到/etc/hosts.deny文件,从而达到自动屏蔽IP的功能。安装与使用方法大家可以到官方网站上查看。
DenyHosts官方网站为:http://denyhosts.sourceforge.net,它是开源软件。
自己编写脚本
a 、预期效果
每分钟都检查日志/var/log/messages,发现10分钟内有重复登录SSH失败超过5次的IP后即对其进行封禁10分钟处理,10分钟后自动解封。
b、编写思路
1、客户端通过ssh登录服务器失败会在/var/log/messages中生成日志,格式如下:
Mar 30 05:46:21 hostname sshd(pam_unix)[29499]: authentication
failure; logname= uid=0 euid=0 tty=ssh ruser=
rhost=ip addressuser=root
其中时间,authentication failure; tty=ssh,rhost=ip address可以作为下一步分析的特征。
2、分析日志。把10分钟内登录验证失败超过5次的IP地址找出来。格式化,格式为:sshd:ip address,并存入/etc/hosts.deny.tmp文件中。
3、禁止这个IP地址在封禁时间内通过SSH登录。方法是把hosts.deny.tmp文件中的内容添加到hosts.deny中,并重新启动SSH服务使封禁生效。
c、Shell脚本
内容如下:
#!/bin/bash
#filename:auto_forbid_ssh.sh
#这段代码在RHEL4下测试通过。
#1、使用awk命令分析10分钟内产生的日志,把ssh登录验证失败超过5次的IP地址找出来并存入hosts.deny.tmp文件中。
awk '
BEGIN {
FS=" ";
TIME_RANGE=600;#封禁时间,600秒。
LOG_FAIL_TIMES=5;#登录失败次数
tstamp_now = systime();#获取当前时间戳
while("tail -1000 /var/log/messages"|getline)
{
#格式化时间格式
gsub(/:/," ",$3);
tstamp_formatStr=strftime("%Y %m",tstamp_now)" "$2"
"$3;
tstamp=mktime(tstamp_formatStr);
tstamp_diff=tstamp_now-tstamp;#获取时间差
# 根据特征分析出符合条件的记录if((t stamp_di ff
<=TIME_RANGE)&&($11~"tty=ssh")&&($6~"authentication")
&&($7~"failure;"))
{
gsub(/rhost=/,"sshd:",$13);
print $13;
}
}
}'|sort|uniq -c |awk '$1>=LOG_FAIL_TIMES{print $2;}
'>/etc/hosts.deny.tmp
#2、把/etc/hosts.deny.bak 和hosts.deny.tmp文件中的内容合并并写入到hosts.deny中。
cat /etc/hosts.deny.bak /etc/hosts.deny.tmp >/etc/
hosts.deny
file_size=`ls -l /etc/hosts.deny.bak | awk '{print $5}
'`
如果生成的hosts.deny文件比hosts.deny.bak文件大,说明程序发现符合条件的入侵IP。这时重启sshd服务即可使封禁立即生效。
ls -l /etc/hosts.deny|awk '$5>$file_size{service sshd
restart}'
rm -f /etc/hosts.deny.tmp
echo "Task is completed!";
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。