前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。
SSH是一种加密协议,用于管理服务器并与服务器通信。虽然登录 SSH 服务器的方式有多种,下面我们将重点关注设置 SSH 密钥。
SSH 密钥提供了一种极其安全的登录服务器的方式。
SSH 服务器可以使用多种不同的方法对客户端进行身份验证。其中最基本的是密码身份验证,它易于使用,但不是最安全的。
尽管密码以安全的方式发送到服务器,但它们通常不够复杂或不够长,不足以抵御重复、持续的攻击。现代处理能力与自动化脚本相结合,暴力破解受密码保护的帐户很常见。尽管还有其他方法可以增加额外的安全性(fail2ban
等等),但 SSH 密钥被证明是一种可靠且安全的替代方案。
SSH 密钥对是两个加密安全密钥,可用于向 SSH 服务器验证客户端的身份。每个密钥对由公钥和私钥组成。
私钥由客户保留,并应绝对保密。对私钥的任何泄露都将允许攻击者登录到配置有关联公钥的服务器,而无需进行额外的身份验证。作为额外的预防措施,可以使用密码在磁盘上对密钥进行加密。
关联的公钥可以自由共享,不会产生任何负面后果。公钥可用于加密只有私钥才能解密的消息。该属性被用作使用密钥对进行身份验证的一种方式。
公钥已上传到我们希望能够使用 SSH 登录的远程服务器。该密钥被添加到我们将登录的用户帐户内的一个特殊文件中,如:~/.ssh/authorized_keys
.
当客户端尝试使用 SSH 密钥进行身份验证时,服务器可以测试客户端是否拥有私钥。如果客户端可以证明它拥有私钥,则会生成 shell 会话或执行请求的命令。
配置服务器的 SSH 密钥身份验证的第一步是在本地计算机上生成 SSH 密钥对。
为此,我们可以使用一个名为ssh-keygen
的特殊实用程序,它包含在标准 OpenSSH 工具套件中。默认情况下,这将创建 3072 位 RSA 密钥对。
在本地计算机上,通过键入以下内容生成 SSH 密钥对:
ssh-keygen
OutputGenerating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
该实用程序将提示选择将生成的密钥的位置。默认情况下,密钥将存储在用户主目录中的~/.ssh
目录中。私钥将被id_rsa
调用,关联的公钥将被id_rsa.pub
调用。
通常,在此阶段最好坚持使用默认位置。这样做将允许 SSH 客户端在尝试进行身份验证时自动找到 SSH 密钥。如果想选择非标准路径,请立即输入,否则,请按ENTER
接受默认值。
如果之前已生成过 SSH 密钥,可能会看到如下所示的提示:
Output/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?
如果选择覆盖磁盘上的密钥,将无法再使用以前的密钥进行身份验证。选择“是”时要非常小心,因为这是一个无法逆转的破坏性过程。
OutputCreated directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
接下来,系统将提示输入密钥的密码。这是一个可选密码,可用于加密磁盘上的私钥文件。
既然要输密码了,那么为什么还要用SSH密钥?原因如下:
由于私钥永远不会暴露于网络并通过文件权限进行保护,因此除自己(和根用户)之外的任何人都不应访问此文件。如果这些条件受到损害,密码可作为额外的保护层。
密码是可选的添加项。如果我们输入一个,则每次使用此密钥时都必须提供它(除非正在运行存储解密密钥的 SSH 代理软件)。这里建议使用密码,但如果不想设置密码,可以按ENTER
绕过此提示。
OutputYour identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname
The key's randomart image is:
+---[RSA 3072]----+
|o ..oo.++o .. |
| o o +o.o.+... |
|. . + oE.o.o . |
| . . oo.B+ .o |
| . .=S.+ + |
| . o..* |
| .+= o |
| .=.+ |
| .oo+ |
+----[SHA256]-----+
到这里我们已经拥有可用于进行身份验证的公钥和私钥。下一步是将公钥放在服务器上,以便可以使用 SSH 密钥身份验证登录。
有多种方法可以将公钥上传到远程 SSH 服务器。我们使用的方法很大程度上取决于可用的工具以及当前配置的详细信息。
以下方法都产生相同的最终结果。首先描述最简单、最自动化的方法,随后的方法都需要额外的手动步骤。
ssh-copy-id
将公钥复制到现有服务器的最简单方法是使用名为ssh-copy-id
的实用程序。由于其简单性,如果可用,建议使用此方法。
该ssh-copy-id
工具包含在许多发行版的 OpenSSH 软件包中,因此本地系统上可能已提供该工具。要使此方法发挥作用,当前必须具有对服务器的基于密码的 SSH 访问权限。
要使用该实用程序,需要指定要连接的远程主机,以及具有基于密码的 SSH 访问权限的用户帐户。
输入:
ssh-copy-id username@remote_host
会看到这样的消息:
OutputThe authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
这意味着本地计算机无法识别远程主机。这将在第一次连接到新主机时发生。键入yes
并按ENTER
继续。
接下来,该实用程序将扫描本地帐户以查找我们之前创建的密钥。当它找到密钥时,它会提示输入远程用户帐户的密码:
Output/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
输入密码(出于安全目的,输入内容不会显示)并按ENTER
。该实用程序将使用提供的密码连接到远程主机上的帐户。然后,它会将密钥内容复制到远程帐户主目录中名为~/.ssh``authorized_keys
的~/.ssh/id_rsa.pub
文件中。
我们将看到如下所示的输出:
OutputNumber of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
此时,id_rsa.pub
密钥已上传到远程帐户。
如果没有ssh-copy-id
可用的帐户,但可以通过基于密码的 SSH 访问服务器上的帐户,则可以使用传统的 SSH 方法上传密钥。
我们可以通过在本地计算机上输出公共 SSH 密钥的内容并通过 SSH 连接将其传输到远程服务器来实现此目的。另一方面,我们可以确保该~/.ssh
目录存在于我们正在使用的帐户下,然后将我们通过管道传输的内容输出到authorized_keys
该目录中调用的文件中。
我们将使用>>
重定向符号附加内容而不是覆盖它。这将使我们能够添加密钥而不会破坏之前添加的密钥。
完整的命令如下所示:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
可能会看到这样的消息:
OutputThe authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
这说明本地计算机无法识别远程主机。这将在第一次连接到新主机时发生。键入yes
并按ENTER
继续。
之后,系统将提示输入尝试连接的帐户的密码:
[email protected]'s password:
输入密码后,密钥内容将被复制到远程用户帐户的文件id_rsa.pub
末尾。
如果已成功完成上述过程之一,则无需远程帐户密码即可登录远程主机。
登录就行,没啥说的:
ssh username@remote_host