Ped*_*ram 21
有不同的解决方案。最好的方法是使用 RSA 身份验证,该身份验证使用公钥/私钥对用户进行身份验证。
查看这个很棒的手册以了解不同的方法(包括 RSA 身份验证):http : //www.la-samhna.de/library/brutesh.html
我在我的服务器上使用第三个解决方案,因为我不想让我的非技术用户变得复杂:iptables用于限制每分钟的连接数,这会使暴力攻击效率低下且无效。
这是我正在使用的解决方案:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Run Code Online (Sandbox Code Playgroud)
如前所述这里:这将使三大港口从60秒的时间内任何给定的IP地址22个连接,无需后续连接尝试60秒的时候,才再次恢复允许连接。--rttl 选项在匹配数据包时还考虑了数据报的 TTL,以尽量减少欺骗源地址。
正如上述指南中所述,最好使用白名单将受信任的用户与这些规则分开:
iptables -N SSH_WHITELIST
Run Code Online (Sandbox Code Playgroud)
然后添加受信任的主机:
iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
然后制定规则:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Run Code Online (Sandbox Code Playgroud)
我的服务器遭到暴力 ssh 攻击,速度为每天 1 到 2 次。我已经安装了denyhosts(ubuntu 包:denyhosts)。这是一个非常简单但有效的工具:本质上它会定期扫描您的日志以检测蛮力攻击,并将来自这些攻击的 IP 放入您的 /etc/hosts.deny 文件中。你不会再收到他们的消息,你的负担应该会大大减少。它可以通过其配置文件 /etc/denyhosts.conf 进行配置,以调整诸如多少次错误尝试构成攻击等问题。
由于其透明的工作方式,您可以轻松查看正在发生的事情(电子邮件通知:“啊哈,又一次卑鄙的攻击被挫败了!”)并撤消由于用户反复输入错误密码而导致的错误。
当然,之前关于切换到其他身份验证方法的所有内容都成立,但有时您的要求与您的用户的要求不一致。
此外,与通过 hosts.deny 拒绝访问相比,iptables 中的新连接速率限制可能是更好的选择。所以,也看看fail2ban。但是,如果您知道 ssh 蛮力是您的主要关注点(手动查看 /var/log/auth.log 以确定这一点),请使用这个非常简单且低影响的工具。
knockd来实现端口敲门系统recent和hashlimit匹配来限制连续的 SSH 尝试