君衍.
一、本篇介绍
本文目的: 由于本人测试环境在公网上搭建完成,因此收到了很多关于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、工作方式
- 监视日志文件:Fail2ban 会监视指定的日志文件,例如 SSH、HTTP、FTP 等服务的日志文件。
- 匹配规则:Fail2ban 会根据用户定义的规则(也称为“过滤器”)对日志文件进行匹配。规则通常基于正则表达式,以识别恶意行为,例如登录失败尝试、恶意请求等。
- 触发响应:当匹配到规则时,Fail2ban 会触发定义的响应操作,例如将攻击者的 IP 地址添加到防火墙规则中以阻止其访问,或向管理员发送电子邮件报警。
- 自动解封: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端口的防御方案,希望可以帮助到各位。