sshd 是否硬编码为需要 root 访问权限?

Hap*_*Dog 3 linux sshd

我正在尝试以非 root 用户身份运行 SSH 守护进程,因为我想在我没有 root 访问权限的服务器上提供对 Git 存储库的 SSH 访问。我已经使用自定义配置和本地证书运行它,但登录当前无法正常工作。

我正在使用以下版本sshd

OpenSSH_7.4p1、OpenSSL 1.0.2k-fips 2017 年 1 月 26 日

在此阶段,我不会寻求配置等方面的帮助(如果需要,我将发布单独的问题)。我只是想知道是否存在硬编码限制,这意味着在我投入更多时间之前这是不可能的。

SSH 守护程序中是否存在任何硬性限制,导致其无法作为非 root 用户成功使用?

Hap*_*Dog 5

以下是我根据大量研究得出的发现:

  • 如果使用 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 身份运行它:

  1. 您正在使用 OpenSSH < 7.5
  2. 你禁用UsePrivilegeSeparation
  3. 您的身份验证方法是通过公钥
  4. 您很高兴在端口 1024 或以上运行守护进程

我没有根据我的用例需要进行进一步调查AuthorizedKeyCommands,所以我已经走进了死胡同。即使满足上述条件,您也可能会遇到对非 root 用户的进一步限制,但我发现一些证据表明,在某些情况下,人们能够以非 root 身份运行它

一些边缘情况

为了完整起见,上述规则有一些边缘情况。我还没有测试过这些;它们基于我在调查上述内容时遇到的代码的推论:

  • 如果您的系统存储用户密码,则/etc/passwd可以/etc/shadow使用基于密码的身份验证,因为该文件是世界可读的,并且 OpenSSH 代码中似乎没有对此进行任何显式模式检查然而,以这种方式配置系统确实非常危险,所以永远不要这样做!
  • 如果您使用AuthorizedKeyCommands指向 root 拥有但可由您的用户帐户执行的脚本,则可以使用这种形式的身份验证。但是,该脚本仍然需要禁用组/其他人的写入访问权限,因此您将无法创建或编辑文件(除非以 root 身份),如果您根本没有 root 访问权限,这将无法成为解决方案。