当前位置 博文首页 > 云牧青:安全干货,使用fail2ban避免ssh被暴力破解

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

    作者:云牧青 时间:2021-06-11 18:25

    一、背景 二、fail2ban原理及安装 fail2ban使用python编写,原理简单理解为扫描日志,发现危害行为,然后去配置防火墙规则,把危险ip给ban掉,官方手册指出,fail2ban扫描日志频率是1s。以centos7为例,默认安装了python2.7,无需手动安装。默认防火墙是firewalld,所以安装的版本应该是fail2ban-firewalld。如果你防火墙是iptables,则安装fail2ban即可 三、配置 扫描日志文件的最后findtime(分钟),发现有maxretry次登录失败记录,则把这个ip拉黑bantime(分钟)四、启动和状态查看 fail2ban-client status sshd



    一、背景

    开放到公网的主机无时无刻不在遭受攻击,其中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.local
    vi /etc/fail2ban/jail.local
    
    # 显示行号
    :set nu
    # 把23、24行的注释给去掉,保存退出
    # [sshd]
    # enabled = true
    

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

    配置文件虽然有近千行,但是大部分是注释,而用于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  = 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    = 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即可



    bk