如何在 Ubuntu 18.04 上设置通过 SSH 密钥连接(linux通过密钥连接服务器)

如何在 Ubuntu 18.04 上设置通过 SSH 密钥连接(linux通过密钥连接服务器)
如何在 Ubuntu 18.04 上设置通过 SSH 密钥连接

相信大家对通过 SSH 客户端连接服务器都不陌生,这是一种最常见的连接和管理服务器的方式。我们在通过 XShell 等工具连接服务器时,通常会采用账号和密码的登录方式。一旦涉及到密码的问题,也必然存在密码泄露和暴力破解的风险性问题。

我们今天要介绍的通过密钥方式连接服务器,是一种更加安全的连接方式。通过生成一对密钥的方式,将其中的公钥添加到服务器账户,而将私钥存放在本地电脑。这样,在本地通过私钥进行客户端登录,就不会存在密码被泄露和暴力破解的风险。

创建 RSA 密钥对

首先在本地计算机上创建一个密钥对:

ssh-keygen

默认情况下,ssh-keygen 将创建一个 2048 位 RSA 密钥对,这对于大多数情况来说足够安全的。

输入命令后,应该会返回以下输出:

Output
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):

ENTER 将密钥对保存到主目录的 .ssh/ 子目录中,也可以指定其他路径。

如果之前生成过 SSH 密钥对,可能会收到以下提示:

Output
/home/your_home/.ssh/id_rsa already exists.
Overwrite (y/n)?

如果选择覆盖磁盘上的密钥,以前的密钥将无法用于身份验证。

下一步将提示输入安全密码:

Output
Enter passphrase (empty for no passphrase):

这里可以选择输入密码也可以为空,不过建议还是输入密码,这样就多了一层保障。

ssh-keygen 命令将返回如下输出结果:

Output
Your identification has been saved in /your_home/.ssh/id_rsa.
Your public key has been saved in /your_home/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+

现在我们就拥有了一个可用于身份验证的公钥和私钥。下一步要将公钥放置在服务器上,以便可以使用 SSH 密钥的身份验证来登录。

将公钥复制到 Ubuntu 服务器

将公钥复制到 Ubuntu 服务器的最快方法,是使用 ssh-copy-id 。如果本地计算机上没有 ssh-copy-id ,也可以手动进行操作。

使用 ssh-copy-id 复制公钥

ssh-copy-id 工具默认包含在很多操作系统中。执行下面的命令:

ssh-copy-id username@remote_host

可能会收到以下消息:

Output
The 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 继续。

接下来,该程序会扫描本地并查找 id_rsa.pub。当它找到该密钥时,会提示输入远程用户帐户的密码:

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
username@203.0.113.1's password:

在 linux 上输入密码不会有显示,所以直接输入密码并按回车确认即可。然后,它会将您的密钥内容复制到远程帐户主目录下名为 authorized_keys 的文件中。

应该会返回以下输出:

Output
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@203.0.113.1'"
and check to make sure that only the key(s) you wanted were added.

此时,您的id_rsa.pub 密钥就已成功上传到远程帐户。

使用 SSH 复制公钥

如果没有 ssh-copy-id ,但有基于密码的 SSH 访问权限,则可以使用传统的 SSH 方法上传密钥。

可以使用 cat 命令读取本地计算机上的公钥的内容,再通过 SSH 将其通过管道连接到远程服务器。

另一方面,要确保 ~/.ssh 目录存在,并且具有正确的权限。

然后,通过管道将内容输出到目录中的 authorized_keys 文件中。使用 >> 重定向符号在文件上添加内容而不是覆盖它,这样就不会破坏先前添加的密钥内容。

完整的命令显示如下:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

可能会返回以下消息:

Output
The 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
username@203.0.113.1's password:

输入密码后,您的 id_rsa.pub 密钥内容将被复制到远程用户帐户公钥文件的末尾。

手动复制公钥

如果没有基于密码的 SSH 访问服务器权限,则必须手动完成该过程。

在本地计算机上运行以下命令:

cat ~/.ssh/id_rsa.pub

这将在命令的输出中显示密钥的内容:

Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

使用可用的方法访问远程主机。

一旦可以访问远程服务器上的帐户,应该确保 ~/.ssh 目录存在。如果需要,执行下面的命令创建目录,如果目录已经存在,则无需任何操作:

mkdir -p ~/.ssh

现在便可以在目录中创建或修改 authorized_keys 文件。可以将 id_rsa.pub 密钥的内容添加到 authorized_keys 文件的末尾,如果没有该文件就手动创建一个。在下面的命令中,将 public_key_string 替换为刚刚执行 cat ~/.ssh/id_rsa.pub 命令输出的内容:

echo public_key_string >> ~/.ssh/authorized_keys

最后,确保 ~/.ssh 目录和 authorized_keys 文件具有合适的权限:

chmod -R go= ~/.ssh

这会递归地删除~/.ssh/ 目录的所有“组”和“其他”权限。

如果您是使用 root 用户来设置密钥,那么 ~/.ssh 目录应该归属于用户。在下面的命令中,我们的用户名为 sammy:

chown -R sammy:sammy ~/.ssh

使用 SSH 密钥对 Ubuntu 服务器进行身份验证

完成前文所述的工作后,执行下面的命令链接远程主机:

ssh username@remote_host

如果第一次连接到此主机,可能会收到如下信息:

Output
The 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 继续。

如果没有为私钥设置密码,将直接登录远程主机。如果在创建密钥时为私钥设置了密码,系统会提示输入密码。身份验证后,会使用 Ubuntu 服务器上配置的帐户打开一个新的 shell 会话窗口。

在服务器上禁用密码验证

在成功配置服务器使用密钥对进行验证登录后,我们可以禁用服务器使用密码进行验证。

在禁用密码验证前,一定要确保使用密钥登录的用户具有管理权限,比如是 root 用户或者非 root 用户但是具有 sudo 权限。

使用 SSH 密钥连接远程服务器。然后,打开 SSH 守护进程的配置文件:

sudo nano /etc/ssh/sshd_config

在文件中,搜索名为 PasswordAuthentication. 的指令,该指令所在行前面有可能使用 # 注释了。如果前面有 #,删掉该井号并将后面的值设置为 no。这样就禁止服务器使用密码进行登录了。

...
PasswordAuthentication no
...

完成后按 CTRL + X 保存并关闭 nano,然后按 YENTER 退出。要使设置生效,还需要重新启动 sshd 服务:

sudo systemctl restart ssh

作为预防措施,请在关闭当前会话之前,打开一个新的终端窗口并测试 SSH 服务是否正常运行:

ssh username@remote_host

一旦确认 SSH 服务运行正常,就可以关闭所有当前的服务器会话了。这样,在当前的 Ubuntu 服务器上,就已经禁止基于密码的身份验证,只能通过 SSH 密钥进行验证了。

作者:牛奇网,本站文章均为辛苦原创,在此严正声明,本站内容严禁采集转载,面斥不雅请好自为之,本文网址:https://www.niuqi360.com/linux/how-to-set-up-ssh-keys-on-ubuntu/

(0)
上一篇 2022年4月6日 上午9:26
下一篇 2022年4月8日 下午10:59

相关推荐

发表评论

登录后才能评论