保护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