我不确定如何记录与 GOOD_IPS 中的 IP 地址匹配的成功 SSH 尝试。到目前为止,我只记录传入和传出的尝试,无论相关 IP 地址是否被允许。我该如何编写一条语句来记录与 GOOD_IPS 中的地址匹配的所有成功 SSH 登录尝试,以及一条记录来自 GOOD_IPS 之外的地址的成功和被拒绝的尝试的语句?
#allow ssh for ip addresses in GOOD_IPS chain
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p TCP --sport 22 -m state --state NEW -j GOOD_IPS
iptables -A OUTPUT -p tcp --sport 22 --syn -j LOG --log-prefix "iptables: ssh outgoing attempt"
iptables -A OUTPUT -p TCP --sport 22 -m state --state NEW -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 --syn -j LOG --log-prefix "iptables: ssh incoming attempt"
iptables -A INPUT -p TCP --dport 22 -m state --state NEW -j GOOD_IPS
iptables -A INPUT -p TCP --dport 22 -m state --state NEW -j DROP
#ip addresses can be easily added
iptables -A GOOD_IPS -s 192.168.182.132 -j ACCEPT
#iptables -A GOOD_IPS -s 232.28.25.86 -j ACCEPT
答案1
这是不可能的,因为 iptables 无法看到相关数据。
iptables -A INPUT -m string --string "SUCCESS" -j LOG
如果 SSH 没有加密该信息,导致 iptables 无法使用它,那么类似的方法可能会有效。
此外,所有(成功的)尝试都已登录/var/log/secure
(或您的发行版配置将其登录到的任何地方)。为什么不去那里看看呢?
答案2
我同意 Brigo 的观点,它iptables
不适合记录成功登录等协议感知问题;这适用于sshd
的日志记录。但你可以使用
iptables -I INPUT 1 -p tcp --dport 22 -s a.b.c.d/e -m state --state NEW -j LOG --log-prefix "ssh login attempt: "
您的良好 IP 范围在哪里a.b.c.d/e
,带有掩码(例如10.4.0.0/16
)。
答案3
我不认为你能通过 知道这一点iptables
。尽管如果 SSH 保持开启一阵子,这可能意味着连接成功,从而验证成功。
你可以使用fail2ban
。这样你就可以完全自动化地访问日志。你可以检测故障并根据需要阻止该 IP。由于它是用 Python 编写的,因此你可以容易地改变行为并发送电子邮件或访问另一台服务器等。
Ubuntu 16.04 上的版本有一个错误,使得失败2ban如果您有大量(数千)个被阻止的 IP,则退出速度会非常慢。如果您不打算阻止任何内容,那么您就不会遇到该错误。
安装后,请查看此文件以获得灵感:
/etc/fail2ban/filter.d/sshd.conf
它可能不完全是您想要的(因为您想要发出积极信号,而 fail2ban 中的默认设置是检查消极信号...),但它应该为您提供足够的信息来开始。
连接、写入的日志行和 fail2ban 检测之间会有短暂的延迟,但它仍能为您提供所需的信息。