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

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

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

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

Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

答案1

sftp-server都是internal-sftpOpenSSH 的一部分。 是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包含支持用户会话所需的文件和目录。对于交互式会话,这至少需要一个 shell(通常为 )sh和基本/dev节点(例如nullzerostdinstdoutstderrtty设备)。对于使用 SFTP 的文件传输会话,如果使用进程内 sftp 服务器,则无需对环境进行额外配置,但/dev/log在某些操作系统上使用日志记录的会话可能需要在 chroot 目录中(sftp-server有关详细信息,请参阅)。

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


看起来,当 遇到 时,sshd可以自动使用,因为功能相同, 甚至具有上述优势。但存在一些极端情况,存在差异。internal-sftpsftp-serverinternal-sftp

举几个例子:

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

  • 使用sftp-server二进制文件(作为一个独立的进程),你可以使用一些技巧,例如运行 SFTPsudo

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

答案2

存在可以与 OpenSSH 一起使用的替代 SFTP 实现:

答案3

您可以将 authorized_key 锁定到外部 sftp 服务器。

命令“/usr/libexec/openssh/sftp-server” ssh-rsa AAAA…==[电子邮件保护]

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

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

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

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

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

唉,除非修改 sshd_config,否则没有简单的方法将密钥锁定到 chroot。对于用户来说,这真的很酷,因为他们不需要系统管理员的干预。

相关内容