为什么有两种使用 OpenSSH 设置 SFTP 的方法,以及何时使用哪种方法?它们之间有什么区别吗?
我的意思是第一个使用来自 OpenSSH 的库而第二个说“使用内部”,所以它也是 OpenSSH?
Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
答案1
和sftp-server
都是internal-sftp
OpenSSH 的一部分。 是sftp-server
一个独立的二进制文件。internal-sftp
只是一个配置关键字,它告诉sshd
使用 内置的 SFTP 服务器代码sshd
,而不是运行另一个进程(通常是sftp-server
)。
添加internal-sftp
的时间比独立二进制文件晚得多(OpenSSH 4.9p1 于 2008 年?)sftp-server
。但现在已在默认配置文件中使用。sftp-server
现在已冗余,可能仅出于向后兼容的目的而保留。
我认为没有理由将其用于sftp-server
新安装。
从功能角度来看,sftp-server
和internal-sftp
几乎完全相同。它们都是从相同的源代码构建的。
的主要优点internal-sftp
是,与以下对象一起使用时不需要支持文件ChrootDirectory
指示。
为了
Subsystem
指示:该命令
sftp-server
实现SFTP文件传输子系统。或者,该名称
internal-sftp
实现了进程内 SFTP 服务器。这可以简化用于ChrootDirectory
在客户端上强制使用不同文件系统根的配置。-
指定命令
internal-sftp
将强制使用与一起使用时不需要支持文件的进程内 SFTP 服务器ChrootDirectory
。 -
必须
ChrootDirectory
包含支持用户会话所需的文件和目录。对于交互式会话,这至少需要一个 shell(通常为 )sh
和基本/dev
节点(例如null
、zero
、stdin
、stdout
、stderr
和tty
设备)。对于使用 SFTP 的文件传输会话,如果使用进程内 sftp 服务器,则无需对环境进行额外配置,但/dev/log
在某些操作系统上使用日志记录的会话可能需要在 chroot 目录中(sftp-server
有关详细信息,请参阅)。
另一个优点internal-sftp
是性能,因为不需要为其运行新的子流程。
看起来,当 遇到 时,sshd
可以自动使用,因为功能相同, 甚至具有上述优势。但存在一些极端情况,存在差异。internal-sftp
sftp-server
internal-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。对于用户来说,这真的很酷,因为他们不需要系统管理员的干预。