解决群晖无法使用 ssh 密钥登录的问题
近期,我遇到了一个非常奇怪的问题。通常情况下,我们可以通过使用 ssh-copy-id
命令将公钥复制到服务器上,实现免密登录。然而,在群晖 NAS 上,尽管我按照常规步骤操作,却始终无法实现密钥登录,反而一直提示我输入密码。
在互联网上,有人推荐了一些解决方案,包括:
- 确保
authorized_keys
文件权限设置为 600。 - 确认
sshd_config
文件中启用了密钥登录选项。 - 重启 SSH 服务以应用最新的
sshd_config
设置。
尽管我对以上方案都非常了解,但在排查问题时,我仔细核对了若干遍配置,却依然无法通过密钥登录。这让我感到相当困惑。
调试 sshd
面对无法通过密钥登录的问题,我决定直接查看 sshd
的日志以进行调试。下面是调试 sshd
的方法:
- 在另外一个端口上开启一个
sshd
进程,并打开 debug 日志输出,命令如下:/bin/sshd -d -p 2222
。 - 尝试通过以下命令连接到 debug
sshd
:ssh <name>@<addr> -p 2222
。
通过以上步骤,我发现 sshd
确实接受了密钥,但在读取 .ssh/authorized_keys
文件时遇到了 ACL(Access Control List)权限错误,因此拒绝了认证。
什么是 ACL 权限
ACL 权限是一套优先级高于文件系统权限的权限系统。它允许细粒度地控制对文件和目录的访问,超越了传统的基于用户和组的权限设置。使用 ACL 权限,我们可以更加灵活地管理访问控制,为特定用户或组提供特定的权限,从而确保系统的安全性和隐私保护。
authorized_keys 的权限要求
在网上的帖子中,大多数人都提到了将 authorized_keys
设置成 600 权限,但却很少有人提及到 ACL 权限的要求。其实我在自己的 proxmox 虚拟机 里将 authorized_keys
设置成 777 权限都没有出现过问题。
我查阅了 authorized_keys
的文档,了解这个文件具体的权限要求。
The content of the file is not highly sensitive, but the recommended
permissions are read/write for the user, and not accessible by
others. If this file, the ~/.ssh
directory, or the user's home
directory are writable by other users, then the file could be
modified or replaced by unauthorized users. In this case, sshd will
not al- low it to be used unless the StrictModes option has been set
to "no".
SSHD(8)
BSD System Manager's Manual
文档中指出以下信息:
authorized_keys
文件必须属于用户本人。- 如果
authorized_keys
位于用户的家目录~/.ssh
下,则要求家目录~
本身对于其他非特权用户是不可写的,除非将StrictModes
选项设置为 "no"。 authorized_keys
文件不必是 600 权限,只是在文档中推荐了这样的设置。
由此可见,authorized_keys
自身的权限不重要,倒是对家目录的权限设置有要求…… 这谁能想到呢😅
ACL 权限引发的问题
得知 ACL 权限引发问题后,我在搜到了一篇博客文章,其中描述了类似的情况。作者也遇到了 ACL 权限问题,原因是删除了管理员账户后,群晖没有自动更新 ACL 权限表。
我的情况则较为特殊:我在群晖中设置了 Alist
,用于通过 WebDav 远程管理文件。为了实现这个目标,我不得不赋予 alist
用户对 homes
目录的读写权限。在群晖系统中,homes
目录是所有用户家目录的父目录,位置位于 /var/services/homes
。
文件系统的传统权限无法满足这种细粒度的权限要求:homes
文件夹本身属于 admin
用户组,而 alist
并不是 admin
组的成员。如果不使用 ACL,只能开放所有人的公共访问权限。
当然,这样的做法违反了 authorized_keys
的要求,因为它要求家目录对于其他无特权用户是不可写的。
解决方案
针对 ACL 权限引发的问题,我有三种解决方案:
- 更新 ACL 权限表: 如果不需要其他用户读取家目录,可以在群晖网页的 File Station 中,对
homes
目录进行 “右键 - 属性” 操作,重新设置权限。根据之前提到的博客文章中的方法,可以随意选择一个用户,为其添加权限后再删除,这样可以更新 ACL 权限表。 - 调整
sshd_config
中authorized_keys
的位置: 在sshd_config
配置文件中,可以调整authorized_keys
文件的位置。如果填写的是相对路径,则以登录用户的家目录为根目录寻找该文件。为了解决问题,我们可以使用绝对路径,将authorized_keys
放到家目录之外的其他地方。但是需要注意,由于authorized_keys
文件必须严格属于某个登录用户,这样的设置将导致其他需要通过 SSH 登录的用户无法使用密钥登录。 - 关闭
StrictModes
选项: 在sshd_config
中,关闭StrictModes
选项。该选项决定了在接受登录之前,sshd
是否检查用户的文件和家目录的文件模式和所有权。关闭该选项后,sshd
不再对这些进行检查,这可以解决 ACL 权限引发的问题。
最终,我采用了第三种解决方案,即关闭了 StrictModes
。然而,请注意,如果开启了 StrictModes
,千万不要将 SSH 端口对公网开放,因为这将是非常危险的做法。
© LICENSED UNDER CC BY-NC-SA 4.0