sshguard
sshguard 是一个守护进程,用于保护 SSH 和其他服务免受暴力攻击,类似于 fail2ban。
sshguard 与后者不同之处在于它使用 C 语言编写,更轻量级,使用更简单,功能更少,但执行其核心功能同样出色。
sshguard 不容易受到大多数(或可能任何)日志分析 漏洞的影响,这些漏洞曾给类似的工具带来问题。
安装
配置
sshguard 通过监控 /var/log/auth.log
、syslog-ng 或 systemd 日志来检测失败的登录尝试。对于每次失败的尝试,都会在有限的时间内禁止冒犯主机进一步通信。默认情况下,冒犯者被禁止的时间从 120 秒开始,并且每次登录失败都会增加 1.5 倍。sshguard 可以配置为永久禁止失败尝试次数过多的主机。
临时和永久禁止都是通过在 iptables 中的 “sshguard” 链中添加条目来完成的,该条目会丢弃来自冒犯者的所有数据包。然后,禁止会记录到 syslog,并最终出现在 /var/log/auth.log
或 systemd 日志(如果后者正在使用)中。
您必须配置以下防火墙之一才能与 sshguard 一起使用,以便阻止生效。
firewalld
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
来完成,使其包含以下行,这些行应插入到环回设备部分之后。
/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
所需的主要配置是创建一个名为 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
/etc/iptables/ip6tables.rules
。nftables
将 BACKEND
的值更改为以下内容
/etc/sshguard.conf
BACKEND="/usr/lib/sshguard/sshg-fw-nft-sets"
当您 启动/启用 sshguard.service
时,将在 ip
和 ip6
地址族中添加两个名为 sshguard
的新表,这些表通过 sshguard 的 IP 地址列表过滤传入流量。sshguard
表中的链的优先级为 -10,将在优先级较低的其他规则之前处理。有关更多信息,请参阅 sshguard-setup(7) 和 nftables。
用法
systemd
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 上找到。
黑名单阈值
默认情况下,在 Arch 提供的配置文件中,一旦攻击者达到 120 的 “危险” 级别(或 12 次登录失败;有关更多详细信息,请参阅 攻击危险性),就会被永久禁止。可以通过在黑名单文件前面加上危险级别来修改此行为。
/etc/sshguard.conf
BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db
此示例中的 200:
告诉 sshguard 在攻击者达到 200 的危险级别后永久禁止该主机。
最后,重启 sshguard.service
。
适度封禁示例
此处提出了一个比默认规则稍微激进的封禁规则,以说明各种选项
- 它通过来自 systemd/Journal 的日志监控 sshd 和 vsftpd
- 它在 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 }
其中 family
是 ip
或 ip6
。
日志记录
要查看传递给 sshguard 的内容,请检查 /usr/lib/systemd/scripts/sshguard-journalctl
中的脚本和 systemd 服务 sshguard.service
。在终端中查看日志的等效命令
# journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10