wake-up-neo.com

OpenSSH:内部SFTP和SFTP服务器之间的区别

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

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

Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
89
Denny Crane

_sftp-server_和_internal-sftp_都是OpenSSH的一部分。 _sftp-server_是独立的二进制文件。 _internal-sftp_只是一个配置关键字,它告诉sshd使用内置在sshd中的SFTP服务器代码,而不是运行另一个进程(通常是_sftp-server_)。

_internal-sftp_的添加时间比独立的_sftp-server_二进制文件添加的时间晚得多(2008年是OpenSSH 4.9p1?),但这是默认设置。 _sftp-server_现在是多余的,为了向后兼容而保留。

我相信没有理由在新安装中使用_sftp-server_。


从功能的角度来看,_sftp-server_和_internal-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服务器,则不需要额外的环境配置,尽管使用日志记录的会话可能在某些操作系统的chroot目录中需要_/dev/log_(请参阅_sftp-server_以获取详细信息)。

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


似乎sshd在遇到_internal-sftp_时可以自动使用_sftp-server_,因为功能相同,并且_internal-sftp_甚至具有上述优点。但在Edge案例中,存在差异。

几个例子:

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

  • 使用_sftp-server_二进制文件(是一个独立的进程),您可以使用一些技巧,例如 Sudo 下运行SFTP。

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

104
Martin Prikryl
8
ptman

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

command =“/usr/libexec/openssh/sftp-server” ssh-rsa AAAA…== [email protected]

当您这样做时,您的用户可以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杀死。

A,除非修改了sshd_config,否则没有简单的方法将密钥锁定到chroot。对于用户而言,无需系统管理员的干预就可以做到。

6
Charles Fisher