什么是 SSH?SSH,或 Secure Shell,是一种网络协议,允许用户通过 Internet 远程管理他们的服务器或计算机,其中两台机器之间的通信被高度加密并防止被窃听。用户在他或她的机器上运行客户端,网络连接将用户的击键和命令从用户的本地机器传送到远程服务器。然后网络连接将服务器的响应传回给用户。
与使用不受保护的网络协议(如 telnet 和 rlogin)远程管理计算机的旧方法相比,SSH 提供了一种安全的替代方法,可以替代不安全的网络连接(如 Internet)。如今,SSH 在大多数(如果不是全部)服务器中都有提供。
用户可以通过运行 PuTTY 客户端、终端、Bash 或任何其他客户端,通过 SSH 输入用户名和密码来连接到远程服务器。然而,还有一个比每次连接到远程服务器时都输入密码更安全、更简单的选择,即在所述 SSH 服务器上使用 SSH 公钥进行身份验证。
什么是 SSH 公钥身份验证以及它们如何工作?
SSH 服务器可以通过多种方式对用户进行身份验证,其中最常用的方法是通过密码和公钥身份验证。
通常,用户如何安全地连接到他们的服务器是打开 PuTTY/Terminal/Bash 并通过使用 GUI 登录或在终端中键入 ssh username@IPAddress 来启动 SSH 连接,然后继续输入密码提示时。
但是,当您想登录到远程服务器时,不是在 PuTTY/Terminal 客户端中键入密码,而是另一种安全身份验证的方法是使用 SSH 公钥进行身份验证,这是在不键入密码的情况下进行身份验证。
SSH 密钥身份验证成对工作:私钥和公钥。与对称加密(加密和解密使用相同的密钥)不同,SSH 密钥认证采用非对称加密算法,加密和解密使用不同的密钥。
用户(或授权人)需要生成私钥和公钥。私钥必须安全保密,不得与任何其他人共享。如果私钥被泄露,它几乎就像消失了一样,因为恶意用户可能会使用私钥访问远程服务器,而且如果私钥不受任何密码保护。
与私钥一起生成的公钥可以与任何服务器共享。然后使用SSH协议将公钥上传到用户要登录的远程服务器。因此,关系也可能是这样的;一把私钥对一把公钥放置在许多服务器中。
另一个有权访问公钥的人并不意味着他/她可以解密消息。只有拥有私钥的用户才能解密消息。公钥仅用作加密消息的一种方式,消息只能由拥有私钥的人解密。可以肯定地说,私钥不能从公钥中导出。因此,公钥无法解密它发出的消息,甚至无法解密私钥加密的消息。
因此,如果用户使用 SSH 密钥进行身份验证(而不是手动输入密码),服务器将向用户发送加密的质询语句,然后用户将使用私钥解密消息,然后将其发送回远程服务器进行检查。然后服务器将验证消息是否被正确解密,如果它与之前的质询语句匹配,则客户端通过身份验证。
基本上,远程 SSH 服务器正在测试客户端是否具有与该远程服务器上的公钥相关联的正确私钥。如果客户端能够证明它拥有正确的私钥,那么客户端就通过了身份验证。
为什么使用 SSH 密钥而不是密码进行身份验证?
不可否认,使用 SSH 公钥进行身份验证比使用密码进行身份验证的主要优势在于安全性。无论密码有多长或多复杂,它永远不能等同于 SSH 公钥提供的加密强度。密码容易受到恶意用户的暴力攻击,或者更糟的是,密码甚至可以被知道可用于找回密码的用户个人信息的人猜测。
此外,使用 SSH 公钥还可以消除用户必须记住或写下复杂密码的需要。如果用户需要多次访问远程服务器而无需在每次登录时(或会话因空闲时间断开连接时)多次输入密码,公钥身份验证还允许非交互式登录,因为以及自动化需要来自远程机器的身份验证的过程。
最佳实践
但是,如果私钥没有保存在安全的地方,那么上述所有优点都毫无意义。为了提高安全性,建议将私钥存储在智能卡或 USB 令牌等加密设备上,而不是将私钥存储在硬盘上,这样如果未经授权的用户恶意用户无法访问它获得对计算机的访问权限。此外,可以使用密码加密私钥。但这仅适用于交互式登录(对于非自动化任务),因为它可能需要一个人输入密码才能使用私钥。
由于创建一对 SSH 密钥需要最少的工作,通常情况下,不必要地生成或重新生成密钥(在许多情况下,自行配置)只是为了解决小问题。如果任其发展,这可能会导致无法管理的混乱,其中有许多公钥却不知道它们与谁相关联,也不知道该人是否仍被授权访问服务器。