【SSH/SFTP】SSH协议和SFTP

时间:2022-06-04 12:50:26

【SSH和SFTP】

■  设置一个只允许访问部分目录的SFTP服务器

  由于SSH和SFTP之间的紧密联系,一个SFTP服务器必然会导致开放一定的SSH服务,而SSH的风险显然比SFTP要大一些。自然,我们就会需要:1.禁止SSH登录但保持SFTP服务可用;2.SFTP也不能让外部用户可以*读写所有服务器上信息。这两个需求可以通过用户配置及sshd配置来配合完成。

  在/etc/ssh/sshd_config中加上这些配置:

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
#这行是默认开启的,用#把它注释掉 #添加下面这些内容,其中ftpuser是我们要进行限制的用户
Subsystem sftp internal-sftp
Match User ftpuser
ChrootDirectory /hsdata/datadir/ftpuser
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

  如果顺利,那么ftpuser通过sftp协议连入之后,默认就是在/hsdata/datadir/ftpuser这个目录下,且cd ..;或者读写其他目录下的尝试都会失败。比如cd /tmp时会提示不存在/tmp目录。因为此时对于这个SFTP的客户端来说,/hsdata/datadir/ftpuser就是根目录/。

  要想顺利实现,有两个前提条件:

  1. ChrootDirectory配置项的值即/hsdata/datadir/ftpuser这个目录及其所有长辈目录(/hsdata/datadir和/hsdata)必须都是root:root的。

  2. ChrootDirecotry配置项的值的目录及其所有长辈目录,最大权限只能开放到755,即写权限只能让目录所有者(即root)拥有。

 上述sshd_config的变更成功实现了对sftp用户进行访问限制的功能,但是此时用户还可以通过ssh连入,这就没有意义了。禁止其ssh连入但是允许sftp连入的实现方式很简单,是改变用户的默认shell(which是/bin/bash)为/bin/false:

#在root权限下
usermod -s /bin/false ftpuser

■  几个概念初探  

  使用java的jsch包,进行SSH/SFTP连接时,经常会出现各种各样的错误。比如报错Algorithm Negotiation错误,比如End of IO Stream等等。首先jsch包版本本身会对连接能否成功建立有影响。比如一个实践是当S端的openssh组件升级之后,C端无论如何连不上,但是将jsch包从45版本升级到53或者54版本就可以了。。这个比较迷,也还没来得及深究原因。

  其次要明确,SSH连接中有C端(客户端)和S端(服务端)。如果要进行一个连接,那么C端和S端应该都装有openssh(都是Linux的场合),如果两者版本一致是最好了。但是往往C端和S端的openssh版本不同。版本不同会导致很多乱七八糟的事情。

  在建立连接的过程中,C和S端要进行加密算法(Cipher)、密钥交换算法(Kex Algorithm)和消息确认算法(MAC)。Kex的全称是Key Exchange,MAC的全称是Message Authentication Code。如果两端无法协商成立使用统一的算法,那么连接就无法建立。通常一个特定发行版本的openssh会自带一些默认支持的算法,对于剩余不默认支持的,可以在配置文件中加入额外配置增加支持。

  当openssh升级过后客户端发现无法连接了,那么很有可能是openssh新版本将一些默认支持的老算法(尤其是kex算法部分)列入了默认不支持范围。可以考虑在/etc/ssh/sshd_config中增加相关配置即可。具体增加的配置可以百度一下,有很多,也就是配置了名为Ciphers,Kex Algorithms和MACs的三项。

  另一方面,在手动通过字符界面的ssh客户端发起连接时,如果想要知道客户端和服务端究竟协商成了什么样的算法,那么可以ssh -vvv 目标IP,加上参数-vvv之后,ssh连接过程中的所有debug日志都会被打印出来。在打印出来的日志中可以详细查询debug1(C端日志)和debug2(S端日志)开头的部分。其中就有debug1后面的kex algorithm和debg2后面的algorithm,分别指出了C、S端使用的Kex算法。

  在C或S任意一端上,如果想要查看默认支持的算法,还可以尝试通过man sshd_config或者ssh -Q kex(仅限于查看kex算法,也可换成cipher或者mac)两条命令。不过对于一些版本比价老的openssh,可能这些命令不支持需要注意。