人在江湖飘,哪能不挨刀,每当我开一台 vps 的 SSH 的时候总是心慌慌,毕竟一旦被人突破了 SSH,我的这台 VPS 算是废了,这还是小事,关键是里面的数据和代码和 key 啥的被人盗了,那事情就严重了。所以,后面我就尝试找了一些监控工具来记录一下 VPS 的访问记录和命令记录,一段时间之后发现只监控还不行,得做一些措施来反制一番,于是乎就找到了 fail2ban,在本文中我就介绍一下如何使用 fail2ban 来控制 SSH 的访问,后续我会分享一下关于我在 VPS 上进行 SSH 安全的一些搭配。
因为我在几乎所有场景下使用的是 CentOS(曾经用过 ubuntu,后面弃用了,迁移应用的时候好心累 -。-),所以这里都是以 CentOS 为目标系统进行介绍的,第一步肯定是安装了:
[root@liqiang.io]# yum install -y epel-release
[root@liqiang.io]# yum install -y fail2ban
epel 这个 repo 上有 fail2ban,所以简单起见就直接先安装 epel 了。安装完之后可以看一下 fail2ban 的状态,应该是没有起来的,同时也没有开启开启自启动,所以这里就顺便开起来了:
[root@liqiang.io]# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:fail2ban(1)
[root@liqiang.io]# systemctl enable fail2ban #设置开机自启动
这里还不能启动 fail2ban,因为我们还没有进行设置,下面就开始简单设置一下,在设置的时候,我们习惯性还是会去找 /etc/fail2ban/fail2ban.conf
,但是,打开这个文件看一下会发现这一段:
[root@liqiang.io]# head -10 /etc/fail2ban/fail2ban.conf
# Fail2Ban main configuration file
#
# Comments: use '#' for comment lines and ';' (following a space) for inline comments
#
# Changes: in most of the cases you should not modify this
# file, but provide customizations in fail2ban.local file, e.g.:
#
# [Definition]
# loglevel = DEBUG
这里 fail2ban 推荐了不要直接修改这个文件,而是自己创建一下 /etc/fail2ban/fail2ban.local
的配置作为自定义项,所以,我们应该配置的文件是:/etc/fail2ban/fail2ban.local
,下面我就简单配置一下,我的配置的目标是:
在一分钟内如果错误 4 次,那么就禁止该用户登录 5 分钟
这里稍微介绍一下为什么是 4 次,因为我平时有个默认的登录脚本,它是会重试 3 次,所以我给多了一次试错机会自己,方便恢复,下面来看一下配置内容,在配置的时候有两个配置需要设置,分别是 /etc/fail2ban/fail2ban.local
和 /etc/fail2ban/jail.local
:
[root@liqiang.io]# cat /etc/fail2ban/fail2ban.local
[Definition]
loglevel = DEBUG
logtarget = /var/log/fail2ban.log
socket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400
这里是配置一下 fail2ban 的主设置,然后关于 SSH 的配置需要在这里配置:
[root@liqiang.io]# cat /etc/fail2ban/jail.local
因为这个配置偏大,所以我就把修改点列出来好了:
- 修改了 ignoreip,这个可以确保在一些意外情况我可以有机会上去拯救一番
ignoreip = 127.0.0.1/8 192.168.57.24
,这个192.168.57.24
是我的内网 IP,这样就可以通过内网的其他机器来拯救
设置禁用时间规则,就在
ignoreip
下面设置:# External command that will take an tagged arguments to ignore, e.g. <ip>,
# and return true if the IP is to be ignored. False otherwise.
#
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" is the number of seconds that a host is banned.
bantime = 600
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600
# "maxretry" is the number of failures before a host get banned.
maxretry = 5
设置 SSH 的配置
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
然后就可以了,重启一下 fail2ban
[root@liqiang.io]# systemctl restart fail2ban
现在尝试一下是不是生效了,请特别注意,一定要设置好 ignoreip,因为你真的会被拒绝登录的!
小结
本文介绍了 fail2ban 这款软件以及它的简单使用,但是,虽然本文介绍的是如何防止 SSH 爆破,但是,fail2ban 同样可以用于其他入口应用,例如常见的 Nginx/Apache 提供的 HTTP 应用,这些都可以自行去探索一番。同时,也需要了解到 fail2ban 的实现原理是通过本地的 iptables drop 数据包的形式实现,所以只能防止应用级别的 DOS,并不能防止带宽被打满的情况。