保护Ubuntu OpenSSH服务器免受暴力攻击,但没有防火墙或SSH密钥对?

我使用Ubuntu 16.04并试图以特殊方式强化我的SSH身份validation。

目前的情况:

我有一台带有最小Ubuntu服务器的机器,我主要用于通过其本地OpenSSH服务器传输文件 。 现在,由于一些原因我在该机器上没有防火墙,我也避免使用密钥对,因此我只使用密码。 我离开蛮力攻击的唯一方法之一,也是我目前最渴望的方法之一,是在Y连接尝试后,使用一种阻止用户X小时的机制。

期望的情况:

我希望有一个独立的机制(也就是说,不是防火墙的一部分),在Y连接尝试作为防御暴力攻击的方法之后,阻止用户X小时。

我的问题:

你知道一个实用程序(和特定配置)可以让我达到预期的效果吗?

您可以使用Fail2ban执行此操作:

sudo apt-get install fail2ban 

然后:

 sudo vim /etc/fail2ban/jail.conf 

编辑bantime以设置所需的禁止时间

编辑maxretry以设置最大失败尝试次数

正如其他评论所提到的,fail2ban需要iptables。


单独选项 – 端口敲击:

这只需要iptables,几乎只需要0个内存,并且会有效地隐藏端口扫描服务

没有直接回答你的问题,但也许你可以实现端口敲门来隐藏你的服务可用性,而不是禁止重复尝试。

快速谷歌搜索显示: https : //www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps

你确实需要iptables。

PS:我知道通过默默无闻的安全性根本就没有安全性,但与其他实践一起,它可以帮助你成为一个更难的目标。

这个答案旨在为满足主要问题提供一种可能的方法: 保护Ubuntu OpenSSH服务器免受暴力攻击,但没有防火墙或SSH密钥对?

实际上我更喜欢使用防火墙和SSH密钥对,并找到Doug Smythies提供的答案非常有用。

使用双因素身份validation保护SSH

双因素身份validation(2FA)是一种多因素身份validation 。 在此示例中,2FA通过利用这两个不同组件的组合来确认用户声称的身份:

  • 基于时间的六位令牌代码 – 身份validation代码。 默认情况下,这些令牌适用于30秒,另外还添加60秒以补偿可能的时间偏差。

  • 用户的密码,本身应该足够安全 。

实际上,当你设置了PermitRootLogin no并且用户名很好时,对我来说,这个方法可以称为3FA。

此外,如果您登录的计算机未通过暴力登录尝试进行强化,则可以为身份validation模块启用速率限制。

让我们开始:

1.安装依赖项

 sudo apt-get install libpam-google-authenticator 

2.编辑配置文件

  • 编辑/etc/pam.d/sshd并添加此指令:

     # Google Authenticator auth required pam_google_authenticator.so 

    将其添加到文件的开头。 通过这种方式,系统将询问第一个validation码,然后才会询问密码。 将其添加到文件的末尾 – 系统将询问第一个密码。

  • 编辑/etc/ssh/sshd_config并修改或添加这些指令:

     ChallengeResponseAuthentication yes UsePAM yes PasswordAuthentication no # You can leave this 'yes' it doesn't matter. 

3.为用户激活双因素身份validation

切换到应使用双因素身份validation并键入终端的用户:

 $ google-authenticator 输入

您是否希望身份validation令牌基于时间(y / n) y 输入
 https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DE3CY3TNSNBXXXXXX


您的新密钥是: E3CY3TNSNBXXXXXX
您的validation码为229999
您的紧急刮刮代码是:
   19999711
   ...

您是否要我更新您的“/home/user/.google_authenticator”文件(是/否) y 输入

您是否要禁止多次使用同一身份validation令牌? 这会限制您每30秒登录一次,但会增加您注意甚至阻止中间人攻击的机会 
 (是/否) y 输入

默认情况下,令牌有效30秒,为了弥补客户端和服务器之间可能存在的时间偏差,我们在当前时间之前和之后允许使用额外的令牌。 如果遇到时间同步不佳的问题,可以将窗口从默认大小1:30增加到大约4分钟。 你想这样做吗? 
 (是/否) y 输入

如果您登录的计算机未通过暴力登录尝试进行强化,则可以为身份validation模块启用速率限制 。 默认情况下,这会将攻击者限制为每30秒不超过3次登录尝试。 您想要启用速率限制吗? 
 (是/否) y 输入

此对话框将生成一个名为.google_authenticator的身份validation文件,该文件位于用户的主目录中。 如果您希望所有用户使用相同的令牌,则此文件也可用于其他用户的帐户。 此外,这个文件可以自定义,也可以用于Apache2中的2FA ,但这是另一个故事。

4.生成validation码

在上述步骤中生成的密钥 – E3CY3TNSNBXXXXXX用于在某些应用程序中生成身份validation代码,如下所示:

  • 命令行身份validation器
  • 这里提到的这些桌面应用
  • 此处描述的Web浏览器扩展
  • 适用于Android的Google身份validation器
  • 适用于iPhone / iPad的Google身份validation器

5.使用示例

在此示例中使用了Chromium / Chrome的Authenticator扩展:

在此处输入图像描述

6.进一步阅读

  • 这个答案的主要来源: 如何使用双因素身份validation保护SSH ;
  • 多重身份validation – 除SSH密钥 对外,如何使用OATH-TOTP应用程序 (此处描述的方法)启用SSH身份validation。

编辑:

在某些情况下,谷歌的时钟和服务器的时钟之间可能存在差异。 根据这个问题,这里有一些提示:

  • 什么是从互联网更新时间和日期的命令

  • 日期:无法设置日期:不允许操作

  • Linux:将x秒添加到当前日期

不幸的是 :如果它是VPS,您可能无权执行此操作…如果您使用的是VPS,请与您的提供商联系以便为您处理此问题。

如果您的提供商不想响应您的要求,上述设置将有效,但会有时移。 在服务器的控制台中键入date并测量此时移。 然后,只需在身份validation代码生成时刻和使用时刻之间进行这种时移。

您无需为此类保护安装任何内容 – 只需在iptables系统中添加相关规则即可。

1.先决条件规则:

在规则集的早期,允许任何相关的流量返回到服务器:

 sudo iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT 

2.检测和阻止规则:

设置动态Badguy列表。 检测并丢弃在SSH上进行密码攻击的错误IP。 一旦他们进入BADGUY列表,系统将丢弃所有数据包:

 sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT 
  • 在上面的代码中,90000秒(25小时)是阻止时间。

  • 来自阻止的IP地址的任何尝试,甚至与非SSH相关(取决于您可能拥有或可能没有的其他规则以及顺序),都会重置阻止时间计时器。

3.哈登检测:

将每个连接的错误密码数限制为2.默认值为6。

作为sudo编辑/etc/ssh/sshd_config ,并设置:

  MaxAuthTries 2