引言
在网络安全防护领域,SSHGuard 是一款功能强大且实用的工具。它能够从标准输入读取日志消息,这一特性使其与管道 syslog 完美适配,能够高效获取系统日志信息。同时,它还可以持续监视一个或多个日志文件,全面掌控系统日志动态。
SSHGuard 处理日志消息时,通过逐行解析和精准算法识别特定模式。例如,在短时间内出现多次登录失败的情况,通常表明可能存在恶意攻击行为。一旦 SSHGuard 检测到这样的攻击迹象,会迅速反应,阻止发起可疑连接的 IP 地址,从而有效保障系统安全。
SSHGuard 最初设计是为 OpenSSH 服务增添一层坚固的保护,以应对日益复杂的网络攻击。但随着技术发展和应用场景拓展,其防护能力早已超越最初定位。如今,SSHGuard 的保护范围非常广泛,涵盖了如 Vsftpd 的文件传输服务,以及 Postfix 等邮件传输服务,为网络环境的稳定与安全提供了全面的守护。
SSHGuard 安装
Ubuntu/Debian
在基于 Debian 或 Ubuntu 的系统上,可以使用 apt
包管理器来安装 SSHGuard。打开终端,执行以下命令:
sudo apt update
sudo apt install sshguard
apt update
命令用于更新软件包列表,确保你获取到最新的软件包信息。apt install sshguard
则会下载并安装 SSHGuard 及其依赖项。
CentOS/RHEL
对于基于 CentOS 或 RHEL 的系统,使用 yum
包管理器进行安装。在终端中输入以下命令:
sudo yum install epel-release
sudo yum install sshguard
epel-release
是 Extra Packages for Enterprise Linux 的软件源,许多非官方的软件包可以通过它来安装。安装完 epel-release
后,就可以使用 yum
安装 SSHGuard 了。
Arch Linux
在 Arch Linux 系统中,使用 pacman
包管理器进行安装。在终端中执行以下命令:
sudo pacman -S sshguard
pacman -S
命令用于安装指定的软件包。
SSHGuard 使用
启动 SSHGuard
安装完成后,需要启动 SSHGuard 服务。不同的系统使用不同的命令来启动服务。
systemd 系统(如 Ubuntu 16.04+、CentOS 7+)
sudo systemctl start sshguard
systemctl start
命令用于启动指定的服务。
SysVinit 系统(如 CentOS 6)
sudo service sshguard start
service
命令用于管理 SysVinit 风格的服务。
设置开机自启
为了确保服务器重启后 SSHGuard 能够自动启动,需要设置服务开机自启。
systemd 系统
sudo systemctl enable sshguard
systemctl enable
命令用于设置服务开机自启。
SysVinit 系统
sudo chkconfig sshguard on
chkconfig
命令用于管理 SysVinit 风格的服务开机自启。
查看服务状态
可以使用以下命令查看 SSHGuard 服务的运行状态:
systemd 系统
sudo systemctl status sshguard
SysVinit 系统
sudo service sshguard status
如果服务正常运行,会显示服务的运行信息,包括服务是否正在运行、运行时间等。
配置 SSHGuard
配置文件位置
SSHGuard 的主要配置文件位于 /etc/sshguard/sshguard.conf
有些系统可能位于 /etc/sshguard.conf
。可以使用文本编辑器(如 vim
或 nano
)打开该文件进行配置。
sudo vim /etc/sshguard/sshguard.conf
配置参数说明
日志文件路径
SSHGuard 通过监控系统日志来检测暴力破解尝试。默认情况下,它会监控 /var/log/auth.log
(Debian/Ubuntu)或 /var/log/secure
(CentOS/RHEL)。如果你的日志文件路径不同,可以在配置文件中修改 LOG_FILES
参数。
场景系统的SSH日志路径如下:
- Debian/Ubuntu:
/var/log/auth.log
- CentOS/RHEL:
/var/log/secure
- FreeBSD:
/var/log/auth.log
默认情况下,SSHGuard 会自动识别日志文件路径,但可以手动修改 /etc/sshguard/sshguard.conf
进行调整。
FILES="/var/log/auth.log /var/log/messages"
配置详情
# 后端可执行文件的完整路径(必需,无默认值)
BACKEND="/usr/libexec/sshguard/sshg-fw-nft-sets"
# 在标准输出上提供日志的 shell 命令。(可选,无默认值)
# 示例 1:从 systemd 日志中获取 ssh 和 sendmail 的日志:
LOGREADER="LANG=C journalctl -afb -p info -n1 -t sshd -o cat"
# 当攻击者的累计攻击得分超过阈值(THRESHOLD)时,对其进行封禁。
# 大多数攻击的得分是 10。(可选,默认值为 30)
THRESHOLD=5
# 攻击者的得分超过阈值(THRESHOLD)后,最初封禁 BLOCK_TIME 秒。
# 后续的封禁时间将增加 1.5 倍。(可选,默认值为 120)
BLOCK_TIME=600
# 在重置潜在攻击者的得分之前,记录其信息的最长时间为 DETECTION_TIME 秒。
# (可选,默认值为 1800)
DETECTION_TIME=86400
# 白名单文件(WHITELIST_FILE)中列出的 IP 地址被视为可信地址,永远不会被封禁。
WHITELIST_FILE=/etc/sshguard/whitelist
# 黑名单
BLACKLIST_FILE=90:/etc/sshguard.blacklist
封禁时间
BLOCK_TIME
参数用于设置封禁 IP 地址的时间,单位为秒。默认值为 3600 秒(即 1 小时)。可以根据需要调整该值。
BLOCK_TIME=7200
上述配置将封禁时间设置为 2 小时。
允许的最大尝试次数
THRESHOLD
参数用于设置允许的最大登录尝试次数。如果一个 IP 地址在规定时间内超过了这个次数,就会被封禁。默认值为 3 次。
THRESHOLD=5
上述配置将允许的最大尝试次数设置为 5 次。
保存配置并重启服务
修改完配置文件后,需要保存并重启 SSHGuard 服务,使配置生效。
sudo systemctl restart sshguard
解除封禁
如果某个 IP 被误封,可以使用以下命令解除:
sudo iptables -D INPUT -s <被封IP> -j DROP
例如:
sudo iptables -D INPUT -s 192.168.1.100 -j DROP
如果使用 firewalld,可以解除:
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
sudo firewall-cmd --reload
拦截日志分析
可以查看 /var/log/syslog(Ubuntu/Debian)或 /var/log/messages(CentOS)来检查 SSHGuard 的日志:
sudo cat /var/log/syslog | grep sshguard
或者
sudo journalctl -u sshguard --no-pager | tail -n 50
总结
通过安装、使用和配置 SSHGuard,可以有效地保护 SSH 服务免受暴力破解攻击。它简单易用,对系统资源的占用也非常小。在实际使用中,可以根据服务器的安全需求,灵活调整配置参数,确保服务器的安全性。同时,还可以结合其他安全措施,如防火墙、密钥认证等,进一步增强服务器的安全防护能力。
文章来源: https://study.disign.me/article/202508/20.debian-sshguard.md
发布时间: 2025-02-21
作者: 技术书栈编辑