SSH 提供了两种安全认证的方式:

  1. 口令认证:使用用户名和密码来认证;
  2. 密钥认证:通过一对密钥(公钥和私钥)来进行认证。

密钥认证方式的安全性更高,且避免了每次都要输入密码的繁琐。本文讲解如何为 Linux 服务器配置 SSH 密钥认证方式,并禁用传统的口令认证方式。

本文地址:https://www.jeddd.com/article/set-ssh-key.html

原理

首先,我们来简单地了解一下 SSH 密钥认证的基本原理。

SSH 密钥采用 RSA 加密算法,它是一种非对称加密算法。在这种加密方案中存在一对密钥,分别是公钥私钥,通信的双方各保存一个密钥,服务器上保存的是公钥,而用户电脑(客户端)上保存的是私钥。公钥用来加密信息,这种加密是单向的——用公钥加密的信息,无法用公钥解开,而只能使用私钥解密。

当用户要通过密钥登陆 SSH 时,进行以下过程:

  1. 客户端向服务器发送登录请求;
  2. 服务器生成一段随机字符串,并用公钥将其加密后发送给客户端;
  3. 客户端尝试用自己的私钥解密,若解密成功,将解密后的信息发送回服务器;
  4. 服务器验证客户端发来的解密后的信息,若与服务器最初生成的相同,则认证成功。

关于非对称加密的原理,可以阅读这一篇浅显易懂的文章:《「非对称加密」到底是个什么玩意儿》。

本文地址:https://www.jeddd.com/article/set-ssh-key.html

生成密钥对

在客户端执行以下命令,生成一对新的密钥:

ssh-keygen

然后根据提示操作即可,可以参考下图:

①:保存密钥的文件路径。保持默认直接回车即可。

②和③:Passphrase。以后登陆时要输入一个密码短语,可以设置得简单一些,也可以留空直接回车。

以上过程执行完毕后,SSH 密钥对就创建成功了。根据上图可以看到,生成的私钥文件为 ~/.ssh/id_rsa(私钥文件非常重要,不可外泄),公钥文件为 ~/.ssh/id_rsa.pub

将公钥部署至服务器

将公钥文件 id_rsa.pub 的内容添加到远程服务器上的 ~/.ssh/authorized_keys 文件尾部(若不存在则会创建此文件)。

使用 ssh-copy-id 命令可以完成这一操作,当然也可以使用其他方式或手动完成。

ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器地址 -p 端口号 

如果你没有修改过默认端口号(22),那么可以省略 -p 端口号 这一参数。执行 ssh-copy-id 命令时,需要输入远程服务器上相应用户的密码。

修改 SSH 服务端配置文件

在远程服务器上执行下面的操作。SSH 服务端的配置文件一般在 /etc/ssh/sshd_config,编辑该文件:

sudo vim /etc/ssh/sshd_config

从中找到 PubkeyAuthentication 并将其值修改为 yes(注意:如果前面有 # 号注释,则需要将 # 号去掉):

PubkeyAuthentication yes

修改完这一条后退出,记得保存。

重启 SSH 服务:

sudo service ssh restart

本文地址:https://www.jeddd.com/article/set-ssh-key.html

使用密钥登陆 SSH

还记得一开始你生成的那一对密钥吗?有个私钥文件(id_rsa),现在要把它下载到本地。再次强调:私钥文件很重要,不可泄漏

GUI 客户端

在设置里,勾选“使用私钥”,然后选择私钥文件即可(以 MobaXterm 为例):

命令行客户端

使用 -i 参数来指定私钥文件的路径:

ssh -i 私钥文件路径 用户名@服务器地址 -p 端口号

禁用口令认证

在 /etc/ssh/sshd_config 文件中,将 PasswordAuthentication 的值修改为 no

PasswordAuthentication no

然后重启 SSH 服务:

sudo service ssh restart

这样以后就不能用密码登陆了。

之所以不在第一次修改配置文件的时候一同改掉 PasswordAuthentication,是因为万一密钥配置出现错误,又禁用了口令认证,可能会造成无法登录 SSH 的情况。保险起见,应该在确认密钥已经可用后,再禁用密码登陆。

References

  1. Linux SSH 基于密钥交换的自动登录原理简介及配置说明 - 追阳 - 博客园

本文地址:https://www.jeddd.com/article/set-ssh-key.html