设置SSH密匙(免密码)登录Debian系统

我们常使用 SSH 控制远程主机(如 Debian 系统)。常用的 SSH 登录方式有密码密匙两种,从安全方面考虑,推荐使用密匙方式登录。

密匙分为公钥和私钥,这两个秘钥可以互为加解密,其中公钥是公开的,需要对外分发给远程主机;私钥是保密的,必须只有生成这个私钥的人才能拥有。

安全提示
从私钥可以计算出公钥,一旦在传输过程中被人窃听,私钥就泄密了,于是 SSH 就不再是安全的了,因此私钥必须避免任何形式的传输(网络、U 盘拷贝等),并且不共享给任何人

SSH 公钥(免密)登录过程详解

  1. 客户端用户必须手动地将自己的公钥添加到服务器一个名叫 authorized_keys 的文件里。
  2. 客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)。
  3. 服务端根据指纹检测此公钥是否保存在 authorized_keys 中。
  4. 若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回。
  5. 客户端收到后,用自己的私钥解密得到随机字符串,发送给服务器。
  6. 服务端收到后,对比随机字符串。如果为同一字符串,则验证通过。

我们以在 Windows 端通过 SSH 登录 Debian 远程主机讲解如何实现免密登录。远程主机的信息如下:

用户名:root

IP 地址:123.123.123.123

端口号:52122

设置远程主机允许密匙登录

修改 /etc/ssh/sshd_config 文件,启用以下参数:

1
2
3
4
RSAAuthentication yes  #启用 RSA 认证
PubkeyAuthentication yes  # 启用公钥认证
PermitRootLogin yes   #允许Root用户登录,登录方式无限制
AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2   # 指定密钥的文件位置

修改完配置文件,重启 SSH 服务:

1
systemctl restart sshd

Windows 端生成公钥和私钥

在 Windows 本地系统终端执行下面命令:

1
ssh-keygen -t rsa  # 生成配对密钥,后续一路Enter即可

生成的密钥文件是 id_rsaid_rsa.pub,默认保存在当前登录用户的根目录下的 .ssh 目录中(C:\Users\[用户名]\.ssh

id_rsa 文件是私钥,必须避免任何形式的传输(网络、U 盘拷贝等),并且不共享给任何人

复制公钥到远程主机

当您希望使用密钥进行 SSH 身份验证时,您需要将您的公钥添加到远程主机的 authorized_keys 文件中。authorized_keys 用于存储允许访问该服务器的每个客户端的公钥,只有在 authorized_keys 文件中列出的公钥,才能成功进行身份验证并获得访问权限。

方法一:使用命令(在 Windows 本地系统操作)

Linux 系统中使用 ssh-copy-id 命令将本地当前登录用户的公钥复制到远程主机的 authorized_keys 文件中。

1
ssh-copy-id -p 52122 root@123.123.123.123  # 仅适用于Linux系统

Windows 系统不支持 ssh-copy-id 命令,在终端执行以下命令来复制公钥到远程主机的 authorized_keys 文件中。

1
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 52122 root@123.123.123.123 "cat >> .ssh/authorized_keys"  # 仅适用于Windows系统

确保对远程主机上的 ~/.ssh 目录和 ~/.ssh/authorized_keys 文件设置正确的权限,否则公钥验证不生效。

1
ssh -p 52122 root@123.123.123.123 "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

方法二:人工操作(在远程主机操作)

如果方法一中的命令不可用,可以人工操作,手动将 Windows 端的本地当前登录用户的公钥内容复制到远程主机的 ~/.ssh/authorized_keys 文件中(~ 表示用户目录)。

先将公钥 id_rsa.pub 文件上传至 Linux 服务器,我使用的是开源的 WindTerm,自带文件管理器功能,可直接拖拽进行上传。

假设我们直接上传到 root 用户根目录,则路径为 /root/id_rsa.pub/~/id_rsa.pub

1
2
3
touch ~/.ssh/authorized_keys   # 创建authorized_keys文件
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys  # 将公钥内容追加到authorized_keys文件
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys # 设置正确的权限

在 Windows 端验证免密登录

在 Windows 本地系统终端中执行以下命令:

1
ssh -p 52122 root@123.123.123.123

如果可以正常登陆,则表明免密登录设置成功。

设置远程主机禁用密码登录

修改 /etc/ssh/sshd_config 文件,启用以下参数:

1
2
PasswordAuthentication no  # 不允许使用密码登陆,务必等测试密钥登陆成功了再修改该参数
PermitRootLogin without-password   #只允许使用公钥进行身份验证的root用户登录

修改完配置文件,重启 SSH 服务:

1
systemctl restart sshd

正确取消免密登录

由于公钥与私钥成对出现才能实现免密登录,那么只需要破坏这种成对关系就可以了,比如去掉公钥授权。

安全提示
取消公钥授权不能简单地删除 authorized_keys 文件或更改 authorized_keys 权限,因为 authorized_keys 可能配置着多个客户端的公钥。

备份 authorized_keys 文件:

1
cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak

修改 authorized_keys 文件,删除对应的公钥内容:

1
nano ~/.ssh/authorized_keys

常见问题

错误提示“Permission denied (publickey)”

复制新客户端的公钥到远程主机时,会出现这个错误提示。原因可能有:

  1. 远程主机禁用了 ssh 密码登录权限。
  2. 客户端访问远程主机的公钥没有添加或者被取消(无法认证)。
  3. 远程主机的公钥文件夹权限错误。

解决方案:

  1. 对于第 1、2 个原因,我们需要将新客户端的公钥添加到远程主机,有两种方式:
    • 使用已经认证的客户端登录远程主机,将新客户端的公钥添加到远程主机的 ~/.ssh/authorized_keys 文件中。
    • 或者将新客户端的公钥发给远程主机管理员,由其协助完成公钥验证。
  2. 对于第 3 个原因,确保对远程主机上的 ~/.ssh 目录权限为 700, ~/.ssh/authorized_keys 文件权限为 600。设置权限的命令如下:
1
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

如何在宝塔面板中快速完成相关设置

对于已经安装宝塔面板的用户,确实可以方便设置:

1、在【安全】→【SSH 管理】中,快速设置 SSH 端口号、ROOT 登录方式、密码登录(禁用)、密匙登录(启用)参数,详细设置如下图:

2、在【文件】菜单中,找到用户路径下的 authorized_keys 文件,将公钥添加到这个文件中。

参考文章

0%