随着Linux服务器在各种企业及单位的广泛使用。越来越多的用户普遍开启了Linux发行版默认的远程管理组件SSH作为远程管理服务器的通用方法和手段。但通常情况下SSH功能组件没有输入密码次数限制,这给SSH暴力破解带来了极大的方便。通过传统防火墙机制则只能对IP地址放行或者阻断,这种方式对真正面向大地址空间侧用户来说很难确定其IP地址的范围,也就很难确定哪些地址需要放行而哪些地址需要阻断。笔者也通过Linux自身的“Pam_tally”认证模块进行过SSH登陆用户次数限制设置,但发现该机制一旦使用户锁定之后,必须需要本地root才能进行解锁,这对于远程维护的系统是不现实的。

Sshguard组件提供了一种动态机制,通过该软件组件,能够接受日志消息,如果它确定了某个地址对防护中的服务器造成危害,就会启用机器里的防火墙规则,以阻止该地址连接。Sshguard阻止状态保持一段时间,会自动解禁。不仅如此,它还能针对几种FTPD等服务器提供同样的防暴力破解攻击和探测。该组件目前支持多数公开发行的Linux及BSD系统。

一、 安装

Sshguard软件的安装,对于多数熟悉Linux系统的用户来说安装过程相对简单,笔者测试中发现Debian Gnu/Linux的源中已经包含了该软件包,用户只需通过执行“apt install sshguard”即可进行安装:

$ sudo apt update
$ sudo apt install sshguard

安装后,SSHGuard服务会自动启动,可以使用以下命令进行验证:

$ sudo systemctl status sshguard

对于基于 RHEL 的发行版,例如CentOS、Rocky和AlmaLinux,首先按照以下命令安装EPEL存储库:

$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
或者
$ sudo dnf install epel-release

该链接地址软件包适用于Red Hat Enterprise 6系列操作系统安装

http://rpmfind.net/linux/rpm2html/search.php?query=sshguard

该链接地址包含了RedHat、SuSE操作系统下各架构平台的sshguard组件安装包,用户可以针对自己的系统进行下载安装。

笔者以Red Hat Enterprise 7对安装过程进行举例说明,用户进入页面后可以找到“sshguard-2.4.1-1.el7.x86_64.rpm”文件所在行并点击下载该文件,因为该软件组件没有其它依赖包问题,所以可以直接通过命令“rpm –ivh sshguard-2.4.1-1.el7.x86_64.rpm”即可完成安装。

用户在操作系统上完成安装并通过简单配置之后,即可以使用服务管理命令对该sshguard组件进行管理及使用。

二、 配置方法

使用UFW阻止SSH攻击

如果在Ubuntu / Debian系统上安装并启用了UFW,请修改/etc/ufw/before.rules配置文件。

$ sudo vim etc/ufw/before.rules

在该allow all on loopback部分之后添加以下行。

# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# hand off control for sshd to sshguard
:sshguard - [0:0]
-A ufw-before-input -p tcp --dport 22 -j sshguard

保存文件并重新启动UFW。

$ sudo systemctl restart ufw

现在尝试使用错误的密码从不同的系统登录服务器,并注意在第一次登录尝试失败后你将被锁定120秒。

可以通过检查auth.log日志文件来验证这一点。

$ sudo tail -f  /var/log/auth.log

使用Firewalld阻止SSH攻击

如果正在运行 firewalld,请确保已设置并启用它,然后执行以下命令以在你的首选区域上启用sshguard。

$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule source ipset=sshguard4 drop"

要使得更改生效,请重新加载Firewalld和sshguard。

$ sudo firewall-cmd --reload
$ sudo systemctl restart sshguard

然后验证规则如下:

$ sudo firewall-cmd —-info-ipset=sshguard4

使用iptables阻止SSH攻击

如果正在使用Iptables,首先在Iptables中为sshguard创建一个新的链式规则,开始阻止攻击者。

# iptables -N sshguard

接下来,更新INPUT链以将流量引导至sshguard并阻止来自恶意方的所有流量。

# iptables -A INPUT -j sshguard

要阻止攻击访问特定端口,例如SSH、POP和IMAP,请运行以下命令:

# iptables -A INPUT -m multiport -p tcp --destination-ports 22,110,143 -j sshguard

最后,保存规则以使更改生效。

# iptables-save > /etc/iptables/iptables.rules

如何将SSH阻止的主机列入白名单

要将被阻止的主机列入白名单,只需在位于以下位置的白名单文件中指定其主机名或IP地址即可:

/etc/sshguard/whitelist - Ubuntu/Debian
/etc/sshguard.whitelist - RHEL-based distros

设置完成在之后,请务必重新启动sshguard守护程序和防火墙以使应用更改生效。

三、 具体参数说明

1、配置文件位置:Debian Gnu/Linux系统该文件位于/etc/sshguard/sshguard.conf,RedHat系统该配置文件位于/etc/sshguard.conf

2、几处重要的默认配置可根据实际需求修改:

2.1、BACKEND="/usr/libexec/sshguard/sshg-fw-iptables"

该配置文件指定了sshguard服务需要使用的后端防火墙脚本,用户需要根据自己真是系统使用的防火墙类型进行修改。

2.2、THRESHOLD=30

当错误输入累计次数达到30次,封禁ip

2.3、BLOCK_TIME=120

首次封禁时长为120秒,此后若再次达到阀值被封禁,时长增至1.5倍,依次类推

2.4、DETECTION_TIME=1800

最长封禁时间1800秒(即在3分钟内若没有达到阀值,就会解禁ip)

2.5、WHITELIST_FILE=/etc/sshguard.whitelist

白名单配置,为了防止误禁止某ip(段),可将其加入白名单,用户可根据自己的应用需要对特殊地址进行添加,之后sshguard服务将忽略这些地址并永久放行ssh登录服务。

四、 后记

网络安全日益重要的当下,经管有越来越多的安全设备对网络中的各种恶意行为进行这防护,但主机侧自主防护的能力也是非常重要和必要的,避免内网本身的恶意行为需要本机侧能够具有很好的自动化能力和功能。网络攻防从本质上来讲是时间的对抗,sshguard功能组件可以最大限度的自动化进行恶意登录行为的阻断和恢复。这种既能有效延长攻击者的时间维度,又能为正常用户访问提供及时响应的技术能力很好的为在网络攻防中正常业务的保障和保护提供了有力支撑。