我使用 Ubuntu 16.04,并寻求以特殊方式强化我的 SSH 身份验证。
目前的情况:
我有一台最低限度的机器Ubuntu我主要使用的服务器将文件传输到通过其本地OpenSSH服务器。现在,由于一些原因,我没有在该机器上安装防火墙,而且我也避免使用密钥对,因此我只使用密码。我剩下的唯一抵御暴力攻击的方法之一,也是我目前最希望的方法,是使用一种机制,在 Y 次连接尝试后阻止用户 X 小时。
期望的情况:
我希望有一个独立的机制(即不是防火墙的一部分),在尝试连接 Y 次之后,阻止用户 X 小时,以此来防御暴力攻击。
我的问题:
您知道可以让我实现所需情况的实用程序(和具体配置)吗?
答案1
这个答案旨在为解决主要问题提供一种可能的途径:如何在没有防火墙或 SSH 密钥对的情况下保护 Ubuntu OpenSSH 服务器免受暴力攻击?
实际上我更喜欢使用防火墙和 SSH 密钥对,并且发现答案由 Doug Smythies 提供,确实很有用。
使用双因素身份验证保护 SSH
双因素身份验证 (2FA) 是一种多因素身份验证。在此示例中,2FA 通过结合使用以下两个不同组件来确认用户所声称的身份:
基于时间的六位令牌代码 - 身份验证代码。默认情况下,这些令牌的有效期为 30 秒,另外还增加了 60 秒,以补偿可能的时间偏差。
用户密码本身应该是足够安全。
实际上,当你设置好PermitRootLogin no
并且用户名选择好之后,对我来说,这种方法可以称为 3FA。
此外,如果您登录的计算机没有针对暴力登录尝试进行强化,您可以为身份验证模块启用速率限制。
让我们开始:
1.安装依赖项
sudo apt-get install libpam-google-authenticator
2.编辑配置文件
编辑
/etc/pam.d/sshd
并添加此指令:# Google Authenticator auth required pam_google_authenticator.so
将其添加到文件的开头。这样系统将先询问验证码,然后才询问密码。将其添加到文件的末尾 - 系统将先询问密码。
编辑
/etc/ssh/sshd_config
并修改或添加这些指令:ChallengeResponseAuthentication yes UsePAM yes PasswordAuthentication no # You can leave this 'yes' it doesn't matter.
3. 为用户激活双重身份验证
切换到应该使用双因素身份验证的用户并在终端中输入:
$ google-authenticatorEnter 您是否希望身份验证令牌基于时间 (y/n)yEnter https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DE3CY3TNSNBXXXXXX 您的新密钥是:E3CY3TNSNBXXXXXX 您的验证码是229999 您的紧急刮刮卡代码是: 19999711 ... 您是否希望我更新您的“/home/user/.google_authenticator”文件 (y/n)yEnter 您是否要禁止多次使用同一个身份验证令牌?这会限制您每 30 秒登录一次,但这会增加您发现甚至阻止中间人攻击的机会 (是/否)yEnter 默认情况下,令牌的有效期为 30 秒,为了补偿客户端和服务器之间可能的时间偏差,我们允许在当前时间之前和之后使用额外的令牌。如果您遇到时间同步不佳的问题,您可以将窗口从默认大小 1:30 分钟增加到大约 4 分钟。您想这样做吗 (是/否)yEnter 如果你登录的计算机没有经过强化针对暴力登录尝试,你可以启用速率限制用于身份验证模块。默认情况下,这会限制攻击者每 30 秒最多尝试登录 3 次。是否要启用速率限制 (是/否)yEnter
此对话框将生成一个名为的身份验证文件,.google_authenticator
放置在用户的主目录中。如果您希望所有用户帐户都使用相同的令牌,则此文件也可用于其他用户的帐户。此外,此文件可以自定义,也可以用于Apache2 中的 2FA,不过那是另外一个故事。
4. 生成验证码
上述步骤中生成的密钥E3CY3TNSNBXXXXXX
——用于某些应用程序内的身份验证码生成,例如:
5. 使用示例
在此示例中,使用了 Chromium/Chrome 的 Authenticator 扩展:
6. 进一步阅读
- 本答案的主要来源:如何使用双因素身份验证保护 SSH;
- 多重身份验证- 如何使用OATH-TOTP 应用程序(此处描述的方法)除了SSH 密钥对。
编辑:
在某些情况下,Google 的时钟和服务器的时钟可能会有差异。以下是针对此问题的一些提示:
很遗憾:如果是 VPS,您可能没有权限执行此操作...如果您正在使用 VPS,请联系您的提供商为您处理此问题。
如果您的提供商不想响应您的要求,上述设置将起作用,但需要时间偏移。输入date
服务器的控制台并测量此时间偏移。然后只需使用身份验证代码生成时刻和使用时刻之间的时间偏移即可。
答案2
你可以使用 Fail2ban 执行此操作:
sudo apt-get install fail2ban
然后:
sudo vim /etc/fail2ban/jail.conf
编辑bantime
以设置您想要的禁令时间
编辑maxretry
以设置最大失败尝试次数
正如其他评论所提到的,fail2ban 需要 iptables。
单独选项--端口敲击:
这只需要 iptables,几乎不占用任何内存,并且可以有效地隐藏你的服务,避免被端口扫描
没有直接回答您的问题,但也许您可以实施端口敲击来隐藏您的服务可用性,而不是禁止重复尝试。
通过谷歌快速搜索可以发现这一点: https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps
但你确实需要 iptables。
附言:我知道通过隐蔽性实现的安全性根本不安全,但结合其他做法,它可以使您成为更难以攻击的目标。
答案3
您无需安装任何东西即可获得此类保护 - 只需在您的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 edit/etc/ssh/sshd_config
并设置:
MaxAuthTries 2