介绍
安全外壳协议(或 SSH)是一种加密网络协议,它允许用户通过不安全的网络安全地访问远程计算机。
尽管 SSH 支持基于密码的身份验证,但通常建议您改用SSH 密钥。SSH 密钥是一种更安全的登录 SSH 服务器的方法,因为它们不易受到常见的暴力密码黑客攻击。
生成 SSH 密钥对会创建两个长字符串:公钥和私钥。您可以将公钥放在任何服务器上,然后使用可以访问私钥的 SSH 客户端连接到服务器。
当公钥和私钥匹配时,SSH 服务器无需密码即可授予访问权限。您可以通过使用可选(但强烈建议)密码保护私钥来进一步提高密钥对的安全性。
注意:如果您正在寻找有关在您的 DigitalOcean 帐户中设置 SSH 密钥的信息,请参阅我们关于 SSH 密钥的 DigitalOcean 产品文档
步骤 1 — 创建密钥对
第一步是在客户端机器上创建一个密钥对。这可能是您的本地计算机。在本地命令行中键入以下命令:
- ssh-keygen -t ed25519
OutputGenerating public/private ed25519 key pair.
您将看到密钥生成过程已开始的确认信息,并提示您输入一些信息,我们将在下一步中讨论这些信息。
注意:如果您使用的是不支持创建ed25519
密钥对的旧系统,或者您连接的服务器不支持它们,您应该创建一个强rsa
密钥对:
- ssh-keygen -t rsa -b 4096
这会将-t
“type”标志更改为rsa
,并添加-b 4096
“bits”标志以创建 4096 位密钥。
第 2 步 – 指定保存密钥的位置
ssh-keygen
命令的第一个提示将询问您保存密钥的位置:
OutputEnter file in which to save the key (/home/sammy/.ssh/id_ed25519):
您可以按ENTER
此处将文件保存到.ssh
您的主目录中的默认位置。
或者,您可以通过在提示后键入并点击 来选择另一个文件名或位置ENTER
。
第 3 步 – 创建密码
来自的第二个也是最后一个提示ssh-keygen
将要求您输入密码:
OutputEnter passphrase (empty for no passphrase):
是否要使用密码取决于您,但强烈建议您这样做:密钥对的安全性,无论加密方案如何,仍然取决于其他人无法访问的事实。
如果没有密码短语的私钥落入未经授权的用户所有,他们将能够登录到您使用相关公钥配置的任何服务器。
拥有密码短语的主要缺点——输入它——可以通过使用ssh-agent
服务来缓解,该服务将临时存储您的解锁密钥并使其可供 SSH 客户端访问。其中许多代理与您操作系统的本机钥匙串集成,使解锁过程更加无缝。
回顾一下,整个密钥生成过程如下所示:
- ssh-keygen -t ed25519
OutputGenerating public/private ed25519 key pair.
Enter file in which to save the key (/home/sammy/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sammy/.ssh/id_ed25519
Your public key has been saved in /home/sammy/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:EGx5HEXz7EqKigIxHHWKpCZItSj1Dy9Dqc5cYae+1zc sammy@hostname
The key's randomart image is:
+--[ED25519 256]--+
| o+o o.o.++ |
|=oo.+.+.o + |
|*+.oB.o. o |
|*. + B . . |
| o. = o S . . |
|.+ o o . o . |
|. + . ... . |
|. . o. . E |
| .. o. . . |
+----[SHA256]-----+
公钥现在位于. 私钥现在位于./home/sammy/.ssh/id_ed25519.pub
/home/sammy/.ssh/id_ed25519
第 4 步 – 将公钥复制到您的服务器
生成密钥对后,就可以将公钥放在要连接的服务器上。
您可以authorized_keys
使用该ssh-copy-id
命令将公钥复制到服务器的文件中。确保替换示例用户名和地址:
- ssh-copy-id sammy@your_server_address
命令完成后,您将能够通过 SSH 登录服务器,而不会被提示输入密码。但是,如果您在创建 SSH 密钥时设置了密码,则届时将要求您输入密码。这是您的本地ssh
客户端要求您解密私钥,而不是远程服务器要求您提供密码。
第 5 步 – 禁用基于密码的 SSH 身份验证(可选)
将 SSH 密钥复制到服务器后,您可能希望通过将 SSH 服务器配置为禁用基于密码的身份验证来完全禁止密码登录。
警告:在禁用基于密码的身份验证之前,请确保您可以使用 SSH 密钥成功登录服务器,并且服务器上没有其他用户使用密码登录。
要禁用基于密码的 SSH 身份验证,请打开 SSH 配置文件。它通常位于以下位置:
- sudo nano /etc/ssh/sshd_config
此命令将在nano
文本编辑器中打开文件。在文件中找到包含PasswordAuthentication
的行(如果不存在则创建该行),确保没有#
在该行的开头用 a 注释掉,并将其更改为no
:
PasswordAuthentication no
完成后保存并关闭文件。在 中nano
,使用CTRL+O
保存,点击ENTER
确认文件名,然后CTRL+X
退出。
重新加载sshd
服务以使这些更改生效:
- sudo systemctl reload sshd
在退出当前的 SSH 会话之前,请在另一个终端中进行测试连接以验证您仍然可以连接。
结论
在本教程中,我们创建了一个 SSH 密钥对,将我们的公钥复制到服务器,并且(可选)完全禁用了基于密码的身份验证。
有关 SSH 和 SSH 服务的更多信息,包括如何设置多因素身份验证,请阅读我们的相关教程: