保护SSH服务器的最佳方法

保护您的Linux系统的SSH连接,以保护您的系统和数据。系统管理员和家庭用户都需要加固和保护面向互联网的计算机,但SSH可能很复杂。下面是帮助保护您的SSH服务器的十个简单的快速制胜方法。

SSH安全基础知识

SSH代表安全外壳。名称“SSH”可互换使用,表示SSH协议本身或允许系统管理员和用户使用该协议与远程计算机建立安全连接的软件工具。

SSH协议是一种加密协议,旨在通过不安全的网络(如互联网)提供安全连接。Linux中的SSH构建在OpenSSH项目的可移植版本之上。它是在传统的客户端-服务器模型中实现的,SSH服务器接受来自SSH客户端的连接。客户端用于连接到服务器并向远程用户显示会话。服务器接受连接并执行会话。

在其默认配置中,SSH服务器将侦听传输控制协议(TCP)端口22上的传入连接。因为这是一个标准化的、众所周知的端口,所以它是威胁攻击者和恶意僵尸程序的目标。

威胁制造者会启动机器人,扫描一系列IP地址,寻找打开的端口。然后探测端口以查看是否存在可利用的漏洞。认为“我很安全,有比我更大更好的目标可供坏人瞄准”是错误的推理。机器人不是根据任何优点来选择目标;他们是有条不紊地寻找他们可以突破的系统。

如果您没有保护您的系统,您就会将自己指定为受害者。

安全摩擦

安全摩擦是用户和其他人在您实施安全措施时将体验到的刺激(无论程度如何)。我们有很长的记忆力,还记得把新用户介绍给计算机系统,听到他们用惊恐的声音问他们是否真的需要在每次登录主机时输入密码。对他们来说,这是安全摩擦。

(顺便说一句,密码的发明归功于费尔南多·J·科尔巴托(Fernando J.Corbató),他是计算机科学家万神殿中的另一位人物,他的共同工作促成了导致Unix诞生的环境。)

引入安全措施通常会给某些人带来某种形式的摩擦。企业主必须为此买单。计算机用户可能必须改变他们熟悉的做法,或者记住另一组身份验证细节,或者添加额外的步骤才能成功连接。系统管理员将有额外的工作要做,以实施和维护新的安全措施。

加强和锁定类似Linux或Unix的操作系统可能会非常复杂,非常迅速。我们在这里介绍的是一组易于实施的步骤,这些步骤将提高您的计算机的安全性,而不需要第三方应用程序,也不需要挖掘您的防火墙。

这些步骤并不是SSH安全性的最终决定,但它们将使您远离默认设置,而且不会有太多摩擦。

使用SSH协议版本2

2006年,SSH协议从版本1更新到版本2,这是一次重大升级。有如此多的更改和改进,特别是在加密和安全性方面,因此版本2与版本1不向后兼容。要阻止来自版本1客户端的连接,您可以规定您的计算机将只接受来自版本2客户端的连接。

为此,请编辑/etc/ssh/sshd_config文件。我们将在整篇文章中大量介绍这一点。无论何时需要编辑此文件,都可以使用以下命令:

sudo gedit /etc/ssh/sshd_config

添加该行:

Protocol 2

并保存文件。我们将重新启动SSH守护进程。同样,我们将在整篇文章中大量介绍这一点。以下是在每种情况下要使用的命令:

sudo systemctl restart sshd

让我们检查一下我们的新设置是否生效。我们将跳转到另一台机器,并尝试通过SSH连接到我们的测试机器。我们将使用-1命令(协议1)选项强制ssh命令使用协议版本1。

ssh -1 dave@howtogeek.local

太好了,我们的连接请求被拒绝了。让我们确保我们仍然可以使用协议2连接。我们将使用-2(协议2)选项来证明这一事实。

ssh -2 dave@howtogeek.local

SSH服务器正在请求我们的密码这一事实是连接已建立并且您正在与服务器交互的积极指示。实际上,因为现代SSH客户端将默认使用协议2,所以只要我们的客户端是最新的,我们就不需要指定协议2。

ssh dave@howtogeek.local

我们的联系被接受了。因此,只有较弱和较不安全的协议1连接被拒绝。

避免端口22

端口22是SSH连接的标准端口。如果您使用不同的端口,它会通过使您的系统变得模糊不清来增加一点安全性。默默无闻的安全从来不被认为是一种真正的安全措施,我在其他文章中也对此进行了抨击。事实上,一些更聪明的攻击机器人会探测所有开放的端口,并确定它们承载的是哪种服务,而不是依赖于简单的端口查找列表,并假设它们提供通常的服务。但使用非标准端口有助于降低端口22上的噪音和不良流量。

要配置非标准端口,请编辑SSH配置文件:

sudo gedit /etc/ssh/sshd_config

删除“Port”行开头的hash#,并将“22”替换为您选择的端口号。*保存您的配置文件并重新启动SSH守护程序:

sudo systemctl restart sshd

让我们看看这产生了什么效果。在我们的另一台计算机上,我们将使用ssh命令连接到我们的服务器。ssh命令默认使用端口22:

ssh dave@howtogeek.local

我们的连接被拒绝。让我们再试一次,并使用-p(端口)选项指定端口470:

ssh -p 479 dave@howtogeek.local

我们的转机被接受了。

使用TCP包装器过滤连接

TCP包装器是一个易于理解的访问控制列表。它允许您根据连接请求的特征(如IP地址或主机名)排除和允许连接。TCP包装器应该与正确配置的防火墙结合使用,而不是替代。在我们的特定场景中,我们可以通过使用TCP包装器来大大加强。

TCP包装器已经安装在用于研究本文的Ubuntu18.04LTS机器上。它必须安装在Manjaro 18.10和Fedora 30上。

要在Fedora上安装,请使用以下命令:

sudo yum install tcp_wrappers

要在Manjaro上安装,请使用以下命令:

sudo pacman -Syu tcp-wrappers

涉及到两个文件。一个保存允许列表,另一个保存拒绝列表。使用以下命令编辑拒绝列表:

sudo gedit /etc/hosts.deny

这将打开Gedit编辑器,其中加载了拒绝文件。

您需要添加以下行:

ALL : ALL

并保存文件。这会阻止所有未经授权的访问。我们现在需要授权您希望接受的连接。为此,您需要编辑允许文件:

sudo gedit /etc/hosts.allow

这将打开Gedit编辑器,其中加载了Allow文件。

我们已经添加了SSH守护进程名称sshd和我们将允许建立连接的计算机的IP地址。保存文件,让我们看看限制和权限是否生效。

首先,我们将尝试从不在hosts.allow文件中的计算机进行连接:

连接被拒绝。“我们现在尝试从IP地址为192.168.4.23的计算机进行连接:

我们的转机被接受了。

我们这里的例子有点残酷--只有一台计算机可以连接。TCP包装器非常通用,而且比这更灵活。它支持主机名、通配符和子网掩码,以接受来自IP地址范围的连接。我们鼓励您查看手册页。

拒绝没有密码的连接请求

虽然这是一种不好的做法,但是Linux系统管理员可以创建一个没有密码的用户帐户。这意味着来自该帐户的远程连接请求将没有密码可供检查。这些连接将被接受,但未经过身份验证。

SSH的默认设置接受没有密码的连接请求。“我们可以非常容易地更改这一设置,并确保所有连接都经过身份验证。

我们需要编辑您的SSH配置文件:

sudo gedit /etc/ssh/sshd_config

滚动浏览文件,直到看到显示“#PermitEmptyPasswordsno”的行。从行首删除hash#并保存文件。要重新启动SSH后台进程:

sudo systemctl restart sshd

使用SSH密钥而不是密码

SSH密钥提供了登录SSH服务器的安全方法。密码可以被猜测、破解或暴力破解。SSH密钥不会受到此类攻击。

当您生成SSH密钥时,您将创建一对密钥。一个是公钥,另一个是私钥。公钥安装在您要连接的服务器上。私钥,顾名思义,在您自己的计算机上是安全的。

SSH密钥允许您在没有密码的情况下建立连接,这种连接与直觉相反,比使用密码身份验证的连接更安全。

当您发出连接请求时,远程计算机将使用其公钥副本创建一封加密邮件,并将其发送回您的计算机。因为它是使用您的公钥加密的,所以您的计算机可以使用您的私钥对其进行解密。

然后,您的计算机从邮件中提取一些信息,特别是会话ID,对其进行加密,然后将其发送回服务器。如果服务器可以使用您的公钥副本对其进行解密,并且邮件中的信息与服务器发送给您的信息相匹配,则确认您的连接来自您。

这里,使用SSH密钥的用户正在连接到地址为192.168.4.11的服务器。请注意,系统不会提示他们输入密码。

ssh dave@192.168.4.11

SSH密钥本身就是一篇值得一文的文章。很方便,我们为您准备了一个。下面介绍如何创建和安装SSH密钥。

相关:如何从Linux Shell创建和安装SSH密钥

完全禁用密码身份验证

当然,使用SSH密钥的逻辑扩展是,如果强制所有远程用户采用它们,您可以完全关闭密码身份验证。

我们需要编辑您的SSH配置文件:

sudo gedit /etc/ssh/sshd_config

滚动文件,直到看到以“#PasswordAuthentication yes”开头的行。删除该行开头的hash#,将“yes”更改为“no”,然后保存文件。要重新启动SSH守护进程:

sudo systemctl restart sshd

禁用X11转发

X11转发允许远程用户通过SSH会话从您的服务器运行图形应用程序。在威胁行为者或恶意用户手中,GUI界面可以使他们的恶意目的变得更容易。

网络安全中一个标准的口头禅是,如果你没有真正的理由打开它,就把它关闭。我们将通过编辑你的SSH配置文件来做到这一点:

sudo gedit /etc/ssh/sshd_config

滚动文件,直到看到以“#X11 Forwarding No”开头的行。从行首删除hash#并保存文件。要重新启动SSH后台进程:

sudo systemctl restart sshd

设置空闲超时值

如果与您的计算机建立了SSH连接,并且在一段时间内没有任何活动,则可能会带来安全风险。用户有可能已经离开办公桌,正忙于其他地方。任何经过他们办公桌的人都可以坐下来开始使用他们的计算机,并通过SSH开始使用您的计算机。

设立超时限制要安全得多。如果非活动时段与时间限制匹配,则SSH连接将断开。我们将再次编辑您的SSH配置文件:

sudo gedit /etc/ssh/sshd_config

滚动浏览文件,直到看到以“#ClientAliveInterval 0”开头的行。删除该行开头的hash#,将数字0更改为所需的值。我们用了300秒,也就是5分钟。保存文件,然后重新启动SSH守护进程:

sudo systemctl restart sshd

设置密码尝试的限制

定义身份验证尝试次数的限制可以帮助阻止密码猜测和暴力攻击。在指定数量的身份验证请求后,用户将断开与SSH服务器的连接。*默认情况下,没有限制。但这很快就会得到补救。

同样,我们需要编辑您的SSH配置文件:

sudo gedit /etc/ssh/sshd_config

滚动文件,直到看到以“#MaxAuthTries 0”开头的行。删除该行开头的散列#,将数字0更改为所需的值。我们在这里使用了3。当您进行更改并重新启动SSH守护程序时,请保存该文件:

SUDO systemctl重启sshd

我们可以通过尝试连接并故意输入错误密码来测试这一点。

请注意,MaxAuthTries数字似乎比允许用户尝试的次数多1。在两次失败尝试之后,我们的测试用户将断开连接。这是在MaxAuthTries设置为3的情况下进行的。

禁用超级用户登录

在您的Linux计算机上以root用户身份登录是不好的做法。您应该以普通用户身份登录,并使用sudo执行需要root权限的操作。更重要的是,您不应该允许root登录到您的SSH服务器。应该只允许普通用户连接。如果他们需要执行管理任务,他们也应该使用sudo。如果您被迫允许root用户登录,您至少可以强制他们使用SSH密钥。

最后一次,我们将不得不编辑您的SSH配置文件:

sudo gedit /etc/ssh/sshd_config

滚动浏览文件,直到看到以“#PermitRootLogin Prohibit-Password”开头的行,从该行的开头删除hash#。

如果您想要完全禁止root登录,请将“禁止密码”替换为“否”。 如果您打算允许root登录,但强制他们使用SSH密钥,请保留“禁止密码”。

保存更改并重新启动SSH守护程序:

sudo systemctl restart sshd

终极一步

当然,如果您根本不需要在您的计算机上运行SSH,请确保将其禁用。

sudo systemctl stop sshdsudo systemctl disable sshd

如果你不打开窗户,没人能爬进去。

相关文章