首页 > 系统相关 >基于Fail2ban及iptables的SSH端口爆破防御方案

基于Fail2ban及iptables的SSH端口爆破防御方案

时间:2024-07-15 13:57:29浏览次数:22  
标签:iptables sshd log IP Fail2ban fail2ban 日志 SSH

君衍.

一、本篇介绍

本文目的: 由于本人测试环境在公网上搭建完成,因此收到了很多关于SSH默认22端口的暴力破解攻击。记录关于SSH默认端口的防御思路及维护,比如:更改SSH默认端口、对SSH产生的日志文件进行审计、使用iptables或者别的防火墙比如ufw对爆破IP进行封禁、安装Fail2ban来实现对SSH端口登录策略防护、甚至更改默认端口后,使用蜜罐来伪造22端口迷惑部分技术不成熟的黑客。


上图可以看到,92.118.39.14对SSH端口进行了持续爆破,所以,在公网环境下,还是有必要对SSH端口进行防御。
登录方式为密码登录,不想使用密钥登录的话,可以采取以下措施进行SSH端口防护,当然依旧存在安全风险;建议是直接使用密钥登录,安全风险更低。

二、Fail2ban

1、简介

Fail2Ban 是一款入侵防御软件,旨在保护计算机系统免受恶意攻击和暴力破解。它通过监视系统日志文件,检测到多次失败的登录尝试、恶意行为或其他不寻常活动,然后采取预先配置的措施来应对这些威胁,比如暂时封禁攻击者的 IP 地址。它是用 Python 编程语言编写的。Fail2Ban 基于auth 日志文件工作,默认情况下它会扫描所有 auth 日志文件,如 /var/log/auth.log等,并禁止带有恶意标志的IP,比如密码失败太多,寻找漏洞等等标志。
通常,Fail2Ban 用于更新防火墙规则,用于在指定的时间内拒绝 IP 地址。 它也会发送邮件通知。Fail2Ban 为各种服务提供了许多过滤器,如ssh、apache、nginx、squid、named、mysql、nagios等。Fail2Ban 能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险。

2、工作方式

  1. 监视日志文件:Fail2ban 会监视指定的日志文件,例如 SSH、HTTP、FTP 等服务的日志文件。
  2. 匹配规则:Fail2ban 会根据用户定义的规则(也称为“过滤器”)对日志文件进行匹配。规则通常基于正则表达式,以识别恶意行为,例如登录失败尝试、恶意请求等。
  3. 触发响应:当匹配到规则时,Fail2ban 会触发定义的响应操作,例如将攻击者的 IP 地址添加到防火墙规则中以阻止其访问,或向管理员发送电子邮件报警。
  4. 自动解封:Fail2ban 还提供了自动解封功能,可以在一段时间后自动解封被阻止的 IP 地址,以避免误阻止合法用户。

3、优缺点

优点:

  • 自动化阻止恶意行为,减轻管理员的工作负担。
  • 可以根据用户定义的规则进行灵活配置。
  • 支持自动解封功能,避免误阻止合法用户。
  • 可以与其他安全工具(例如防火墙)集成使用,提高安全性。

缺点:

  • 对于一些高级的攻击行为可能无法有效防御。
  • 在某些情况下可能会误阻止合法用户,例如当多个用户共享同一 IP 地址时。
  • 需要一定的配置和管理工作,以保证其有效性和安全性。

4、工作原理

可以通过监控日志文件(例如 /var/log/auth.log)来帮助保护服务器免受暴力攻击。该软件可以检测到多次登录系统的失败尝试,然后在一定时间内自动禁止违规 IP 地址。Fail2ban 可以执行各种操作,包括更新 Iptable 防火墙规则、将 IP 地址添加到 TCP Wrapper 的 hosts.deny表、发送电子邮件通知以及执行任何用户定义的操作。

5、目录结构

/etc/fail2ban/
├── action.d # 各种动作,默认自带很多常用的
│    ├── dummy.conf
│    ├── hostsdeny.conf
│    ├── iptables.conf
│    ├── mail-whois.conf    
│    ├── mail.conf
│    ├── shorewall.conf
│    └── xxxxx.conf
│    .......
├── fail2ban.conf  # 默认缺省配置
├── fail2ban.d # 启动目录
├── filter.d # 各种过滤器,默认自带很多常用的
│    ├── apache-auth.conf
│    ├── apache-noscript.conf
│    ├── couriersmtp.conf
│    ├── postfix.conf
│    ├── proftpd.conf
│    ├── qmail.conf
│    ├── sasl.conf
│    ├── sshd.conf            
│    └── xxxxx.conf
│    .......
├── jail.conf # 默认监视配置
└─  jail.d
     └── defaults-debian.conf           ## SSH 相关配置

6、功能特点

  • 监视日志文件:Fail2Ban 主要通过监视系统的日志文件来检测潜在的安全问题。它可以监视 SSH、FTP、SMTP 等服务的日志文件,并分析其中的登录尝试、错误信息等。
  • 基于规则的匹配:Fail2Ban 使用基于正则表达式的规则来匹配日志文件中的事件。通过配置适当的规则,可以识别恶意行为,如暴力破解密码、拒绝服务攻击等。
  • 自动封禁:一旦 Fail2Ban 检测到恶意行为,例如多次失败的登录尝试,它会自动封禁攻击者的 IP 地址。封禁可以是暂时的,也可以是永久的,具体取决于配置。
  • 灵活的配置:Fail2Ban 的配置非常灵活,可以根据特定的需求和威胁模式进行定制。用户可以配置规则、封禁时长、白名单等参数,以适应不同的环境和安全策略。
  • 日志和报告:Fail2Ban 提供了详细的日志和报告,记录了检测到的事件、封禁的 IP 地址以及采取的措施。这些日志和报告对于审计和调查安全事件非常有用。

三、更改默认SSH端口

1、更改配置文件

需要更改SSH端口,我们需要先找到SSH的配置文件,默认在/etc/ssh/sshd_config

vim /etc/ssh/sshd_config


修改为:

这里将注释符去掉,将端口改为5454,这里我随便写的端口,然后退出保存。

2、重启服务

CentOS重启SSH命令:

systemctl retsart sshd

Ubuntu重启SSH命令:

service ssh restart

重启之后,即可更改成功,可以使用netstat -ntlp查看下。

四、SSH日志审计

SSH的日志在/var/log/auth.log路径下,同时我们需要分析字段,然后构建查询语句来查看访问排行成功与失败的IP地址。

Jul  8 14:39:12 hcss-ecs-3adb sshd[66409]: Invalid user gxf from 92.118.39.14 port 33068
Jul  8 14:39:12 hcss-ecs-3adb sshd[66409]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:12 hcss-ecs-3adb sshd[66409]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:13 hcss-ecs-3adb sshd[66411]: Invalid user mm_pf from 92.118.39.14 port 34842
Jul  8 14:39:13 hcss-ecs-3adb sshd[66415]: Accepted password for root from 111.18.40.254 port 32709 ssh2
Jul  8 14:39:13 hcss-ecs-3adb sshd[66415]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Jul  8 14:39:13 hcss-ecs-3adb systemd-logind[589]: New session 1031 of user root.
Jul  8 14:39:13 hcss-ecs-3adb sshd[66411]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:13 hcss-ecs-3adb sshd[66411]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:13 hcss-ecs-3adb sshd[66413]: Invalid user userzhhp from 92.118.39.14 port 35502
Jul  8 14:39:14 hcss-ecs-3adb sshd[66417]: Invalid user afl from 92.118.39.14 port 35580
Jul  8 14:39:14 hcss-ecs-3adb sshd[66413]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:14 hcss-ecs-3adb sshd[66413]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:14 hcss-ecs-3adb sshd[66417]: pam_unix(sshd:auth): check pass; user unknown
Jul  8 14:39:14 hcss-ecs-3adb sshd[66417]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=92.118.39.14 
Jul  8 14:39:15 hcss-ecs-3adb sshd[66409]: Failed password for invalid user gxf from 92.118.39.14 port 33068 ssh2
Jul  8 14:39:15 hcss-ecs-3adb sshd[66411]: Failed password for invalid user mm_pf from 92.118.39.14 port 34842 ssh2
Jul  8 14:39:16 hcss-ecs-3adb sshd[66411]: Connection closed by invalid user mm_pf 92.118.39.14 port 34842 [preauth]
Jul  8 14:39:16 hcss-ecs-3adb sshd[66413]: Failed password for invalid user userzhhp from 92.118.39.14 port 35502 ssh2
Jul  8 14:39:16 hcss-ecs-3adb sshd[66417]: Failed password for invalid user afl from 92.118.39.14 port 35580 ssh2

1、连接失败的IP

查询语句:

grep "Failed password for invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

解释:

  • 1、使用 grep 过滤日志条目:首先,使用 grep 过滤出所有尝试连接 SSH 端口并失败的日志条目。
grep "Failed password for invalid user" /var/log/auth.log
  • 2、提取 IP 地址:然后,从这些日志条目中提取出 IP 地址。
grep "Failed password for invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

awk '{print $(NF-3)}':这部分命令使用 awk 提取出每条日志中倒数第 4 列,即 IP 地址。
sort | uniq:对提取出的 IP 地址进行排序并去重,以确保每个地址只显示一次。

2、失败IP次数排行

查询语句:

grep "Failed password for invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr
  • grep "Failed password for invalid user" /var/log/auth.log:筛选出包含 "Failed password for invalid user" 的日志条目,即所有登录尝试失败的记录。
  • awk '{print $(NF-3)}':使用 awk 提取出每行日志中的倒数第 4 列,即 IP 地址。
  • sort | uniq -c:首先使用 sort 对提取出的 IP 地址进行排序,然后使用 uniq -c 统计每个 IP 地址出现的次数。
  • sort -nr:最后一步使用 sort -nr 对统计出的次数进行逆序排序(从高到低),这样输出中出现次数最多的 IP 地址将排在最前面。

3、连接成功的IP

查询语句:

grep "Accepted password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

解释:

  • 1、使用 grep 过滤日志条目:首先,使用 grep 过滤出所有成功连接 SSH 端口的日志条目。
grep "Accepted password" /var/log/auth.log
  • 2、提取 IP 地址:然后,从这些日志条目中提取出 IP 地址。
grep "Accepted password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq

awk '{print $(NF-3)}':这部分命令使用 awk 提取出每条日志中倒数第 4 列,即 IP 地址。
sort | uniq:对提取出的 IP 地址进行排序并去重,以确保每个地址只显示一次。

4、成功IP次数排行

查询语句:

grep "Accepted password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr


当然,其他查询语句还需自行结合日志字段进行编辑。

五、Fail2ban

1、安装

CentOS/RedHat安装方式:

  • 1、安装apel源:
yum install -y epel-release

  • 2、安装Fail2ban
yum install -y fail2ban

  • 3、启动Fail2ban服务
systemctl start fail2ban
  • 4、开机自启动
systemctl enable fail2ban
  • 5、查看Fail2ban服务状态
systemctl status fail2ban


Ubuntu/Debian安装方式:

  • 1、安装 Fail2ban
sudo apt-get install fail2ban
  • 2、Debian 12 及以上的版本需要手动安装 rsyslog
sudo apt-get install rsyslog
  • 3、启动 Fail2ban 服务
sudo systemctl start fail2ban
  • 4、开机自启动
sudo systemctl enable fail2ban
  • 5、查看 Fail2ban 服务状态。
sudo systemctl status fail2ban

2、配置

(如果嫌自己配置麻烦,可以往下滑看与1panel进行联动,图形化配置,只需要上面安装成功就可。)
jail.conf 是主配置文件,包含所有可用选项。它包含 HTTP、SSH、FTP、Webmail、WebApplications 等服务的配置文件。
一般不建议直接更改 jail.conf 文件。可以拷贝一个新的 jail.local 文件来管理 SSH 的安全,这样可以轻松跟踪 jail,并最大限度地减少错误配置的机会。
这里简单解读下jail.conf配置文件:

......
[DEFAULT ]
bantime = 10m					## 禁止时长,默认10分钟
findtime = 10m					## 执行操作的窗口时长,默认10分钟
maxretry =5					## 最大尝试次数
backend = auto					## 指定用于获取文件修改的后端
usedns = warn		
logencoding = auto
enabled = false					## jails 默认关闭,在自定义的 .local 中打开需要用到的项
mode = normal					## 过滤器类型
filter = %( name )s [mode=%(mode)s ]		## 定义过滤器
destemail =root@localhost				## 通知将被发送到的电子邮件地址
sender = root@					## 发件人姓名
mta =sendmail					## 邮件传输代理(默认是 sendmail,可以改成 mail)
protocol = tcp
chain = <known/chain>
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport			## 动作的捷径,用于定义动作参数
banaction_allports = iptables-allports
action_abuseipdb =abuseipdb
......
action = %(action_)s

所以这里我们先创建一个jail.local文件来存储我们自己编写的规则。

touch jail.local

这里可以自定义SSH防护规则,编辑jail.local文件,路径默认在/etc/fail2ban下进行查找:

接着编辑jail.local文件,复制粘贴如下,之后进行解读:

#DEFAULT-START
[DEFAULT]
bantime = 600
findtime = 300
maxretry = 5
banaction = ufw
action = %(action_mwl)s
#DEFAULT-END

[sshd]
ignoreip = 127.0.0.1/8
enabled = true
filter = sshd
port = 22
maxretry = 3
findtime = 300
bantime = 60m
banaction = ufw
action = %(action_mwl)s
logpath = /var/log/auth.log


各个参数介绍:

  • bantime:主机被禁止的秒数。
  • findtime:如果主机在“findtime”期间生成了“maxretry”,则会被禁止。
  • maxretry:主机被禁止之前的失败次数。
  • ignoreip:fail2ban 将忽略的 IP 地址,白名单地址。
  • port:服务名称或端口。
  • logpath:fail2ban 检查的日志文件路径。

更改完之后需要重启服务即可生效,可以使用如下命令操作:

systemctl restart fail2ban.service

最后我们查看jail2ban服务状态:

systemctl status fail2ban.service

3、日志查看

默认日志路径在/var/log/fail2ban.log
这里我展示下别人爆破我所产生的日志:

可以看到这里由于该IP地址疯狂爆破已经被禁了,同时,之后再进行ssh,已经连接不上了。
同时,我们也可以使用命令来查看被封禁的IP地址以及jail详细信息:

fail2ban-client status sshd

4、命令补充

1、解除IP封禁:

fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx

2、查看fail2ban版本号:

fail2ban-server -V


3、清除所有被禁的IP地址:

fail2ban-client unban --all

4、重启配置:

fail2ban-client reload

5、与1panel联动配置

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。(之后我们会详细介绍,同时与其他产品进行联动,发挥其防护效果以及优势)
官方网站: https://1panel.cn/docs/installation/online_installation/
使用这个配置方式只需要安装好fail2ban就行,然后安装1panel运维管理面板:
环境要求:
安装前请确保您的系统符合安装条件:

  • 操作系统:支持主流 Linux 发行版本(基于 Debian / RedHat,包括国产操作系统);
  • 服务器架构:x86_64、aarch64、armv7l、ppc64le、s390x;
  • 内存要求:建议可用内存在 1GB 以上;
  • 浏览器要求:请使用 Chrome、FireFox、IE10+、Edge等现代浏览器;
  • 可访问互联网。
# 一键安装命令:
# CentOS:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh
# Ubuntu:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

使用这个工具需要用到容器,从容器中拉去镜像,不过容器使用以上命令没有安装也会自行安装。

安装好之后,使用IP加端口加安全入口的形式访问,安全入口之后可以改变。

访问之后,界面类似上图

这里如果安装了fail2ban会检测到,然后直接在界面中图形化配置,尝试登录次数以及封禁时间等信息,比较方便。
同时,我们也可以通过日志审计模块,登录日志看到所有成功失败登录的可视化日志:

这里简单扩展下,该1panel的管理Web界面我们同时也需要对其进行防护,我这里使用雷池WAF对管理的端口进行了反代,使流量先过雷池WAF检测,然后到1panel管理界面,防止有恶意攻击入侵。

六、蜜罐伪造22端口

当然,这里也可以伪造22端口蜜罐,从而造成22端口为SSH端口的假象,迷惑一些技术不成熟的黑客,或者一些脚本探测,从而观察其攻击方式以及payload。从我在公网环境下测试可以看到,SSH蜜罐还是挺受欢迎的。
该蜜罐为HFish开源社区型蜜罐,官网手册: https://hfish.net/#/README
感兴趣的可以自行安装测试,做好资产梳理,端口规划,同时对硬件配置与WAF,1panel联动可能需要一定的硬件配置。


以上是个人对于SSH端口的防御方案,希望可以帮助到各位。

标签:iptables,sshd,log,IP,Fail2ban,fail2ban,日志,SSH
From: https://blog.csdn.net/weixin_63172698/article/details/140360972

相关文章

  • git设置代理, git clone无法连接github怎么办?MAC SSH如何连接github
    1.临时设置打开GitBash,使用命令临时设定socks代理:gitconfig--globalhttp.proxy'socks5://127.0.0.1:10808' gitconfig--globalhttps.proxy'socks5://127.0.0.1:10809'或者http代理:gitconfig--globalhttp.proxy'http://127.0.0.1:10809'#最......
  • Kylin配置ssh支持secureCRT7.0版本登录
    环境:OS:Kylin-Server-10-SP2-x86-Release-Build09-20210524 1.修改配置文件vi/etc/ssh/sshd_config Protocol2LogLevelVERBOSEPubkeyAuthenticationyesRSAAuthenticationyesIgnoreRhostsyesRhostsRSAAuthenticationnoHostbasedAuthenticationnoPermitEmpt......
  • Vscode ssh远程连接Linux服务器登录时密码password无法输入
    问题最近在用Vscode远程连接Linux服务器时,在终端提示输入密码password的时候用键盘输入没有反应。以为是键盘坏了,然后尝试复制粘贴没有用。后来找到了原因以及解决方法,感谢原帖作者(原贴链接粘在下面)原因其实系统已经接受密码了,主要错觉是由于人们经常使用的系统的密码......
  • ssh免密码登录
    一、本地创建ssh秘钥ssh-genkey-trsa#生成的文件在当前用户的~/.ssh目录下二、将本地生成的公钥上传到服务器1.ssh-copy-idusername@ip-pport#需要知道服务器密码2.将公钥内容或文件写入到服务器的authorized_keys文件#用于通过堡垒机登录服务器不知道密码的......
  • Boost Security with SSH/SFTP Public
    BoostSecuritywithSSH/SFTPPublicSocketTools.NETEditioneliminatespasswordvulnerabilitiesandsimplifiesaccessmanagementforsecurefiletransfersandservercommunication.SocketTools.NETEditionbyCatalystDevelopmentCorp.isade......
  • 手动编译安装OpenSSL与OpenSSH
    1、安装必要工具yuminstall-ytarzlib-devel2、编译安装OpenSSLcd/usr/local/srcwgethttps://www.openssl.org/source/openssl-1.1.1w.tar.gztar-xvzfopenssl-1.1.1w.tar.gzcdopenssl-1.1.1w./config--prefix=/usr/local/openssl--openssldir=/usr/local/opens......
  • Shell实战之SSH+Shell脚本实现远程控制多主机
    问题引入我在学习Hadoop,Spark等框架时,发现配置伪分布式环境时经常需要同时控制多台主机,Moba自带的MultiExec并不适合同时控制4台以上的主机。因此我自己设计了一段简单的shell脚本实现了这一功能。准备在使用这个脚本之前需要预先实现集群间的IP地址映射vim/etc/hosts按......
  • sshd管理限制登录配置(centos7.9)
    背景情况:为了公网的主机,被无限的密码爆破,需要对主机的ssh进行安装加固1、首先要禁用root的远程登录和修改ssh的端口vi /etc/ssh/sshd_config#修改端口,不适用22端口作为ssh的登录端口Port10000#修改ssh的root远程登录禁用PermitRootLoginno2、新加一个管理用户,配置免密sudo......
  • 04 安装SSH
    因为每一个老嵌入式都喜欢使用他的老windows进行开发,因此我决定使用SSH来开发rust,这样也不用在虚拟机里边再装一个vscode.参考博客如何在windows下使用vscode连接linux虚拟机进行代码开发_windowsvscode编辑linux文件-CSDN博客Windows环境使用VSCode调试Linux环境C/C++代......
  • linux学习之登录密码(ssh/telnet)
    在Linux系统中,用户登录密码是用于安全验证用户身份的一种方式。登录密码通常是加密后存储在系统的/etc/shadow文件中。如果您想要获取Linux系统中用户的登录密码,这通常是不可能的,因为密码是经过加密处理的,而且出于安全考虑,没有直接的方式可以获取它们的明文形式。/etc/passwd......