在Ubuntu上强化SSH服务器的5条有效技巧

在这篇文章中,我将分享5个技巧,您可以使用这些技巧来保护面向公众的Ubuntu服务器上的SSH。 SSH代表安全壳。 这是管理员登录到远程Unix / Linux服务器的主要方式,也是坏蛋的主要攻击手段之一。 重要的是我们要尽可能地保护它。

检查您的SSH服务器日志

在应用我的技巧之前,您可以通过发出以下命令来查看SSH日志。 的 -u 标志指定我们只想查看属于 ssh 服务单位。

sudo journalctl -u ssh

J 向下滚动 K 向上滚动。 按 F 向下滚动一个全屏, B 向上滚动一个全屏。 按 Q 退出。 如果要直接进入日志末尾,请运行

sudo journalctl -eu ssh

您会看到坏人不断尝试访问您的SSH服务器,如下面的消息所示。

Apr 23 18:58:33 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:35 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:38 sshd[14507]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.170 user=root
Apr 23 18:58:38 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:40 sshd[14507]: Failed password for root from 58.218.198.170 port 63586 ssh2
Apr 23 18:58:41 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:42 sshd[14507]: Failed password for root from 58.218.198.170 port 63586 ssh2
Apr 23 18:58:44 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:45 sshd[14507]: Failed password for root from 58.218.198.170 port 63586 ssh2

提示1:停用Root SSH登录

坏人需要知道用户名才能登录到您的服务器。 每个Linux系统都有一个root用户帐户,因此允许root用户通过SSH登录是一个坏主意。 我们可以创建另一个具有SSH登录和禁用root SSH登录功能的用户。 因此,攻击者必须先破解用户名,然后再尝试强行使用密码。 您可以通过运行以下命令在Ubuntu上创建用户。 更换 username 使用您的首选用户名。 避免使用常见的用户名 admin

sudo adduser username

系统将要求您设置新用户的密码。 接下来,将此用户添加到 sudo 组,以便该用户可以通过以下方式管理服务器 sudo

sudo adduser username sudo

验证此新用户可以通过SSH登录并能够使用 sudo。 然后编辑SSH守护程序配置文件。

sudo nano /etc/ssh/sshd_config

找到以下行:

#PermitRootLogin yes

除掉 # 符号与变化 yesno 禁用root SSH登录。

PermitRootLogin no

保存并关闭此文件。 然后重新启动SSH服务以使更改生效。

sudo systemctl restart ssh

大多数时候,我不使用root帐户,所以我喜欢为root设置一个长而复杂的密码,即使我不记得了。 因为我不想保留由托管服务提供商生成的默认密码。 如果您在托管服务提供商上的帐户被黑,并且恶意行为者可以使用默认的root密码通过VNC控制台访问服务器,该怎么办?

我使用以下命令生成一个32个字符长的随机密码。

openssl rand -base64 32

要更改根密码,请运行

sudo passwd root

如果需要使用root帐户,只需使用以下命令切换到root。 我不必提供 根密码。 我只需要输入 须藤密码 我的用户帐户。

sudo su -

如果攻击者尝试以禁用了SSH(例如root)的用户身份登录,则您将在SSH日志中看到以下行。

Failed password for invalid user root

这里 invalid 表示该用户不存在于系统上或没有SSH登录权限。 如果具有SSH登录权限的用户输入了错误的密码,那么您将看到类似以下的行:

Failed password for username

提示2:使用公钥身份验证和禁用密码身份验证

密码是安全性的弱点,人们会输入错误的密码。 更好的身份验证方法是公用密钥身份验证:将公用密钥上载到服务器,并且只能使用专用密钥进行登录。 有人称其为无密码登录。

要启用公共密钥身份验证和禁用密码身份验证,请参阅以下教程:

  • 在Ubuntu上设置无密码SSH登录的2个简单步骤

提示3:启用两因素身份验证(2FA)

通常,您只需要输入密码或使用SSH密钥即可远程登录Ubuntu服务器。 两因素身份验证(2FA)要求您提供两条信息才能登录,这可以大大提高OpenSSH服务器的安全性。 如今,许多网站和服务(Facebook,Google,Twitter等)都允许用户设置2FA来保护其帐户安全,最好在SSH服务器上启用2FA。

要在Ubuntu上为OpenSSH服务器启用双重身份验证,请查看以下教程。

  • 如何在Ubuntu 18.04、18.10服务器上设置SSH两因素身份验证

提示4:使用Fail2ban阻止重复犯规者

Fail2ban是一组服务器程序和客户端程序,用于限制暴力验证尝试。 从默认的Ubuntu存储库安装它。

sudo apt install fail2ban

安装后,它将自动启动,如下所示:

sudo systemctl status fail2ban

fail2ban-server fail2ban中包含的程序监视日志文件并发出ban / unban命令。 默认情况下,如果客户端5次密码失败,它将禁止客户端的IP地址10分钟。 该禁令是通过添加iptables防火墙规则来完成的。 您可以通过运行以下命令来检查iptables规则。

sudo iptables -L

在下面的屏幕快照中,远程客户端 54.ip-37-187-225.eu 在我的服务器上被禁止。 将拒绝连接端口22 10分钟。 (它可以连接到服务器上其他打开的端口。)

fail2ban规则文件是 /etc/fail2ban/jail.conf。 您无需对其进行编辑,因为默认设置足以防止SSH暴力攻击。 如果要修改默认设置,则应在 /etc/fail2ban/jail.local 文件。

例如,您可以在 jail.local 文件。

[sshd]
enabled = true
maxretry = 3
bantime = 24h
ignoreip = 127.0.0.1/8 ::1/128 12.34.56.78

哪里:

  • maxretry:在过去10分钟内必须禁用IP才能发生的故障数。
  • bantime:有效禁止期限。 请注意,Ubuntu 16.04上的fail2ban版本不支持 h (小时)时间单位,因此您需要使用默认 s (秒)时间单位。
  • ignoreip:不禁止的IP列表

要为所有监狱设置默认值,请将参数放入 [DEFAULT] 代替 [sshd]。 例如,您可以将ignoreip地址放入 [DEFAULT]

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1/128 12.34.56.78

您现在可以删除 ignoreip 来自的参数 [sshd] 监狱,因此,如果您将更多IP地址添加到白名单,则可以将其添加到 [DEFAULT]。 如果您有2个相同的参数,则输入一个 [sshd] 将覆盖另一个 [DEFAULT]

保存并关闭文件。 然后重新加载fail2ban,以使更改生效。

sudo systemctl reload fail2ban

有关fail2ban监狱配置的更多信息,请参见手册页。

man jail.conf

提示5:IP地址白名单

如果只需要登录服务器,为什么要允许其他IP地址登录? 您可以将SSH登录限制为您的IP地址,并拒绝所有其他IP地址。 我的家庭IP地址是动态的,但是我在数据中心中运行着自己的VPN服务器,因此使用VPN时我具有一个静态IP地址。 您甚至可以在同一主机上设置VPN服务器,因此您可以从该服务器的IP地址登录OpenSSH服务器。

OpenSSH服务器可以使用TCP包装程序定义白名单和黑名单。 要允许您的IP地址通过SSH登录,请编辑 /etc/hosts.allow 文件。

sudo nano /etc/hosts.allow

添加允许的IP地址,如下所示。 如果IP地址不在同一范围内,则需要为每个主机分别添加一行。

sshd:192.168.0.0/24
sshd:127.0.0.1
sshd:12.34.56.78

保存并关闭文件。 然后编辑 /etc/hosts.deny 文件。 您可以通过添加以下行来禁止所有其他主机。

sshd:ALL

保存并关闭文件。 您不需要重新加载任何服务。 更改在保存文件时生效。

请注意,编辑 /etc/hosts.allow 文件,否则您可能被锁定在服务器之外。

一段时间后,您可以检查SSH日志。

sudo journalctl -eu ssh

您将看到如下消息,表明TCP Wrappers拒绝了这些IP地址连接到SSH守护程序。

Dec 26 07:57:42 sshd[5962]: refused connect from 37.187.92.192 (37.187.92.192)
Dec 26 07:57:55 sshd[5979]: refused connect from 178.128.71.114 (178.128.71.114)
Dec 26 07:58:00 sshd[5985]: refused connect from 188.120.235.20 (188.120.235.20)
Dec 26 07:58:05 sshd[5991]: refused connect from 181.49.150.45 (181.49.150.45)

使用iptables防火墙限制IP地址

某些Linux发行版(例如Arch Linux)默认不包含TCP包装器。 在这种情况下,您可以使用iptables防火墙创建可以连接SSH端口的IP地址白名单。 防火墙白名单使它看起来好像服务器上的SSH端口已关闭,这是我的首选。

为了防止当前的SSH连接丢失,我们需要使用以下iptables命令允许建立的会话。

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

然后使用以下命令允许您自己的IP地址连接到SSH端口。 将您的IP地址替换为您的真实IP地址,例如74.125.128.103。

sudo iptables -A INPUT -p tcp --dport 22 -s your-ip-address -j ACCEPT

哪里:

  • -A INPUT 用于将上述规则附加到处理传入流量的INPUT链中。
  • -p tcp 指定协议为TCP,因为SSH守护程序侦听TCP端口。
  • --dport 22 指定目标端口为22,这是默认的SSH端口。 如果更改了SSH端口,则还需要在此处调整端口。
  • -s your-ip-address 指定源IP地址。
  • -j ACCEPT 表示跳转到ACCEPT目标,它将允许该SSH连接。

您可以添加多个防火墙规则以允许多个IP地址。 完成之后,运行以下命令拒绝所有其他IP地址以连接到SSH服务器。 我们没有指定源IP地址,这意味着所有其他IP地址都将被禁止。

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

使用以下命令检查iptables防火墙规则。

sudo iptables -L

如果以后要向白名单添加新的IP地址,则需要插入新规则。

sudo iptables -I INPUT -p tcp --dport 22 -s your-ip-address -j ACCEPT

-I 选项用于将上述防火墙规则插入INPUT链。 默认情况下,它将上述规则作为INPUT链中的第一条规则插入。 请注意,如果我们在INPUT链的底部附加一个新规则(-A),则此规则无效,因为它是在“拒绝所有其他IP”规则之后出现的。

如果您使用UFW之类的iptables前端,请参阅以下有关如何创建白名单的教程。

  • Debian,Ubuntu,Linux Mint Server上的UFW防火墙入门

检查上次登录IP地址

PrintLastLog用于告诉您上次登录的时间以及从哪个IP地址开始。 SSH进入服务器后,您可以看到它。 看起来像这样:

Last login: Thu Jun  2 04:10:08 2016 from 12.34.56.78

如果您不识别IP地址,那么您就会知道不正确的地方。 要启用PrintLastLog,请编辑SSH守护程序配置文件。

sudo nano /etc/ssh/sshd_config

并将PrintLastLog设置为yes。

PrintLastLog yes

保存文件并重新启动SSH服务。

如果您被锁定怎么办?

有些人认为您可能会由于应用上述所有提示而被意外锁定。

但是,如果可以物理访问服务器,则不需要SSH登录。即使服务器托管在云中,也可以始终使用VNC登录到服务器。 例如,Hostwinds提供了基于安全的基于Web的VNC控制台,如以下屏幕快照所示。 我使用控制台连接到在Hostwinds上运行的邮件服务器。 此VNC连接不受SSH的影响。

hostwinds vnc控制台

DigitalOcean也提供了基于Web的安全VNC控制台。

加强SSH服务器Ubuntu的5个技巧

Vultr也是如此。

SSH暴力破解

SSH不可用时,您始终可以通过VNC登录。

下一步

我希望本教程可以帮助您在Ubuntu上强化OpenSSH服务器。 这是安全教程系列中的一篇文章。 您可能还想查看其他文章来强化服务器。

  • 在Ubuntu上设置自动安全更新(无人值守升级)
  • Canonical Livepatch Service:无需重新启动即可在Ubuntu上修补Linux内核
  • 如何在Debian,Ubuntu,Linux Mint上使用UFW防火墙

与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂

Sidebar