技术背景
由于Linux系统的天然优势,我们很多项目的服务都使用了Linux,但同时也会经常遇到一些安全隐患。比如SSH爆破行为,即被人利用SSH远程链接,恶意尝试我们系统的账号密码,进而进行服务入侵行为。为此本文提供一种防止SSH爆破行为的方案及技术- fail2ban
fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作。网上大部分教程都是关于fail2ban+iptables组合,考虑到CentOS 7已经自带Firewalld,所以这里我们也可以利用fail2ban+Firewalld来防SSH爆破。
环境要求
1、检查Firewalld是否启用
由于使用fairewalld防火墙进行配置,所以如果您已经安装iptables建议先关闭,以免各种BUG
关闭命令: service iptables stop
# 查看Firewalld状态
firewall-cmd --state
# 启动firewalld
systemctl start firewalld
# 设置开机启动
systemctl enable firewalld.service
启动成功后,默认防火墙会限制所有接口的访问,所以需要单独解开限制
添加放行端口示例:
# 放行80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 重载配置
firewall-cmd --reload
# 查看已放行端口
firewall-cmd --zone=public --list-ports
2、安装fail2ban
# CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban
安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到。
配置
根据官方推荐,新建jail.local来覆盖fail2ban的一些默认规则,文件放在与jail.conf的同一目录就行。
# 新建文件
cd /etc/fail2ban
touch jail.local
# 编辑配置内容
vim jail.local
# 默认配置
[DEFAULT]
# IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
ignoreip=127.0.0.1/8
# 屏蔽时间,单位为秒(s)
bantime=3600
# 时间范围
findtime=600
# 最大次数
maxretry=3
# 屏蔽IP所使用的方法,下边面使用firewalld屏蔽端口
banaction=firewallcmd-ipset
# 默认就好
action=%(aciton_mw)s
# 新建规则名称
[sshd]
# 是否启动该规则
enabled=true
# 规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
filter=sshd
# 对应的端口
port=22
# 需要监视的日志路径
logpath=/var/log/secure
上述配置内容表示:如果同一个IP,在10分钟内,如果连续超过3次错误,则使用Firewalld将他IP ban了。
启动
#启动
systemctl start fail2ban
若此前fail2ban已是启动状态,则需要重启来使配置生效
# 重新启动
systemctl restart fail2ban
到此,fail2ban的配置已经完成,下面就可以在其他机子上利用ssh登陆此服务进行检测了。
常用命令总结
#启动
systemctl start fail2ban
#停止
systemctl stop fail2ban
#开机启动
systemctl enable fail2ban
#查看被ban IP,其中sshd为名称,比如上面的[wordpress]
fail2ban-client status sshd
#删除被ban IP
fail2ban-client set sshd delignoreip 192.168.111.111
或
fail2ban-client set ssh-iptables unbanip 192.168.111.111
#查看日志
tail /var/log/fail2ban.log