OpenSSH:internal-sftp 和 sftp-server 之间的区别

Den*_*ane 115 ssh sftp

为什么有两种使用 OpenSSH 设置 SFTP 的方法以及何时使用哪种方法?它们之间有什么区别吗?

我的意思是第一个使用来自 OpenSSH 的库,第二个说“使用内部”,所以它也是 OpenSSH?

Subsystem sftp /usr/lib/openssh/sftp-server
Run Code Online (Sandbox Code Playgroud)
Subsystem sftp internal-sftp
Run Code Online (Sandbox Code Playgroud)

Mar*_*ryl 135

这两个sftp-serverinternal-sftp是OpenSSH的一部分。这sftp-server是一个独立的二进制文件。这internal-sftp只是一个配置关键字,它告诉sshd使用内置于 的 SFTP 服务器代码sshd,而不是运行另一个进程(通常是sftp-server)。

internal-sftp在更晚(的OpenSSH 4.9p1 2008年?)比独立添加sftp-server二进制文件。但它现在是默认设置。现在sftp-server是多余的,保留可能是为了向后兼容。

我相信没有理由将sftp-server用于新安装。


从功能的角度来看,sftp-serverinternal-sftp几乎相同。它们是从相同的源代码构建的。

的主要优点internal-sftp是,与ChrootDirectory指令一起使用时不需要支持文件。

来自sshd_config(5)手册页的引用:

  • 对于Subsystem指令

    该命令sftp-server实现了 SFTP 文件传输子系统。

    或者,该名称internal-sftp实现了一个进程内 SFTP 服务器。这可以简化使用ChrootDirectory在客户端上强制不同文件系统根的配置。

  • 对于ForceCommand指令

    指定命令internal-sftp将强制使用进程内 SFTP 服务器,当与ChrootDirectory.

  • 对于ChrootDirectory指令

    ChrootDirectory必须包含必要的文件和目录,以支持用户的会话。用于交互式会话,这需要至少一个壳,典型地sh,和基本/dev如节点nullzerostdinstdoutstderr,和tty设备。对于使用 SFTP 的文件传输会话,如果使用进程内 sftp-server,则不需要额外的环境配置,尽管使用日志记录的会话可能需要/dev/log在某些操作系统上的 chroot 目录中(请参阅sftp-server有关详细信息)。

的另一个优点internal-sftp是性能,因为没有必要为其运行新的子流程。


看起来似乎sshd可以internal-sftp在遇到 时自动使用sftp-server,因为功能相同并且internal-sftp甚至具有上述优点。但也有边缘情况,其中存在差异。

几个例子:

  • 管理员可以依靠登录外壳配置来阻止某些用户登录。切换到internal-sftp将绕过限制,因为不再涉及登录外壳。

  • 使用sftp-server二进制文件(作为一个独立进程),您可以使用一些技巧,例如sudo.

  • 对于 SSH-1(如果有人仍在使用它),Subsystem根本不涉及指令。使用 SSH-1 的 SFTP 客户端明确告诉服务器服务器应该运行什么二进制文件。因此,旧版 SSH-1 SFTP 客户端的sftp-server名称是硬编码的。


小智 6

您可以将一个authorized_key 锁定到外部sftp-server。

command="/usr/libexec/openssh/sftp-server" ssh-rsa AAAA…== user@host.com

当您这样做时,您的用户可以 sftp,但不能 scp 或 ssh:

$ sftp 主机:/etc/group /tmp
正在连接到主机...
获取 /etc/group 到 /tmp/group
/etc/group 100% 870 0.9KB/s 00:00

尝试做任何其他事情只会挂起:

$ scp 主机:/etc/group /tmp
被信号 2 杀死。

$ ssh 主机正常运行时间
被信号 2 杀死。

唉,除非修改 sshd_config,否则没有简单的方法可以将密钥锁定到 chroot。对于用户来说,无需系统管理员的干预就能够做到这一点真的很酷。

  • `ForceCommand internal-sftp` 应该实现相同的 (4认同)
  • 方便的是,如果您以后改变主意,无需 chroot,您可以使用 `sshfs host:/home/user/.ssh ~/hackme` 编辑所有这些设置以打开访问权限。 (3认同)