人在江湖飘,哪能不挨刀,每当我开一台 vps 的 SSH 的时候总是心慌慌,毕竟一旦被人突破了 SSH,我的这台 VPS 算是废了,这还是小事,关键是里面的数据和代码和 key 啥的被人盗了,那事情就严重了。所以,后面我就尝试找了一些监控工具来记录一下 VPS 的访问记录和命令记录,一段时间之后发现只监控还不行,得做一些措施来反制一番,于是乎就找到了 fail2ban,在本文中我就介绍一下如何使用 fail2ban 来控制 SSH 的访问,后续我会分享一下关于我在 VPS 上进行 SSH 安全的一些搭配。

因为我在几乎所有场景下使用的是 CentOS(曾经用过 ubuntu,后面弃用了,迁移应用的时候好心累 -。-),所以这里都是以 CentOS 为目标系统进行介绍的,第一步肯定是安装了:

  1. [root@liqiang.io]# yum install -y epel-release
  2. [root@liqiang.io]# yum install -y fail2ban

epel 这个 repo 上有 fail2ban,所以简单起见就直接先安装 epel 了。安装完之后可以看一下 fail2ban 的状态,应该是没有起来的,同时也没有开启开启自启动,所以这里就顺便开起来了:

  1. [root@liqiang.io]# systemctl status fail2ban
  2. fail2ban.service - Fail2Ban Service
  3. Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
  4. Active: inactive (dead)
  5. Docs: man:fail2ban(1)
  6. [root@liqiang.io]# systemctl enable fail2ban #设置开机自启动

这里还不能启动 fail2ban,因为我们还没有进行设置,下面就开始简单设置一下,在设置的时候,我们习惯性还是会去找 /etc/fail2ban/fail2ban.conf,但是,打开这个文件看一下会发现这一段:

  1. [root@liqiang.io]# head -10 /etc/fail2ban/fail2ban.conf
  2. # Fail2Ban main configuration file
  3. #
  4. # Comments: use '#' for comment lines and ';' (following a space) for inline comments
  5. #
  6. # Changes: in most of the cases you should not modify this
  7. # file, but provide customizations in fail2ban.local file, e.g.:
  8. #
  9. # [Definition]
  10. # loglevel = DEBUG

这里 fail2ban 推荐了不要直接修改这个文件,而是自己创建一下 /etc/fail2ban/fail2ban.local 的配置作为自定义项,所以,我们应该配置的文件是:/etc/fail2ban/fail2ban.local,下面我就简单配置一下,我的配置的目标是:

在一分钟内如果错误 4 次,那么就禁止该用户登录 5 分钟

这里稍微介绍一下为什么是 4 次,因为我平时有个默认的登录脚本,它是会重试 3 次,所以我给多了一次试错机会自己,方便恢复,下面来看一下配置内容,在配置的时候有两个配置需要设置,分别是 /etc/fail2ban/fail2ban.local/etc/fail2ban/jail.local

  1. [root@liqiang.io]# cat /etc/fail2ban/fail2ban.local
  2. [Definition]
  3. loglevel = DEBUG
  4. logtarget = /var/log/fail2ban.log
  5. socket = /var/run/fail2ban/fail2ban.sock
  6. pidfile = /var/run/fail2ban/fail2ban.pid
  7. dbfile = /var/lib/fail2ban/fail2ban.sqlite3
  8. dbpurgeage = 86400

这里是配置一下 fail2ban 的主设置,然后关于 SSH 的配置需要在这里配置:

  1. [root@liqiang.io]# cat /etc/fail2ban/jail.local

因为这个配置偏大,所以我就把修改点列出来好了:

然后就可以了,重启一下 fail2ban

  1. [root@liqiang.io]# systemctl restart fail2ban

现在尝试一下是不是生效了,请特别注意,一定要设置好 ignoreip,因为你真的会被拒绝登录的!

小结

本文介绍了 fail2ban 这款软件以及它的简单使用,但是,虽然本文介绍的是如何防止 SSH 爆破,但是,fail2ban 同样可以用于其他入口应用,例如常见的 Nginx/Apache 提供的 HTTP 应用,这些都可以自行去探索一番。同时,也需要了解到 fail2ban 的实现原理是通过本地的 iptables drop 数据包的形式实现,所以只能防止应用级别的 DOS,并不能防止带宽被打满的情况。

Reference