我试图以非 root 用户身份运行 SSH 守护程序,因为我想为服务器上的 Git 存储库提供 SSH 访问权限,而我没有 root 访问权限。我已使用自定义配置和本地证书运行它,但登录目前不起作用。
我正在使用以下版本sshd
:
OpenSSH_7.4p1,OpenSSL 1.0.2k-fips 2017 年 1 月 26 日
目前我不需要配置等方面的帮助(如有必要,我会单独提问)。我只是想知道是否存在硬编码限制,导致我无法完成这项工作,之后我再投入更多时间。
SSH 守护进程中是否存在任何硬性限制,导致非 root 用户无法成功使用它?
答案1
根据大量研究,我发现:
- 如果使用 OpenSSH v7.5 或更高版本,则需要 root 权限。
从此版本开始,该UsePrivilegeSeparation
选项已被删除,并且此功能现在始终启用。这意味着 SSH 守护进程需要能够以不同的用户身份运行子进程,这需要 root。 AuthorizedKeyCommands
如果使用选项,则需要 root。
什么时候运行指定脚本这safe_mode 检查是否配置为始终使用 root 用户(uid = 0)等等它失败如果脚本的所有者不是 root,则通过设计。(我还应该注意,该StrictModes
标志听起来像将禁用这些模式检查,但事实并非如此。)- 如果您想使用标准密码验证,则需要 root 身份。
检查正常密码使用getpwname()
系统调用这是硬编码的,/etc/shadow
只有 root 才能读取。 - 如果要在 <1024 的端口上运行,则需要 root 权限
端口 0-1023 是特权并且只能由 root 用户使用。这意味着您无法在标准 SSH 端口 22 上运行,因此与守护进程的任何连接都需要明确指定端口。
因此,它可能如果满足以下条件,则可以以 root 身份运行:
- 您正在使用 OpenSSH < 7.5
- 您禁用
UsePrivilegeSeparation
- 您的身份验证方法是通过公钥
- 您乐意在 1024 或更高端口上运行守护进程
我没有根据用例的要求进行进一步调查AuthorizedKeyCommands
,因此我陷入了困境。即使满足上述条件,您可能还会遇到非 root 用户的其他限制,但是我已经发现一些证据表明,在某些情况下,人们能够以非 root 身份运行它。
一些极端情况
出于完整性考虑,上述规则有几个极端情况。我没有测试过这些情况;它们是基于我在调查上述内容时遇到的代码推断得出的:
- 如果你的系统将用户密码存储
/etc/passwd
在/etc/shadow
可能可以使用基于密码的身份验证,因为该文件是全球可读的,而且 OpenSSH 代码中似乎没有任何明确的模式检查。然而,非常非常危险以这种方式配置您的系统,所以千万不要这么做! - 如果你使用
AuthorizedKeyCommands
指向由 root 拥有但可由你的用户帐户执行的脚本,那么它可能可以使用这种形式的身份验证。但是,脚本仍然需要禁用 group/other 的写访问权限,因此您只能以 root 身份创建或编辑文件,如果您根本没有 root 访问权限,这将阻止此解决方案。