为什么有两种通过OpenSSH设置SFTP的方法以及何时使用?它们之间有什么区别吗?
我的意思是第一个使用来自OpenSSH的库,第二个显示“使用内部”,所以它也是OpenSSH吗?
Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
_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
_节点,例如null
,zero
,stdin
,stdout
,stderr
和tty
个设备。对于使用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
_名称硬编码。
存在可以与OpenSSH一起使用的替代SFTP实现:
您可以将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。对于用户而言,无需系统管理员的干预就可以做到。