数百次失败的 ssh 登录

Mat*_*ght 82 linux ssh redhat

每天晚上,我都会在 RedHat 4 服务器上收到成百上千次失败的 ssh 登录。由于远程站点的防火墙原因,我需要在标准端口上运行。有什么我应该做的来阻止这个。我注意到许多来自相同的 IP 地址。它不应该在一段时间后停止那些吗?

Eva*_*son 69

您可以使用 iptables 来限制到 SSH 端口的新传入连接的速率。我必须查看您的整个 iptables 配置才能为您提供交钥匙解决方案,但您基本上是在谈论添加如下规则:

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 
Run Code Online (Sandbox Code Playgroud)

这些规则假定您接受表中较早的 ESTABLISHED 连接(因此只有新连接会符合这些规则)。新的 SSH 连接将符合这些规则并被标记。在 60 秒内,来自单个 IP 地址的 5 次尝试将导致来自该 IP 的新传入连接被丢弃。

这对我来说效果很好。

编辑:我更喜欢这种方法而不是“fail2ban”,因为不需要安装额外的软件,并且完全在内核模式下发生。它不会像“fail2ban”那样处理解析日志文件,但是如果您的问题仅与 SSH 有关,我不会使用需要安装软件且更复杂的用户模式。

  • 它减慢了攻击速度,我确实推荐它,但因为那里有分布式扫描僵尸网络,所以它不是万能药。仍然会有来自僵尸网络对您运行分布式扫描的无效登录。对此您无能为力,除了某种“端口敲门”方案,可以在您想要进入时远程启动 SSH 端口。 (2认同)
  • 在这些规则中不需要 --dport 22 以便它们仅适用于 ssh 流量吗? (2认同)
  • @clime - 是的。很难相信这已经在这里 2 1/2 年了,没有人注意到!接得好。 (2认同)

Kyl*_*ndt 39

fail2ban可以通过阻止登录尝试失败次数过多的 IP 地址来帮助解决此问题。

  • 我不喜欢工具/脚本代表 sysadmin 用户读取日志和发出命令 (11认同)
  • @asdmin,是的,尤其是当他们 [拥有如此出色的业绩记录...](http://www.cvedetails.com/vulnerability-list/vendor_id-5567/Fail2ban.html) (2认同)

KPW*_*INC 25

如果可以,我建议为 SSH 使用非标准端口(即端口 10222),但既然你提到你不能这样做,我建议使用诸如 DenyHosts 之类的东西。

http://denyhosts.sourceforge.net/

很棒的软件包,易于安装和配置。

  • 我不知道为什么人们会赞成这个;SSH 在标准端口 22 上。这意味着当您在外部网络上时,您不必依赖他们通过出站防火墙打开非标准端口。上面记录了这个问题的真正解决方案,要么通过入站防火墙限制重复连接的数量,要么关闭密码登录。 (6认同)

Dav*_*osh 15

虽然能够从 Internet 上的任意位置通过 ssh 进入您的系统可能很好,但有自动密码攻击系统会锁定打开的 ssh 端口并对您的系统应用各种 joe 帐户和字典攻击。这可能会加重阅读您的夜间日志摘要,并且浪费您的带宽。

如果您在同一系统上有一个 Web 服务器,您可以使用 php 和 tcp 包装器来限制 ssh 入站流量到已知系统,并为您提供一个后门密钥以允许您从互联网上的任意系统访问。

这是你如何做到的:

拒绝 /etc/hosts.deny 中的所有 ssh 连接:

# /etc/hosts.deny fragment
sshd:  all
Run Code Online (Sandbox Code Playgroud)

在 /etc/hosts.allow 中通过 IP 允许已知系统,并添加一个用于临时访问的文件:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access
Run Code Online (Sandbox Code Playgroud)

在您的 Web 服务器中创建一个 php 文件,并为其指定一个不明显的名称,例如 my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>
Run Code Online (Sandbox Code Playgroud)

原谅 php 代码——我从其他地方刷了它,所以它可能会被清理一大堆。它所做的只是将访问它的系统的 IP 地址添加到 /etc/hosts.allow.temporary-sshd-access 文件中,该文件在连接时由 sshd 读取(由于它包含在 /etc/hosts.allow 中) .

现在,当您在网络上的某个任意系统上并想通过 ssh 连接到该系统时,首先使用网络浏览器并点击此文件(或使用 wget 或等效):

$ wget http://your.system.name/my-sshd-access.php
Run Code Online (Sandbox Code Playgroud)

现在您应该能够通过 ssh 进入您的系统。如果这是您可能经常通过 ssh 进入的地方,那么读取 /etc/hosts.allow.temporary-sshd-access 文件的内容并将 IP 地址永久添加到 /etc/hosts 将是微不足道的。允许。


Zor*_*che 9

您可能还想查看拒绝主机

仅供参考:OpenSSH 6.7 放弃了tcpwrappers 支持,这意味着 denyhosts 可能不是新安装的解决方案。


小智 8

帮自己一个忙并禁用密码登录。仅使用身份验证密钥(例如 google ssh-keygen - 示例:http : //www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) 您的服务器将更安全,您将更轻松地连接到它(检查 ssh-agent、ssh-add、keychain)并且您将不再是 ssh 暴力攻击的受害者。