在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
除掉 #
符号与变化 yes
至 no
禁用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的影响。
DigitalOcean也提供了基于Web的安全VNC控制台。
Vultr也是如此。
SSH不可用时,您始终可以通过VNC登录。
下一步
我希望本教程可以帮助您在Ubuntu上强化OpenSSH服务器。 这是安全教程系列中的一篇文章。 您可能还想查看其他文章来强化服务器。
- 在Ubuntu上设置自动安全更新(无人值守升级)
- Canonical Livepatch Service:无需重新启动即可在Ubuntu上修补Linux内核
- 如何在Debian,Ubuntu,Linux Mint上使用UFW防火墙
与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂