APP下载

截断伸向SSH服务的黑手

2017-03-11

网络安全和信息化 2017年12期
关键词:脚本日志命令

为了便于远程管理Linux服务器,管理员一般都会开启SSH连接服务,这样可以很轻松的对Linux服务器进行远控操作。不过,这也给系统的安全带来了一些隐患。虽然SSH采用的是加密连接,使用嗅探工具无法侦测。但是如果Root账户密码设置的比较简单的话,黑客会采取暴力破解的方法来猜测密码,一旦密码被破解,黑客就可以毫不费力的控制服务器。为了防止黑客猜解密码,可以使用相应的安全技术加以防范。这里从屏蔽非法连接的IP的角度出发,来有效狙击黑客的入侵行为。

使用NetFilter规则拦截非法IP

Linux中内置NetFilter防火墙组件,使用IPtables来编写合理的防火墙规则,可保护SSH安全。执行“iptables -A INPUT -p -s xxx.xxx.xxx.xxx -j ACCEPT”命令,可添加一条规则,允许本机IP(此处为“xxx.xxx.xxx.xxx”) 连 接TCP 22端口,因为SSH服务使用该端口。执行“iptables-A INPUT -p TCP -dport 22 -j DROP”命令,添加一条规则,禁止本机外的IP访问SSH服务。上述方法较简单,利用IPTables命令,还可创建白名单,只允许指定的IP连接SSH服务,对其他IP可以限制连接次数,如超过预设值,就对其进行屏蔽。

执行“iptables -N SSH_WHITELIST”,“ iptables-A SSH_WHITELIST -s xxx.xxx.xxx.xxx -m recent--remove --name SSH -j ACCEPT”命令,可以创建白名单,只需允许指定的IP连接SSH服务。执行“iptables-A INPUT -p tcp --dport 22 -m state --state NEW-m recent --set --name SSH”,“iptables -A INPUT-p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST”,“iptables-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update--seconds 60 --hitcount 5--rttl --name SSH -j ULOG--ulog-prefix SSH_brute_force”,“iptables -A INPUT -p tcp --dport 22-m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl--name SSH -j DROP”命令,可实现对白名单中的IP放行,对其他IP来说,如其在60秒内连续连接5次以上,就会被防火墙拦截,同时将其连接信息记录到Linux的日志中,并添加“SSH_brute_force”前缀,便于用户查询。

使用脚本拦截非法IP

使用以上方法的缺点是必须使用固定IP,如果管理员使用的主机IP不是固定的,就比较麻烦。当然,也可以使用指定域名来替代IP,但黑客可能会使用域名劫持来进行非法连接。也可以执行“vim /etc/hosts.allow”命令,对“hosts.allow”文件进行编辑,在其中添加“sshd:xxx.xxx.xxx.xxx”。执行“vim /etc/hosts.deny”命令,添加“sshd:all”一行。这样就实现了只允许管理员的IP可以访问SSH服务,禁止其余IP访问。

实际上,当黑客对SSH服务进行非法连接时,其行为会被系统日志记录下来。在“/var/log”目录下打开“secure”等日志文件,可以看到访问者的IP以及其试图连接的账户名信息。对于频繁尝试连接的来访者,将其IP提取出来,放置到上述“hosts.deny”文件中,即可对其进行屏蔽。当然,手工操作比较繁琐,完全可以使用脚本来实现。

例如,可以编写一个名为 的“sshtables.sh” 的脚本,内容包括“PATH=/sbin:/bin:/usr/sbin:/usr/bin”,“LOGFILE=/var/log/secure”,“KEYWORD='Invalid user'”,“KEYWORD1='Failed password for admin'”,“PERM_LIST=/tmp/bad.user”,“ PERM_LIST2=/tmp/bad.root.pasword”,“LIMIT=3”,“MAIL_TO=root”,“IPT_SAV="$(iptables-save)"”,“grep "$KEYWORD" $LOGFILE| awk '{print $NF}'|cut-d ":" -f 4>$PERM_LIST”,“grep "$KEYWORD1"$LOGFILE | awk '{print$11}'|cut -d ":" -f 4>$PERM_LIST2”,“ BAD_LIST=$( awk -v var=$LIMIT'{a[$i]++}END {for (i in a){if(a[i]>var)print i}}'$PERM_LIST $PERM_LIST2| xargs)”,“do”,“echo"$IPT_SAV" | grep -q "$i-p tcp -m tcp --dport 22-j DROP" || { iptables-I tcp_packets 2 -p tcp-s $i --dport 22 -j DROP}”,“done”等。该脚本其实很简单,主要作用是对和SSH连接相关的日志进行过滤检测,来发现试图破解指定账户(这里为“admin”)密码的连接信息,如果其连续3次输错密码,就视其为非法破解并将其IP提取出来,并使用IPTables编辑防火墙规则,对其进行拦截,禁止其访问SSH服务。

使用Tcp_Wrappers自动拦截非法IP

此外,可以使用“vim /etc/hosts.allow”命令,打开“hosts.allow”文件,在尾部添加“sshd:ALL:spawn(/etc/sshiptables.sh)&:allow”一行,假设将“sshtables.sh”保存在“/etc”目录下。这样,如果系统检测到非法用户尝试连接的次数超过预设值,就禁止其进行连接,对于之外的IP,是允许进行连接的。当然,也可以编写名为“sshdeny.sh”的脚本程序,将日志中的非法用户的IP提取出来,并将其添加到“hosts.deny”文件中,同样可以对其屏蔽。打开网址“http://pan.baidu.com/s/1hse3bIs”,可以查看该脚本的具体内容。

黑客的入侵是动态的,因此也可利用Crontab定时运行,让上述脚本在指定的周期内自动运行。例如执行“crontab -e”命令,打开操作者的Crontab配置文件,在其中添加“0 0 * * * /etc/sshdeny.sh”,就可以在每天零点自动执行“sshdeny.sh”程序。当然,可以自由设定具体执行的时间点。这样的脚本文件还有很多,例如打开网址“http://www.lasamhna.de/misc/sshblock.sh”,可以得到专用的分析日志文件,来拦截非法连接SSH服务IP的脚本。其功能是对Linux日志进行分析,如果发现在60秒内连接的数量超过5次,就将其其添加到“hosts.deny”文件中,经过3600秒才对其解锁。

也可以根据实际情况进行修改,其中的“DONTBLOCK”参数可以设置允许连接的域名或IP,默认为“192.168”。其余的IP都在该脚本的监控之下,将该脚本放置到“/usr/local/bin”目录下,使用“vim /etc/hosts.allow”命令,打开“hosts.allow”文件,在尾部添加“sshd:ALL:spawn (/usr/local/bin/sshblock.sh%a)&”一行,这样,当访问者试图连接SSH服务时,首先会经过Tcp_Wrappers模块的检测,其会调用“hosts.allow”文件,来确定允许访问SSH服务的连接,这样就会自动执行上述“sshblock.sh”脚本,只有经过脚本检测的连接才可以顺利访问。当然,这要求开启了Tcp_Wrappers服务,实际上,Linux都安装并开启了该模块。执行“rpm -qa | grep tcp”命令,可以查看该模块的安装信息。

轻松敲门,自动启停SSH服务

使 用Knock工具,可自动打开SSH端口。将下载 的“knock-0.5-6.i386.rpm”等RPM放置到某个目录中,在其中执行“rpm -ivh*.RPM”命令即可安装。执行“vim /etc/knockd.conf”命令,打开Knock配置文件,在“sequence=”栏中显示需要开放的端口,默认为UDP 2222、TCP 3333、TCP 4444等。这些端口不要在防火墙上屏蔽。可以根据需要对其进行更改,在“tcpflags=”栏中默认值为“syn,ack”,表示客户端需要向服务器回复数据包,为便于使用,可去除“ack”标记。在“cmd_timeout=”栏中显示自动关闭SSH服务的时间,如在敲门后,在该时间内没有执行连接,会自动关闭SSH服务。

如果使用Knock访问这些端口成功,就可自动打开SSH服务。如果在预设时间内未操作,则自动关闭SSH服务。在服务器上执行“knock -D -V”命令,来激活Knock的守护功能。在客户端需要使用“knock.exe”程序进行“敲门”,在CMD窗口中执行“knock -v 服务器的域名。在服务器上会显示接收到了上述敲门动作,并显示已经打开了SSH服务。执行“iptables -vnL”命令,可以看到已经添加了允许访问TCP 22端口的防火墙规则。

猜你喜欢

脚本日志命令
酒驾
只听主人的命令
一名老党员的工作日志
安奇奇与小cool 龙(第二回)
扶贫日志
雅皮的心情日志
移防命令下达后
游学日志
快乐假期
小编的新年愿望