我想降低 ssh 攻击 Linux 系统的成功率。唯一开放的端口是 22(我对其他所有端口都使用端口转发),当然我确保 ssh 只接受基于密钥对的登录(无密码)。
失败的 ssh 登录尝试次数(输出last -f /var/log/btmp
)相当大(任何开放 22 端口的人都应该预料到),因此在过去的 2 年多时间里,我一直依赖于经常提到的基于 iptables 的解决方案的变体来阻止 ssh 攻击,例如数百次 ssh 登录失败。
这种方案的一个令人讨厌的缺点是,它限制了每个时间段内来自某个 IP 地址的新连接数,无论来自该 IP 的先前连接是否成功,也无论这些连接是否试图以同一用户身份登录。想象一下,一个脚本包含rsync
来自国外的六个命令,用于更新该服务器上的各个区域:它通常会达到“新连接限制”并在中间某个地方失败。如果路由器后面的几个用户(显示为同一 IP 地址)确实几乎同时连接到我的服务器,情况也是如此。
所以,我想知道,无需解析/var/log
文件,可以实施以下策略iptables
:
- 接受已建立的连接
- 允许来自先前成功的连接的新连接
- 将连接失败的 IP 关进监狱一段时间
奖励积分:
- 与上面相同,但是允许/监禁特定
user@ip
人而不是所有人@ip
。
为了遏制僵尸网络攻击,请执行以下操作:
- ssh 尝试失败后,暂时将用户关进监狱(无论他从哪个 IP 连接)。
答案1
如果不解析日志文件,您就无法知道 ssh 登录尝试是否成功。幸运的是,您不必自己解析这些日志文件。失败2ban可以帮你做到这一点。我通常会在 3 次登录尝试失败后将 IP 禁闭一周。
答案2
2020 年更新
现在我只使用sshguard
(在容器上)或(虚拟机/裸机) - 所有这些都使用在非标准端口上监听的公钥。我仍然使用我的静态 IP 限制对此端口的访问fail2ban
。我的配置使用 阻止攻击者 2 天。我仍然使用 ,但正在切换到。ipset
ssh
iptables
fail2ban
bantime = 48h
vpn
wireguard
也可以看看:
SSH 强化添加双重身份验证
Onlykey SSH 设置将
ssh
密钥放到安全密钥上。它也可以与gpg
密钥一起使用。它比将私钥放在电脑上安全得多。它在物理上比 Yubikey 更安全,因为唯钥存在PIN 保护。使用一次性屈贝斯vm 用于生成密钥
我也使用 Onlykey 来保护KeepassXC作为HMAC-SHA1
第二个因素。它还可以与 Linux PAM 一起使用以登录到您的系统并且是必需的sudo
。
有了这个设置我就不用担心ssh
被利用了。
首先不要监听ssh
以port 22
减少您的端口被自动扫描仪发现的机会。
还可psad
用于自动阻止扫描您机器的主机可配置的时间量(默认为 1 小时)。
一个非常简单的解决方案就是租一个64 or 128 meg
openvz
集装箱&配置openvpn
因此您有一个fixed ip address
&然后将您的iptables
规则限制--source vpn.ip.address
在您希望保护的主机上。
更好的解决方案是ssh
使用以下方法完全隐藏您的端口fwknop
。然后无需运行fail2ban
,因为您的ssh
端口已关闭,直到您gpg
从 发送签名和加密的数据包fwknop-client
,这将打开您的防火墙一段可配置的时间(默认为 30 秒)。您还可以配置fwknop
仅接受某些 IP 地址(例如您的vpn
)。
我有一些这里有详尽的注释为了fwknop
。
如果你非常重视ssh
安全,你也应该使用ed25519
密钥。更多使用说明请点击此处安全密码openssh
另一个不错的选择是tinyssh
其中有不对 & 的依赖openssl
是默认安全。
这里提到的所有软件都存在于Alpine Linux这也受益于地址空间布局随机化通过PaX
它的Grsecurity核心。