题 每天进行数百次闯入尝试是否正常?


我刚检查了我的服务器 /var/log/auth.log 并发现我每天收到超过500封失败的密码/闯入尝试通知!我的网站很小,其网址不明显。这是正常的吗?我应该采取任何措施吗?


196
2018-03-08 11:26




在我们锁定所有不必要的外部端口之前,我记得我们不仅尝试了很多黑客攻击,而且有一天我们被两个不同国家的黑客攻击了 - 同时!所以,是的,100次闯入尝试是完全正常的。 - Django Reinhardt
我们的服务器每16秒就会遇到一次新的攻击“序列”。单个序列通常是在各个端口上进行大约100次尝试的批次。仅仅为了一天,我在防火墙外打开了一个未修补的服务器;它开机时间不到10分钟就可以获得pwnd。点是互联网真的是一个丛林;尽量不要被吃掉。 - NotMe
我可以看到我将我的问题发布到错误的网站: superuser.com/questions/200896/... - Justin C
虽然我同意其他人的意见,这在所需的公共端口上是正常的(80,443)我实际上通过简单地将默认端口从22改为例如6022这样模糊的东西来消除对我的SSH端口的这些尝试。仅仅这样做,几乎消除了99%的那种类型的攻击。 - Kilo
如果您要更改SSH端口,则有安全理由将其保持在端口1024以下(只有root可以打开端口<1024,因此它可以保护您免受其他用户劫持SSH)。 - Brendan Long


答案:


在今天的互联网上,这很可悲。有大量僵尸网络试图登录他们在整个IP网络中找到的每个服务器。通常,他们对众所周知的帐户(如root或某些应用程序帐户)使用简单的字典攻击。

攻击目标不是通过Google或DNS条目找到的,但攻击者只是尝试某个子网中的每个IP地址(例如已知的根服务器托管公司)。因此,您的URL(因此DNS条目)相当模糊并不重要。

这就是为什么它如此重要:

  • 在SSH中禁止root登录(如何
  • 在任何地方使用强密码(也在您的Web应用程序中)
  • 对于SSH,如果可能,请使用公钥验证并完全禁用password-auth(如何

此外,您可以安装 的fail2ban 它将扫描authlog,如果它从IP中发现一定数量的失败登录尝试,它将继续将该IP添加到 /etc/hosts.deny 或者iptables / netfilter,以便将攻击者锁定几分钟。

除了SSH攻击之外,扫描您的Web服务器以查找易受攻击的Web应用程序(一些博客应用程序,CMS,phpmyadmin等)也变得越来越普遍。因此,请务必保持最新和安全配置!


207
2018-03-08 11:35



诸如fail2ban之类的应用程序可以帮助很多人“暂时”阻止那些机器人在早上愚蠢时间点击你的服务器:-)我已经设置了禁止3次错误尝试24小时。 - emtunc
并将ssh的端口从22移动到222.这非常有效。 - Tom O'Connor
+1,仅限公钥认证:) - 0xC0000022L
@STATUS_ACCESS_DENIED:fail2ban采取的操作只是要运行的shell命令列表。因此,使用任何自定义配置都可以非常灵活且轻松地正常工作。最好的参考是下载并查看 action.d/iptables.conf。 - mattdm
阻止这样的攻击者是浪费时间。如果您禁用root登录,很可能没有人会猜到您正确的登录名,更不用说密码了。 SSH本身已经是限速密码请求,所以即使他们知道你的用户名(随机机器人不会),如果你有一个不错的密码,他们也永远不会猜到它。 - Brendan Long


几百只就好了......上个月我发现我的一台服务器尝试了40k次失败。我去绘制它们的麻烦: 地图

一旦我更改了ssh端口并实现了Port Knocking,数字就降为0 :-)


58
2018-03-08 11:36



不错的地图。我很想知道怎么做! - jftuga
@jftuga我首先从日志中获取了所有IP。 grep 'Failed password' /var/log/secure* | grep sshd | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort | uniq(如果要允许重复,请删除最后的| uniq)。然后,您可以将它们放入CSV并将其上传到zeemaps.com。我已经看到了比我更好的地图,他们会使用计数为地图上色(绿色到红色表示每个县的尝试次数)但是我还没有看到那个 - Bart De Vos
你实施的“Port Knocking”是什么意思?有没有我可以通过apt-get安装的应用程序来执行此操作?数字下降到0听起来不错
通过默默无闻的安全得到了很好的包装。只要它很长,它就完美无缺 部分 整体战略而不是整个战略。毕竟,除了一个不起眼的字符串之外还有什么密码? - Joel Coel
@Joel Coel,这是一个 秘密 字符串,而不是通过默默无闻问题的大多数安全 - 一个模糊但不一定是秘密的过程。 - tobyodavies


我只使用“tarpit”,只允许公钥认证和禁止root登录。

netfilter 有一个 recent 模块,你可以使用(INPUT 链):

iptables -A INPUT -i if0 -p tcp --dport 22 -m state --state NEW -m recent --set --name tarpit --rsource
iptables -A INPUT -i if0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 6 --name tarpit --rsource -j DROP
iptables -A INPUT -i if0 -p tcp --dport 22 -j ACCEPT

这样做的是,每次连接到端口22的尝试都列在 recent 带有IP和其他一些名为“tarpit”的东西的模块(如果你很好奇,请看看 /proc/net/xt_recent/tarpit)。显然你可以使用其他名字。

要列出或除名IP,请使用:

echo "+123.123.123.123" > /proc/net/xt_recent/tarpit
echo "-123.123.123.123" > /proc/net/xt_recent/tarpit

此速率限制尝试在300秒内完成5次。请注意,具有现有连接的用户不会受到该限制的困扰,因为他们已经建立了连接并且可以创建更多(甚至高于速率限制)。

根据您的喜好调整规则,但要确保按顺序添加规则(即添加时按顺序使用它们,然后以相反的顺序插入)。

这极大地减少了噪音。与改变端口的感知安全性不同,它还提供实际安全性(防止暴力破坏)。但是,如果在您的环境中可行,我仍然建议您更改端口。它还会大大降低噪音水平......

你仍然可以将它与fail2ban结合起来,虽然我已经运行得很好而没有它,只有上述规则。

编辑:

可以锁定你自己这样做,所以你可以添加类似下面的内容,让你通过敲击一个特定的端口来清除你的禁令:

iptables -A INPUT -i if0 -p tcp --dport <knockport> -m state --state NEW -m recent --name tarpit --remove

29
2018-03-08 14:24



我使用它并设法偶尔阻止自己,所以想设置另一个端口,你可以“敲门”来清除你的禁令。 - benlumley
@benlumley:好点。端口敲击对于更改默认端口同样有用 - 甚至可以将它们组合在一起...... - 0xC0000022L
@benlumley:看到你的评论(现在由Sam删除)。如果答案得到编辑/改进,我绝对不介意;) - 0xC0000022L


你可以实施 的fail2ban或者类似的方法,例如将SSH锁定到您的IP。可悲的是,机器人一直试图强行访问,所以这很正常,你需要确保你有一个好的密码。


15
2018-03-08 11:32



如果您使用的是SSH,请考虑使用公钥认证。这比密码验证更安全。 - Piskvor


。现在这很正常。

如果可能,请仅出于管理目的使用公钥认证。在您的工作站上生成私钥:

$ ssh-keygen -t dsa

Copypaste的内容 把〜/ .ssh / id_dsa.pub 对你的服务器 的〜/ .ssh / authorized_keys中 (和/root/.ssh/authorized_keys,您是否需要直接root登录)。

配置您的服务器 的/ etc / SSH / sshd_config中 仅接受公钥认证:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin without-password

如果您有太多服务器,则可以使用 木偶 向他们运行公钥和配置。

调查 的DenyHosts 和 的fail2ban 阻止重复的SSH登录尝试并查看  如果您需要完整的IDS / IPS。


12
2018-03-09 23:32



我不建议在SSH中使用公钥认证来访问您的服务器。如果您的工作站遭到入侵或者甚至更糟,那么现在有人可以在不需要密码的情况下对您的服务器进行开放访问。公钥认证更适用于需要类似脚本或程序的情况,以便能够在不需要密码的情况下对另一个系统进行SSH访问,因此您不必在脚本/程序中嵌入纯文本密码。 - Registered User
@Deleted帐户:您可以为SSH私钥设置密码。 - Phil Cohen
“注册用户”的评论被误导。只是为了澄清:始终在私钥上设置好密码,不要将私钥存储在任何服务器上。将私钥保存在您自己的工作站上。将密钥添加到ssh-agent程序并输入密码后,您可以登录到安装了公钥的每个系统,而无需重新输入密码。在ssh客户端中启用代理转发,以便您可以从服务器登录到服务器。让你的私钥被盗是很糟糕的,但是如果有一个不错的密码,它就没有被盗密码那么糟糕。 - Martijn Heemels
是的,甚至不认为存储管理员的私钥未加密。 - yarek


使用 http://denyhosts.sourceforge.net/

是的,您应该使用公钥验证并禁用密码验证。


8
2018-03-09 09:37



禁用密码身份验证并不总是可行的解决方案。 - Publiccert


尝试是机械化的,所以数字似乎没问题(是的,它们与某些网站相比较高,而与其他网站相比较低)。您应该采取通常所需的步骤:即使您没有检测到攻击,您也会将您的站点视为每天的攻击目标; 没有检测到攻击,并不意味着它不存在


6
2018-03-08 11:33