sshguard

来自 ArchWiki

警告: 使用 IP 黑名单会阻止简单的攻击,但这依赖于额外的守护进程和成功的日志记录(包含 /var 的分区可能会被填满,尤其是在攻击者猛烈攻击服务器时)。此外,通过了解您的 IP 地址,攻击者可以发送带有欺骗源标头的包,并使您被服务器锁定。SSH 密钥为暴力破解提供了一个优雅的解决方案,且没有这些问题。

sshguard 是一个守护进程,用于保护 SSH 和其他服务免受暴力攻击,类似于 fail2ban

sshguard 与后者不同之处在于它使用 C 语言编写,更轻量级,使用更简单,功能更少,但执行其核心功能同样出色。

sshguard 不容易受到大多数(或可能任何)日志分析 漏洞的影响,这些漏洞曾给类似的工具带来问题。

安装

安装 sshguard 软件包。

配置

sshguard 通过监控 /var/log/auth.logsyslog-ngsystemd 日志来检测失败的登录尝试。对于每次失败的尝试,都会在有限的时间内禁止冒犯主机进一步通信。默认情况下,冒犯者被禁止的时间从 120 秒开始,并且每次登录失败都会增加 1.5 倍。sshguard 可以配置为永久禁止失败尝试次数过多的主机。

临时和永久禁止都是通过在 iptables 中的 “sshguard” 链中添加条目来完成的,该条目会丢弃来自冒犯者的所有数据包。然后,禁止会记录到 syslog,并最终出现在 /var/log/auth.log 或 systemd 日志(如果后者正在使用)中。

您必须配置以下防火墙之一才能与 sshguard 一起使用,以便阻止生效。

firewalld

此文章或章节已过时。

原因: ipset 已在 firewalld 中弃用,以下步骤将破坏 firewalld。(在 Talk:Sshguard 中讨论)

sshguard 可以与 firewalld 一起工作。请确保您已启用、配置和设置 firewalld。要使 sshguard 写入您首选的区域,请发出以下命令

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

如果您使用 ipv6,您可以发出相同的命令,但将 sshguard4 替换为 sshguard6。最后执行:

# firewall-cmd --reload

您可以使用以下命令验证上述操作:

# firewall-cmd --info-ipset=sshguard4

最后,在 /etc/sshguard.conf 中,找到 BACKEND 行并按如下方式更改它

/etc/sshguard.conf
BACKEND="/usr/lib/sshguard/sshg-fw-firewalld"

UFW

如果安装并启用了 UFW,则必须赋予它将 DROP 控制传递给 sshguard 的能力。这可以通过修改 /etc/ufw/before.rules 来完成,使其包含以下行,这些行应插入到环回设备部分之后。

注意: 在非标准端口上运行 sshd 的用户应在上面的最后一行中替换该端口(其中 22 是标准端口)。
/etc/ufw/before.rules
# 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
# ipv4
:sshguard - [0:0]
-A ufw-before-input -p tcp --dport 22 -j sshguard
#for ipv6
:sshguard - [0:0]
-A ufw6-before-input -p tcp --dport 22 -j sshguard

重启 在进行此修改后重启 ufw。

iptables

注意: 首先查看 iptables简单状态防火墙 以设置防火墙。

所需的主要配置是创建一个名为 sshguard 的链,sshguard 在其中自动插入规则以丢弃来自恶意主机的数据包

# iptables -N sshguard

然后添加一条规则,从 INPUT 链跳转到 sshguard 链。此规则必须在处理 sshguard 保护的端口的任何其他规则之前添加。使用以下行来保护 FTP 和 SSH,或参阅 [1] 以获取更多示例。

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

要保存规则

# iptables-save > /etc/iptables/iptables.rules
注意: 对于 IPv6,使用 ip6tables 重复相同的步骤,并使用 ip6tables-save 将规则保存到 /etc/iptables/ip6tables.rules

nftables

BACKEND 的值更改为以下内容

/etc/sshguard.conf
BACKEND="/usr/lib/sshguard/sshg-fw-nft-sets"

当您 启动/启用 sshguard.service 时,将在 ipip6 地址族中添加两个名为 sshguard 的新表,这些表通过 sshguard 的 IP 地址列表过滤传入流量。sshguard 表中的链的优先级为 -10,将在优先级较低的其他规则之前处理。有关更多信息,请参阅 sshguard-setup(7)nftables

用法

systemd

启用启动 sshguard.service

syslog-ng

如果您安装了 syslog-ng,您可以直接从命令行启动 sshguard。

/usr/sbin/sshguard -l /var/log/auth.log -b /var/db/sshguard/blacklist.db

配置

配置在 /etc/sshguard.conf 中完成,这是 sshguard 启动所必需的。注释示例位于 /usr/share/doc/sshguard/sshguard.conf.sample,也可以在 Bitbucket sshguard.conf.sample 上找到。

注意: sshguard 的 systemd 单元中的管道命令和运行时标志 不受支持。这些标志可以在配置文件中修改。

黑名单阈值

默认情况下,在 Arch 提供的配置文件中,一旦攻击者达到 120 的 “危险” 级别(或 12 次登录失败;有关更多详细信息,请参阅 攻击危险性),就会被永久禁止。可以通过在黑名单文件前面加上危险级别来修改此行为。

/etc/sshguard.conf
BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db

此示例中的 200: 告诉 sshguard 在攻击者达到 200 的危险级别后永久禁止该主机。

最后,重启 sshguard.service

适度封禁示例

此处提出了一个比默认规则稍微激进的封禁规则,以说明各种选项

  • 它通过来自 systemd/Journal 的日志监控 sshdvsftpd
  • 它在 2 次尝试后阻止攻击者(每次尝试的成本为 10,解释了 THRESHOLD 参数的 20 值),持续 180 秒,随后的阻止时间按 1.5 的系数增加。请注意,此 1.5 倍乘法延迟是内部的,不受设置控制
  • 攻击者在 10 次尝试后被永久列入黑名单(10 次尝试每次成本为 10,解释了 BLACKLIST_FILE 参数中的 100 值)
  • 它不仅阻止攻击者的 IP,还阻止所有 IPv4 子网 24 (CIDR 表示法)
/etc/sshguard.conf
# Full path to backend executable (required, no default)
BACKEND="/usr/lib/sshguard/sshg-fw-iptables"

# Log reader command (optional, no default)
LOGREADER="LANG=C.UTF-8 /usr/bin/journalctl -afb -p info -n1 -t sshd-session -t vsftpd -o cat"

# How many problematic attempts trigger a block
THRESHOLD=20
# Blocks last at least 180 seconds
BLOCK_TIME=180
# The attackers are remembered for up to 3600 seconds
DETECTION_TIME=3600

# Blacklist threshold and file name
BLACKLIST_FILE=100:/var/db/sshguard/blacklist.db

# IPv6 subnet size to block. Defaults to a single address, CIDR notation. (optional, default to 128)
IPV6_SUBNET=64
# IPv4 subnet size to block. Defaults to a single address, CIDR notation. (optional, default to 32)
IPV4_SUBNET=24

激进封禁

对于一些 постоянно 受到攻击的用户,可以采用更激进的封禁策略。如果您确信不太可能发生意外的登录失败,您可以指示 SSHGuard 在单次登录失败后永久禁止主机。按以下方式修改配置文件中的参数

/etc/sshguard.conf
THRESHOLD=10
BLACKLIST_FILE=10:/var/db/sshguard/blacklist.db

最后 重启 sshguard.service

此外,为了防止在单个连接期间进行多次身份验证尝试,您可能需要通过定义以下内容来更改 /etc/ssh/sshd_config

/etc/ssh/sshd_config
MaxAuthTries 1

重启 sshd.service 以使此更改生效。

技巧和窍门

解除封禁

如果您禁用了自己,您可以等待自动解除封禁,或者使用 iptables 或 nftables 解除对自己的封禁。

您还需要从 /var/db/sshguard/blacklist.db 中删除 IP 地址,以使解除封禁持久生效。

iptables

首先检查您的 IP 是否被 sshguard 禁用

# iptables --list sshguard --line-numbers --numeric

然后使用以下命令解除封禁,使用前一个命令中标识的行号

# iptables --delete sshguard line-number

nftables

attackers 集合中删除您的 IP 地址

# nft delete element family sshguard attackers { ip_address }

其中 familyipip6

日志记录

要查看传递给 sshguard 的内容,请检查 /usr/lib/systemd/scripts/sshguard-journalctl 中的脚本和 systemd 服务 sshguard.service。在终端中查看日志的等效命令

# journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10