我有一个非常具体的要求,要求多个用户使用一个私钥。我知道这有多糟糕。问题是,如果身份文件的权限太宽容(在我的情况下是 444),ssh 将简单地忽略它们。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @
WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0444 for '/var/vendor/id_rsa' are too open. It is
recommended that your private key files are NOT accessible by others.
This private key will be ignored.
来自手册页
包含用于身份验证的私钥。这些文件包含敏感数据,应仅供用户读取,但其他人不能访问(读/写/执行)。如果其他人可以访问私钥文件,ssh 将忽略该文件。
有没有办法强制 ssh 使用密钥而不检查权限?
答案1
正如其他答案所提到的,似乎没有办法强制 SSH 忽略该选项。检查发生在验证文件功能sshkey_perm_ok:
if ((st.st_uid == getuid()) && (st.st_mode & 077) != 0) {
error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
error("@ WARNING: UNPROTECTED PRIVATE KEY FILE! @");
error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
error("Permissions 0%3.3o for '%s' are too open.",
(u_int)st.st_mode & 0777, filename);
error("It is required that your private key files are NOT accessible by others.");
error("This private key will be ignored.");
return SSH_ERR_KEY_BAD_PERMISSIONS;
}
如果无法更改密钥文件的权限,则解决方案是下载 OpenSSH 源代码,从代码中删除该检查并重建它。
答案2
一个相关问题的答案表明没有办法绕过权限检查。
但是,我遇到了同样的问题 --- 我希望多个用户共享同一个密钥,以便能够访问和控制一大组主机 --- 我的解决方法可能对其他人有用。
这是我所做的:
- 创建一个特殊的用户(例如
master
)和组(master
)来持有密钥。 - 在中创建/存储密钥文件
~master/.ssh/
。 - 授予组对密钥文件的读取权限
chmod g+r ~master/.ssh/id_rsa
。 - 将每个授权用户添加到
master
组。 ~user/.ssh/id_rsa
建立从到 的链接~master/.ssh/id_rsa
。
这样授权用户就可以ssh
毫无问题地使用密钥,但可以避免向所有人公开密钥。此外,密钥所有者不是 root。
奇怪的是,master
用户本身仍会收到“未受保护的私钥”警告。可以通过将密钥文件的所有者(而不是组)更改为某个永远不需要使用密钥的特殊用户来规避此问题,
sudo chown daemon ~master/.ssh/id_rsa
例如。
答案3
您可以使用访问控制列表使其可供访问。使用实用程序getfacl
和setfacl
。
请记住还要使用 设置适当的掩码setfacl
,因为通常如果组权限不一样,您添加的任何单独权限都不会有效。
不过,你的文件系统需要支持它。如果未启用,则必须在 fstab 中添加挂载选项。
答案4
@João Rodrigues 对 @Andrei Savin 的回答的评论最后为我使用 sudo 提供了提示:
sudo -u nobody ssh -i <path to identity file> <ssh server>
以下错误消息(示例)
Could not create directory '/var/empty/.ssh'.
The authenticity of host 'xxx' can't be established.
ECDSA key fingerprint is SHA256:yyy.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Failed to add the host to the list of known hosts (/var/empty/.ssh/known_hosts).
可以忽略。它使用 Debian Buster (OpenSSH_7.9p1、OpenSSL 1.1.1d) 和 MacOS Big Sur (OpenSSH_8.1p1、LibreSSL 2.7.3) 开箱即用。