CentOS 7安装Fail2Ban以防止SSH暴力破解 (记录学习)
以Nginx为例,使用Fail2Ban监视Nginx日志,匹配短时间内频繁请求的IP,并使用Firewalld屏蔽这些IP,以达到CC防护的作用。
目录
一、准备工作
-
检查Firewalld防火墙是否启用
# 关闭iptables(如果已安装): service iptables stop # 检查Firewalld状态: firewall-cmd --state # 启动Firewalld: systemctl start firewalld # 设置开机启动: systemctl enable firewalld
-
开放SSH端口(22)事例:
# 放行22端口 如果改了ssh端口自行修改 firewall-cmd --zone=public --add-port=22/tcp --permanent # 重载配置 firewall-cmd --reload #查看已放行端口 firewall-cmd --list-all
二、安装软件
1. 安装EPEL源:
yum install -y epel-release
2. 安装Fail2Ban:
yum install -y fail2ban-all
三、配置
1、只封禁IP
1.1、增加配置
-
编辑
jail.local
文件用来覆盖fail2ban的一些默认规则:vi /etc/fail2ban/jail.local
-
配置以下内容:
[DEFAULT] # IP白名单 白名单中的IP不会屏蔽,可填写多个以(,)分隔 ignoreip = 127.0.0.1/8 ::1 # 封禁时间 单位为秒(s)24小时可以设置成24h bantime = 24h # 在这个时间段内,超过最大重试次数就封禁该操作的IP findtime = 3600 # 最大重试次数 maxretry = 6 # 屏蔽IP所使用的方法,这里使用firewalld屏蔽端口,使用的防火墙规则 banaction = firewallcmd-ipset # 触发规则后的选择行为 action = %(action_)s # 名称,可以随便填写 [sshd] # 需要监听的项,规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则 filter = sshd enabled = true # 需要监听的项 port = 22 action = %(action_)s # 监听的日志路径 logpath = /var/log/secure
防止ssh爆破的方法之一就是修改22默认端口,之前龙哥有写过怎么修改了,大家可以回去查阅一下
上面的配置意思是如果同一个IP,在一小时内,如果连续超过6次错误,则使用Firewalld将他IP ban了。
我们输入查看被ban的IP
fail2ban-client status sshd
1.2、启动程序
# 启动
systemctl start fail2ban
# 开机自启
systemctl enable fail2ban
1.3、查看日志
tail -f /var/log/fail2ban.log
1.4、查看黑名单
-
执行命令:
fail2ban-client status sshd
-
显示内容如下:
Status for the jail: sshd |- Filter | |- Currently failed: 4 | |- Total failed: 18 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 2 |- Total banned: 2 `- Banned IP list: 121.4.236.90 45.164.128.3
解释:
|- 暂时封禁的IP数:2
|- 总共封禁的IP数:2
`- 黑名单列表:121.4.236.90 45.164.128.3
2、设置黑名单
#添加黑名单:
fail2ban-client set sshd banip IP_ADDRESS
#删除黑名单:
fail2ban-client set sshd unbanip IP_ADDRESS
3、封禁IP+发送邮箱
3.1、安装邮箱
yum install -y mailx
3.2、配置Mailx
-
编辑
/etc/mail.rc
文件(Debian系为/etc/s-nail.rc
):vim /etc/mail.rc
-
在文件末尾增加以下配置:
# 发件人邮箱 set from=xxxxx@qq.com # 发件人邮箱的SMTP地址 set smtp=smtps://smtp.qq.com:465 # 发件人邮箱登陆账号 set smtp-auth-user=xxxxx@qq.com # 发件人邮箱的授权码 set smtp-auth-password=e8765ds78c23 # 认证方式 set smtp-auth=login # 忽略证书警告 set ssl-verify=ignore # 证书所在目录 set nss-config-dir=/etc/pki/nssdb
-
测试:
echo '邮件内容' | mail -v -s '邮件标题' 收件人邮箱@qq.com
多个收件人请用逗号分隔。刚刚发送的邮件将会出现在收件箱或垃圾箱中。
3.3、配置Fail2Ban
-
编辑
jail.local
文件:vi /etc/fail2ban/jail.local
-
配置以下内容:
[DEFAULT] ignoreip = 127.0.0.1/8 ::1 bantime = 24h findtime = 1h maxretry = 3 banaction = firewallcmd-ipset # 邮件发送软件 mta = mail # 发件人地址 sender = xxxxx@qq.com # 收件人地址 destemail = yyyyy@qq.com # 封禁IP+邮件通知 action = %(action_mw)s [sshd] filter = sshd enabled = true port = 22 logpath = /var/log/secure
3.4、配置警告内容
-
编辑
/etc/fail2ban/action.d/mail-whois.conf
文件:vim /etc/fail2ban/action.d/mail-whois.conf
-
配置以下内容:
[INCLUDES] before = mail-whois-common.conf [Definition] actionban = printf "警告!!!\n 被攻击机器名:`uname -n` \n 被攻击机器IP:`/bin/curl ifconfig.co` \n 攻击服务:<name> \n 时间范围:<findtime> 内 \n 攻击次数:<failures> 次 \n 攻击者IP:<ip> \n 攻击方式:暴力破解,尝试弱口令。\n 处理方式:已将<ip>加入防火墙黑名单,封禁时间为 <bantime> 秒。\n\n\t ——来自fail2ban邮箱\n " | /bin/mailx -s "[<name>]服务器遭到<ip>暴力攻击" <dest> [Init] name = default dest = root
3.5、重载配置
fail2ban-client reload
4、自定义拦截规则
4.1、防止CC攻击
以Nginx为例,使用Fail2Ban监视Nginx日志,匹配短时间内频繁请求的IP,并使用Firewalld屏蔽这些IP,以达到CC防护的作用。
4.2、增加一个nginx日志匹配规则
-
编辑
/etc/fail2ban/filter.d/nginx-cc.conf
文件:vi /etc/fail2ban/filter.d/nginx-cc.conf # 2. 配置以下内容: [Definition] failregex = -.*- .*HTTP/1.* .* .*$failregex = ^<HOST>.*".*HTTP.*" 444 ignoreregex =
-
继续修改和编辑
/etc/fail2ban/jail.local
文件:vi /etc/fail2ban/jail.local
-
配置以下内容:
[nginx-cc] enabled = true filter = nginx-cc port = http,https logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600 action = firewallcmd-ipset
上面的配置意思是如果在60s内,同一IP达到100次请求,则将其IP ban 1小时
以上只是龙哥测试用,具体你们按自己的实际情况修改。
logpath为nginx日志路径。
4.3、重载配置
fail2ban-client reload
以上是在CentOS 7上安装和配置Fail2Ban以防止SSH暴力破解的步骤。完成这些配置后,系统会自动监视SSH登录情况,并在检测到异常活动时封禁相应的IP地址。还可以根据需要添加自定义的拦截规则,如防止CC攻击。
4.4、查看Fail2Ban状态
要查看Fail2Ban的当前状态和活动的监视规则,可以使用以下命令:
fail2ban-client status
该命令将显示当前封禁的IP地址、活动的Jail(监狱)以及每个Jail中的封禁次数和封禁时间。
4.5、检测和测试规则
要验证Fail2Ban是否能够正确匹配和封禁违规行为,可以使用以下命令进行模拟测试:
fail2ban-client set JAILNAME banip IP_ADDRESS
将JAILNAME
替换为目标Jail的名称,IP_ADDRESS
替换为要模拟封禁的IP地址。这将模拟一个违规行为,并将该IP地址加入封禁列表。
为了解除对模拟IP地址的封禁,可以使用以下命令:
fail2ban-client set JAILNAME unbanip IP_ADDRESS
同样,将JAILNAME
替换为目标Jail的名称,IP_ADDRESS
替换为要解除封禁的IP地址。
请注意,进行模拟测试时应小心,以避免意外封禁真实的合法用户。
四、设置防止wordpress爆破(毕竟目前个人小站主要用这个)
如果您经常分析日志,您可能会发现有大量机器人在扫描WordPress登录页面wp-login.php。尽管他们可能没有成功,但为了避免潜在风险,将这些IP地址封禁可能是明智的。
首先,您需要创建一个新的Nginx日志匹配规则。请打开/etc/fail2ban/filter.d/wordpress.conf
文件,并将以下内容填写进去:
[Definition]
failregex = ^ -.* /wp-login.php.* HTTP/1\.."
ignoreregex =
接下来,在jail.local
文件中追加以下内容:
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log
完成以上配置后,请记得执行systemctl restart fail2ban
命令以重启Fail2Ban使其生效。
以下是一些常用的命令:
- 启动Fail2Ban:
systemctl start fail2ban
- 停止Fail2Ban:
systemctl stop fail2ban
- 设置Fail2Ban开机启动:
systemctl enable fail2ban
- 检查被封禁的IP地址(例如,对于上面的[wordpress] Jail):
fail2ban-client status sshd
- 解除封禁的IP地址:
fail2ban-client set sshd delignoreip 192.168.111.111
- 查看Fail2Ban日志:
tail /var/log/fail2ban.log
总结:Fail2Ban已经预设了许多匹配规则,这些规则位于filter.d
目录下,并包含了常见的SSH、FTP、Nginx和Apache等日志匹配。
如果这些规则都无法满足您的需求,您还可以自行创建规则来匹配异常的IP地址。
更多规则详情可以查看我另外一篇文章接上一篇Centos下fail2ban 的各种配置规则详解 包含apache/nginx/mysql防御规则
使用Fail2Ban结合Firewalld来阻止恶意IP地址是提高服务器安全性的有效方法。
喜欢龙哥的作品记得三连哦,你的支持是我更新的动力
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)