release 20140123 创建文档,发布51cto
release 20140409 添加对IP地址过滤,防止sshd: unknown
现在类unix系统都使用ssh协议进行服务器管理工作,因为攻击都喜欢通过暴力破解(一般利用密码字典),直接获得服务器权限。因此为了服务器安全,我们必须做好最基本的访问控制工作。一般修改ssh服务器的参数、设置复杂口令、非对称密钥登录访问、堡垒机之类的吧,都能有效阻击攻击者取得服务器权限。可是以上措施可以让攻击者做不成功某事,可是攻击者一直不停尝试,我们需要禁止他进行ssh登录连接,也就是把异常连接SSH服务器IP封掉了。
以下有两种措施:
1.fail2ban服务,调用iptables短暂性封锁IP
2.编写脚本,周期调用,通过tcp wrappers封锁IP
-----------------------------------------------------
fail2ban
-----------------------------------------------------
fail2ban作为一个守护进程存在,主要是能周期地扫描/var/log/secure,再调用iptables去进行流量过滤防御,会短暂性封锁IP。已经用了半年,感觉一般,服务经常罢工。
centos 6 平台使用 epel-release-6-8.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm 安装软件仓库
yum install fail2ban 顺便会安装些依赖软件
3.软件介绍
failures. It updates firewall rules to reject the IP address.
4. 内容介绍
drwxr-xr-x 2 root root 4096 Aug 19 19:50 action.d 根据匹配内容,进行操作调用
-rw-r--r-- 1 root root 859 Aug 19 19:50 fail2ban.conf
#fail2ban.conf 守护进程配置文件,一般只是修改下fail2ban日志位置,logtarget = /var/log/fail2ban.log
drwxr-xr-x 2 root root 4096 Aug 19 19:50 filter.d 匹配内容
-rw-r--r-- 1 root root 6517 Aug 19 19:51 jail.conf
#工作内容配置文件,里面有很多定义选项,常用iptables。还有很多访问控制里面定义
5.服务器启动
service iptables restart #习惯重启下iptables
service fail2ban restart #fail2ban依赖iptables,必须跟在其后启动,而且还是restart那种操作,否则不生效
6. 平时可以看下/var/log/fail2ban.log日志,看看最近阻挡情况。
fail2ban不单针对ssh服务器,还提供www,mail等服务器控制,用途广泛
另外提供第三方接口,可以定义filter策略,action操作,反正很灵活
缺点是经常罢工假死,这是我的使用体验
由于是短暂性封锁IP,如果某IP连接攻击,就变成封了开,开了封了。
###############################################
-----------------------------------------------------
脚本dropssh
-----------------------------------------------------
有台服务器的YUM已经不能安装文件,不能编译,所以通过脚本来实现防护。
这是抄写余洪春大师的安全防范脚本,我自己修改点内容
#!/bin/bash #filename dropssh.sh #time: 2013-12-10 创建文件 #time: 2014-04-04 添加对IP地址过滤,防止sshd: unknown #Deny SHELL Script #logrotate -vf /etc/logrotate.conf #*/30 * * * * root bash /root/bin/dropssh.sh count=10 srcfile=/var/log/secure dstfile=/etc/hosts.deny awk -v ac=$count '/Failed/{a[$(NF-3)]++}END{for(i in a){if(a[i]>ac)printf "%s %s\n",a[i],i}}' $srcfile | sort -rn > /tmp/dropssh.txt iplist=$(awk -v ac=$count '/Failed/{a[$(NF-3)]++}END{for(i in a){if(a[i]>ac)printf "%s\n",i}}' $srcfile) for ip in $iplist do echo $ip | grep -q '^[^0-9]' && continue grep $ip $dstfile > /dev/null if [ $? -gt 0 ];then echo "sshd:$ip" >> $dstfile fi done
这个服务器定时扫描/var/log/secure文件,找到一定次数登录失败的的IP,把它写入到/etc/hosts.deny文件,禁止这些IP进行ssh访问。另外,有次开发登录某台服务器,反正他就是当时在/var/log/secure日志失败记超过阀值,服务器禁止公司内部ssh访问。
第一,找到公司出口IP;
第二,去/etc/hosts.deny把这个IP相关记录清掉;
第三,使用logrotate -fv /etc/logrotate.conf,刷新轮转日志文件,让脚本读取新的日志
第四,这个脚本比较笨,它是读取/var/log/secure文件内的失败次数,并不是读取一段时间内次数的