添加该行:
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 sshd
sudo systemctl disable sshd
如果你不打开窗户,没人能爬进去。