SSH 提供了两种安全认证的方式:
- 口令认证:使用用户名和密码来认证;
- 密钥认证:通过一对密钥(公钥和私钥)来进行认证。
密钥认证方式的安全性更高,且避免了每次都要输入密码的繁琐。本文讲解如何为 Linux 服务器配置 SSH 密钥认证方式,并禁用传统的口令认证方式。
本文地址:https://www.jeddd.com/article/set-ssh-key.html原理
首先,我们来简单地了解一下 SSH 密钥认证的基本原理。
SSH 密钥采用 RSA 加密算法,它是一种非对称加密算法。在这种加密方案中存在一对密钥,分别是公钥和私钥,通信的双方各保存一个密钥,服务器上保存的是公钥,而用户电脑(客户端)上保存的是私钥。公钥用来加密信息,这种加密是单向的——用公钥加密的信息,无法用公钥解开,而只能使用私钥解密。
当用户要通过密钥登陆 SSH 时,进行以下过程:
- 客户端向服务器发送登录请求;
- 服务器生成一段随机字符串,并用公钥将其加密后发送给客户端;
- 客户端尝试用自己的私钥解密,若解密成功,将解密后的信息发送回服务器;
- 服务器验证客户端发来的解密后的信息,若与服务器最初生成的相同,则认证成功。
关于非对称加密的原理,可以阅读这一篇浅显易懂的文章:《「非对称加密」到底是个什么玩意儿》。
本文地址: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 的情况。保险起见,应该在确认密钥已经可用后,再禁用密码登陆。