一、背景
开放到公网的主机无时无刻不在遭受攻击,其中ssh暴力破解频率最高,会有无数机器不分日夜地搜索公网上的猎物,然后进行弱密码尝试
如果你的公网机器恰巧设的弱密码,估计刚装上系统,没过几小时别人就进来动手脚了
当然我们设置的密码如果够强,8位以上混合大小写+数字,是不会被爆破出来的。攻击者为了效率着想,广撒网,一般只会对你进行三四千次尝试,不过攻击的人会比较多,平均下来你每天也会被攻击8000次这样
如何查看自己有没有被攻击呢?看ssh日志即可
cat /var/log/secure|grep \'Failed password\'|wc -l
直接看到你被攻击过多少次,因为历史日志会被自动备份,所以这是你近几天的量
find /var/log -name \'secure*\'|xargs ls -l
查看所有ssh日志文件信息
cat /var/log/secure|grep \'Failed password\'|tail -10
查看最近10条被攻击记录
一般的防御方法:
-
密码设得超强——别人爆破我无所谓,觉得日志文件太大看着不舒服再关闭日志、调整等级
-
更改端口号,其实无效,攻击者会端口扫描
-
禁止root用户远程登录,增大破解难度。仍要超级管理员登录可以添加一个和root一样权限的用户,别去改root的用户名,系统软件会出问题
-
自己写脚本,检查/var/log/secure 内登录失败次数超过某个阈值的ip并将它添加到/etc/hosts.deny,检查secure的频率要够高,秒级别的,不然别人都爆破完了脚本还没反应过来
-
写脚本难度大可以用别人写的工具,这里推荐fail2ban,他除了能防护ssh,还能防护web服务免于目录爆破,GitHub项目地址
二、fail2ban原理及安装
fail2ban使用python编写,原理简单理解为扫描日志,发现危害行为,然后去配置防火墙规则,把危险ip给ban掉
官方手册指出,fail2ban扫描日志频率是1s
以centos7为例,默认安装了python2.7,无需手动安装。默认防火墙是firewalld,所以安装的版本应该是fail2ban-firewalld。如果你防火墙是iptables,则安装fail2ban即可
yum -y install fail2ban-firewalld
三、配置
使用默认配置的话很简单
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localvi /etc/fail2ban/jail.local# 显示行号:set nu# 把23、24行的注释给去掉,保存退出# [sshdad8]# enabled = true
到这里就能启动了,如果想修改配置,这里提供一些参考
配置文件虽然有近千行,但是大部分是注释,而用于ssh的就几行
# [DEFAULT] 配置大概从87行开始#ignoreself = true#ignoreip = 127.0.0.1/8 ::1ignorecommand =# \"bantime\" is the number of seconds that a host is banned.bantime = 10m# A host is banned if it has generated \"maxretry\" during the last \"findtime \"# seconds.findtime = 10m# \"maxretry\" is the number of failures before a host get banned.maxretry = 5# \"maxmatches\" is the number of matches stored in ticket (resolvable via ta g <matches> in actions).maxmatches = %(maxretry)s# [sshd] 在280行port = sshlogpath = %(sshd_log)sbackend = %(sshd_backend)s
重要的参数在[DEFAULT]中,意思是扫描日志文件的最后findtime(分钟),发现有maxretry次登录失败记录,则把这个ip拉黑bantime(分钟),时间单位可以是 s、m、h
ignoreip 是白名单,[sshd] 中可以改端口,但没必要
四、启动和状态查看
启动、关闭、重启、状态、开机自启:
systemctl start|stop|restart|status|enable fail2ban.service
查看服务具体信息:
# 查看fail2ban正守护着哪些服务fail2ban-client status# 查看ssh黑名单fail2ban-client status sshd
测试规则是否生效:
拿另一台机器
ssh root@your_ip
,密码错误会提示 Permission denied,ip被ban提示 Connection refused。ssh密码错误会再让你输两次,这其中恰好被ban的话会卡住,ctrl+c即可