ssh 的 UNPROTECTED PRIVATE KEY FILE 问题解决

无法使用 ssh 的私钥,出现 WARNING: UNPROTECTED PRIVATE KEY FILE! 提示。

太长不看

问题

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/chris/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/chris/.ssh/id_rsa": bad permissions

解决

chmod 0700 ~/.ssh/id_rsa

把路径换成自己的私钥路径即可。

前情

我在重装了 wsl 之后想要把 Windows 正在用到的 ssh key 放到 wsl 里,就直接在文件资源管理器中粘了过去。但是这样的方法导致的文件权限是 0644,也就是说任意用户都可以看、只有所有者用户可以更改,这样不安全的权限会让 sshd 罢工不用这个私钥,导致无论是 ssh 到 vps 还是 git 操作都无法完整进行。解决方案也很简单:权限改下就好。

完整方法

以下内容来自 SSH Error “permissions are too open” for Private Key File,原作者 Hiks Gerganov,由我和 ChatGPT 翻译为中文。

1. 简介

密钥是 Secure Shell (SSH) 协议的一部分。实际上,如果使用正确,它们可以提供额外的安全层级。

在本教程中,我们将探讨 SSH 密钥的权限问题。首先,我们生成密钥并配置它们以供给定用户访问。接下来,我们讨论适当的密钥权限。最后,我们将解释如何更正密钥的权限并测试结果。

为简洁和安全起见,我们仅考虑由 OpenSSH 实现的 SSH 版本 2(SSHv2)的最新迭代。

我们在 Debian 11 (Bullseye) 上使用 GNU Bash 5.1.4 测试了本教程中的代码。它应该可以在大多数符合 POSIX 标准的环境中工作。

2. 生成密钥

首先,让我们使用默认设置生成一些密钥:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/baeldung/.ssh/id_rsa):
Created directory '/home/baeldung/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/baeldung/.ssh/id_rsa
Your public key has been saved in /home/baeldung/.ssh/id_rsa.pub
The key fingerprint is:
[...]

此时,正如输出所述,我们有一组两个密钥:

  • 公钥:/home/baeldung/.ssh/id_rsa.pub
  • 私钥:/home/baeldung/.ssh/id_rsa

重要的是,这些是基于用户(baeldung)的主目录(/home)的默认位置:*$HOME_

为了简单起见,我们将本地机器用作 SSH 会话的客户端和服务器。因此,我们将公钥添加到我们的用户的 _authorized_keys* 文件中:

cat /home/baeldung/.ssh/id_rsa.pub >> /home/baeldung/.ssh/authorized_keys

现在,让我们使用我们的新密钥。

3. 私钥权限

在创建和设置密钥之后,我们只需连接到 localhost

$ ssh localhost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/root/.ssh/id_rsa' are too open.
It is required that your private key

 files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa": bad permissions
[...]

在这种情况下,我们遇到了一个错误,它指出我们的私钥具有错误的 权限。具体而言,SSH 客户端不允许使用可以被其他人访问的私钥。

我们使用 ls 命令来检查私钥的当前权限:

$ ls -l /home/baeldung/.ssh/id_rsa
-rwxrwxrwx 1 baeldung baeldung 2590 Oct 10 06:56 /home/baeldung/.ssh/id_rsa

这里,第三和第四列告诉我们 baeldung 是所有者的用户名和组名。第一列告诉我们所有者、所有者组的成员以及其他所有人都对我们的私钥文件 /home/baeldung/.ssh/id_rsa 拥有完全权限,例如 模式0777

如果我们追求适当的安全性,这是不可接受的。

4. 更正私钥权限

正如我们之前看到的错误文本解释的那样,要求是我们的私钥文件“不可被其他人访问”。换句话说,我们需要为每个私钥文件设置两个极端之间的模式:

  • 0400,最严格的,例如,只允许所有者读取权限
  • 0700,最不严格的,例如,只允许所有者完全权限

基本上,我们不能为任何非所有者用户提供任何权限,但所有者仍然必须能够至少读取这些文件。在这种情况下,我们使用 chmod 命令应用最严格的访问权限:

$ chmod 0400 /home/baeldung/.ssh/id_rsa
$ ssh localhost
[...]
baeldung $

最后,让我们看看当我们通过 chown 命令更改所有者时会发生什么:

$ chown user1:user1 /home/baeldung/.ssh/id_rsa
$ ls -l /home/baeldung/.ssh/id_rsa
-r-------- 1 user1 user1 2590 Oct 10 06:56 /home/baeldung/.ssh/id_rsa

此时,如果我们是 root,SSH 将允许我们继续操作,因为有以下几个事实:

  • 作为 root,我们对所有文件都有权限
  • 就 SSH 客户端而言,文件权限实际上是准确的(0400

事实上,作为 root,我们只需通过 -l 选项或使用 user@ 语法指定正确的用户,以及使用 -i 标志指定密钥,即可完成设置。

5. 公钥权限

作为私钥主要问题的附带说明,我们可能会问是否公钥也适用于这些权限要求。实际上,有建议但没有普遍规定

在大多数情况下,最好保护密钥的本地副本免受第三方的修改。基本上,这意味着建议的模式介于两个极端之间:

  • 0400,与之前一样,仅允许所有者读取密钥
  • 0744,使所有者能够

实际上,下限允许进行操作而不进行修改,并阻止外部用户,而上限至少可以防止外部修改

无论如何,一旦我们的公钥在远程机器的 authorized_keys 文件中,我们实际上不需要它来登录 - 我们只需要私钥。

6. 总结

本文介绍了 SSH 密钥的权限问题,以及它们可能引起的问题以及如何更正它们。

总之,SSH 客户端可以并且应该为存储和使用私钥定义严格的规则,因为它们可以被视为密码的等效物。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3