安全干货,使用fail2ban避免ssh被暴力破解



一、背景

开放到公网的主机无时无刻不在遭受攻击,其中ssh暴力破解频率最高,会有无数机器不分日夜地搜索公网上的猎物,然后进行弱密码尝试

如果你的公网机器恰巧设的弱密码,估计刚装上系统,没过几小时别人就进来动手脚了

当然我们设置的密码如果够强,8位以上混合大小写+数字,是不会被爆破出来的。攻击者为了效率着想,广撒网,一般只会对你进行三四千次尝试,不过攻击的人会比较多,平均下来你每天也会被攻击8000次这样

如何查看自己有没有被攻击呢?看ssh日志即可

grep 'Failed password' /var/log/secure -c 直接看到你被攻击过多少次,因为历史日志会被自动备份,所以这是你近几天的量

find /var/log -name 'secure*'|xargs ls -l 查看所有ssh日志文件信息

grep 'Failed password' /var/log/secure|tail -10 查看最近10条被攻击记录

其他日志文件:有关当前登录用户的信息记录在文件utmp中;登录进入和退出纪录在文件wtmp中;最后一次登录消息在lastlog中。三者都是二进制文件,无法直接查看,需要用命令查看

who # 显示所有当前登录的shell,包括用户、时间和IP
users # 显示所有当前登录的用户
who /var/log/wtmp # 显示历史登录记录

一般的防御方法:

  • 密码设得超强——别人爆破我无所谓,觉得日志文件太大看着不舒服再关闭日志、调整等级

  • 更改端口号,其实无效,攻击者会端口扫描

  • 禁止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

Rocky Linux:注意会安装python3.6并更改/usr/bin下python3的链接

dnf -y install epel-release
dnf -y install fail2ban-firewalld



三、配置

使用默认配置的话很简单

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local

# 显示行号
:set nu

# 把23、24行的注释给去掉,保存退出
# [sshd]
# enabled = true

2021-12-22 更新: 不要像上面这样修改23、24行,会报错。正确做法是在/etc/fail2ban/jail.d中建文件sshd.local vi /etc/fail2ban/jail.d/sshd.local,配置为

[sshd]
enabled = true

# Override the default global configuration
# for specific jail sshd
bantime = 1d
findtime = 1h
maxretry = 2

到这里就能启动了,如果想修改配置,这里提供一些参考

配置文件虽然有近千行,但是大部分是注释,而用于ssh的就几行

# [DEFAULT] 配置大概从87行开始
#ignoreself = true
#ignoreip = 127.0.0.1/8 ::1
ignorecommand =
# "bantime" is the number of seconds that a host is banned.
bantime  = 24h
# A host is banned if it has generated "maxretry" during the last "findtime        "
# seconds.
findtime  = 1h
# "maxretry" is the number of failures before a host get banned.
maxretry = 2
# "maxmatches" is the number of matches stored in ticket (resolvable via ta        g <matches> in actions).
maxmatches = %(maxretry)s

# [sshd] 在280行
port    = ssh
logpath = %(sshd_log)s
backend = %(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即可

使用fail2ban后,每天被尝试密码的次数能降到100条以内。



posted @ 2021-06-11 17:18  云牧青  阅读(832)  评论(0编辑  收藏  举报