如何保护ubuntu服务器免受bruteforce ssh攻击?


21

我的密码很安全,但是我听到有人抱怨暴力攻击发生时服务器性能急剧下降。如何保护ubuntu 10.10服务器免受此类攻击?是否有这个的配置文件?或其他解决方法?

Answers:


19

有不同的解决方案。最好的方法是使用RSA身份验证,该身份验证使用公钥/私钥对用户进行身份验证。

查看此出色的手册以了解不同的方法(包括RSA身份验证):http : //www.la-samhna.de/library/brutessh.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

如前所述这里:这将使三大港口从60秒的时间内任何给定的IP地址22个连接,无需后续连接尝试60秒的时候,才再次恢复允许连接。--rttl选项还会在匹配数据包时考虑数据报的TTL,以努力减轻欺骗性的源地址。

如上述指南所述,最好使用白名单将受信任的用户与这些规则分开:

iptables -N SSH_WHITELIST

然后添加受信任的主机:

iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT

然后制定规则:

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

关于关闭密码认证,如果我松开服务器的公钥,该如何登录服务器?(我没有对服务器的物理访问,它是VPS)
Dziamid 2011年

公钥可以在您想要的任何地方发布,因此不用担心,您可以将其放在可以确保即使在公共场所也不会忘记的地方。
佩德拉姆


是否有一种方法可以设置服务器以在被询问时公开其公钥?
Dziamid 2011年

1
我不这么认为,如果您安装了Web服务器(例如apache),则可以使用Web共享密钥。
佩德拉姆

8

我每天以1到2的速度对服务器进行ssh暴力攻击。我已经安装了denyhosts(ubuntu软件包:denyhosts)。这是一个非常简单但有效的工具:本质上,它会定期扫描日志以检测暴力攻击,并将这些攻击的来源IP放入您的/etc/hosts.deny文件中。您将不会再收到他们的来信,因此您的工作量应大大减少。它可以通过其配置文件/etc/denyhosts.conf进行配置,以调整问题,例如多少次错误尝试构成了攻击等。

由于其透明的工作原理,您可以轻松地看到正在发生的事情(电子邮件通知:“啊哈,另一个卑鄙的攻击阻止了!”),并且可以消除由于用户反复输入密码而造成的错误。

当然,先前有关切换到其他身份验证方法的所有内容仍然有效,但有时您的要求与用户的要求不一致。

同样,与拒绝通过hosts.deny访问相比,iptables中的新连接速率限制可能是一个更好的选择。因此,也请查看一下fail2ban。但是,如果您知道ssh暴力是您的主要关注点(请手动查看/var/log/auth.log来确定这一点),请使用此非常简单且影响较小的工具。


1
我的/var/log/auth.log最近增长很快。这样的条目是否Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=root表示攻击?
Dziamid 2011年

1
好吧,这意味着IP 218.15.136.38的某人试图以root用户身份登录。可能是您,但可能不是因为使用tools.whois.net/whoisbyip,我可以看到此IP在中国注册,这是明斯克的一种方式;-)所以,是的,这看起来像是您对密码的猜测。道德:通过ssh禁用root登录(在/ etc / ssh / sshd_config中为PermitRootLogin no),因为没有充分的理由将其保留。然后考虑denyhosts或fail2ban。另外,请确保您有防火墙,仅允许通过端口22进行基本访问,以及您需要的其他任何信息(但不能更多)
DrSAR 2011年

6
  1. 将sshd端口更改为非标准端口
  2. 使用knockd来实现端口敲门系统
  3. 使用iptables recenthashlimitmatch来限制连续的SSH尝试
  4. 不要使用密码,而应使用SSH密钥

3
-1为第一条建议,使事情变得复杂,实际上并没有真正增加安全性
Steabert 2011年

如果您使用ssh密钥并通过ssh关闭密码身份验证,我真的需要1,2,3吗?
Dziamid

4
@steabert有助于防止脚本小子试图通过端口22暴力破解。这是我的经验:当我在设置面向Internet的服务器时,有人不断对其进行暴力破解,使系统在警告后向我发送警告。我移动了港口,警告消退了。
pepoluan 2011年

@Dziamid ssh密钥可防止某人闯入您的系统。但它并不从试图连接到端口22阻止他们
pepoluan

3
@Dziamid不,不正确。其他身份验证方法(RSA验证,Pubkey验证,#KerberosAuthentication等)通过端口22都还在进行接触
DrSAR

3

首先,您应该考虑不使用密码,而应使用密钥。无需使用密码。如果这对您有用,则可以配置OpenSSH服务器不对密码登录作出反应。

https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html

也可以使用fail2ban。

https://help.ubuntu.com/community/Fail2ban


如果我松开服务器的公钥,该如何连接到服务器?
Dziamid 2011年

1
仅通过控制台或直接访问。我非常确定,如果您能够管理服务器,则不会丢失密钥。
2011年

0

服务器在网络上暴露的范围是多少?也许您可以与网络管理员进行交谈,并检查是否可以监视和限制对服务器的网络访问。即使帐户登录是安全的,服务器似乎也可能遭受简单的DoS / DDoS攻击。


0

fail2ban的替代方法是CSF:ConfigServer安全性和防火墙

它带有LFD:登录失败守护程序,可以检测到各种服务上的多次失败登录尝试,并会阻止(临时或永久)有问题的IP地址。

它具有其他一些选项,可以帮助抵御洪水攻击,并可能检测到入侵。

缺点:

  • 您必须使用CSF作为防火墙,LFD才能执行其工作。因此,如果您有现有的防火墙,则需要用CSF替换它,并移植您的配置。
  • 它不是为Ubuntu打包的。您将必须信任configserver.com上的自动更新,或者禁用自动更新。
  • 我听说它很流行,因此智能入侵者可能会知道如何在检测到入侵之前禁用入侵检测!

0

您是否打算将SSH服务推广到全世界?还是只针对特定地点的团队成员?我的回答取决于您挑战的严重性。

无论哪种情况,您都应该做的一件事就是确保SSH服务器不允许root用户登录密码。

  1. 确保在/ etc / ssh / sshd_config中,除非使用SSH密钥,否则绝不允许root用户登录。

在我的系统中,我有此设置

PermitRootLogin without-password

但我注意到在较新的Ubuntu中

PermitRootLogin prohibit-password

如果您阅读“ man sshd_config”,我认为这意味着这个较新的“ prohibit-password”的含义相同,并且在含义上肯定更为明显。在某些Linux系统上,这不是默认值,但应该是默认值。

现在,关于您的问题。您的系统服务器仅在特定位置有一些用户吗?做这个!

  1. 编辑/etc/hosts.deny并插入

    全部:全部

然后编辑/etc/hosts.allow并列出要允许使用SSH的IP号或范围。这种表示方式有些混乱,因为如果要允许所有IP地址为111.222.65.101到111.222.65.255的系统,则在hosts.allow中放入这样的条目

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

那是一种蛮力,强大的解决方案。如果可以按IP范围枚举您的用户,请执行此操作!

此解决方案在创建IP表之前就已经存在,(我认为)管理起来要容易得多,但它不如IP表解决方案好,因为IP表例程比host.allow和hosts驱动的程序更快地发现敌人。 。拒绝。但这无疑是解决许多问题的简单方法,而不仅仅是SSH。

请注意您为自己创建的问题。如果要打开FTP服务器,Web服务器或其他,则必须在主机中允许输入。

您可以通过摆弄iptables和防火墙来达到相同的基本目的。从某种意义上说,这是一个首选的解决方案,因为您要在外边界处阻止敌人。Ubuntu有“ ufw”(简​​单的防火墙),“ man ufw”有很多示例。我宁愿有一个不错的GUI来解决这个问题,我也不必一直这样做。也许其他人可以告诉我们现在是否有一个。

  1. 此处的其他帖子建议仅对您的用户使用SSH公钥。这肯定会有所帮助,但代价是用户会感到复杂和沮丧。在我们的实验室中,有15台计算机。用户在计算机之间移动。要求SSH密钥身份验证会造成很大的麻烦,因为人们会从一台计算机转到另一台计算机。

当某些用户为各种服务器积累不同的ssh密钥时,将导致另一个沮丧的源头。因为我有大约12个不同项目的SSH密钥,所以ssh现在失败,因为我有太多的公共密钥(要求“ ssh -o PubkeyAuthentication = false”或在.ssh / config文件中创建条目。它是PITA)

  1. 如果您必须使服务器不受SSH的影响,那么绝对应该使用拒绝例程来阻止经常尝试登录的位置。为此,有2个不错的程序,我们使用的是denyhosts和fail2ban 。这些程序的设置可让您在自己喜欢的时间内禁止违法者。

在我们的Centos Linux系统中,我注意到他们删除了denyhosts软件包,只提供了fail2ban。我喜欢denyhosts,因为它建立了麻烦的用户/ ip范围列表,然后在hosts.deny中记录了该列表。我们改为安装了fail2ban,这样就可以了。我的理解是,您宁愿在服务器的外围阻止这些不良用户,因此基于IP表的阻止程序(例如fail2ban)实际上更好。Denyhosts在二级级别上工作,当敌人通过iptables之后,它们将被sshd守护程序拒绝。

在这两个程序中,如果用户忘记密码并尝试几次登录,将他们从监狱中带出来都是一件繁琐的事情。当用户输入错误时,让他们重新登录有点困难。您可能已经猜到会有一个点击式GUI,您可以在其中指向他人并让其返回,但事实并非如此。我只需要每隔几个月做一次,而忘了时间间隔如何,所以我在自己的网页http://pj.freefaculty.org/blog/?p=301上为自己写了说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.