相信大家对通过 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
,然后按 Y
和 ENTER
退出。要使设置生效,还需要重新启动 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/