一、sftp简述:
sftp(Secure File Transfer Protocol)是一种安全的文件传送协议,是ssh内含协议,也就是说只要sshd服务器启动了,sftp就可使用,不需要额外安装,它的默认端口和SSH一样为22
sftp通过使用加密/解密技术来保障传输文件的安全性,因此sftp的传输效率比普通的FTP要低,但sftp的安全性要比ftp高,因此sftp通常用于报表、对账单等对安全性要求较高的场景
本例子演示的为基于Centos7
二、SFTP服务配置
1、首先用root用户查看ssh的版本,版本需要大于4.8p1,如图:

2、使用root用户创建用户组,组名为sftpgroup(可自定义),创建用户sftpuser,并设置密码,如图:

说明:
-M表示创建用户的时候不生成home目录
-s sbin/nologin表示创建的用户sftp用户不能登录系统
3、修改配置文件sshd_config,将原来的Subsystem sftp usr/libexec/openssh/sftp-server注释掉,然后在最后添加内容如下:

Subsystem sftp internal-sftp # 启用SFTP子系统,并使用internal-sftp命令实现SFTP服务Match Group sftpgroup # 将用户匹配到sftpgroup组的账户,仅允许使用SFTP服务登录X11Forwarding no # 禁用X11转发,SFTP用户无法进行X11转发AllowTcpForwarding no # 禁用TCP转发,SFTP用户无法进行端口转发ChrootDirectory %h # 将SFTP用户的根目录限制在其主目录内。%h表示用户主目录ForceCommand internal-sftp # 将SFTP用户Shell设置为internal-sftp命令,只能使用SFTP不能登录Shell
4、新建用户目录/sftp/sftpuser,将其设置为用户sftpuser的home目录,并指定目录权限,如图:
mkdir -p /sftp/sftpuser #新建目录usermod -d /sftp/sftpuser sftpuser #将此目录设置为用户sftpuser的家目录chown root:sftpgroup /sftp/sftpuser #修改目录的属主和属组chmod 755 /sftp/sftpuser #修改目录权限mkdir -p /sftp/sftpuser/upload #创建一个上传目录chown sftpuser:sftpgroup /sftp/sftpuser/upload/ #修改目录的属主和属组chmod 755 /sftp/sftpuser/upload/ #修改目录权限
5、重启sshd,执行命令如下:
systemctl restart sshd
6、通过客户端登录,Winscp或者Xftp都可以,协议选择SFTP,如图:


登录后即可正常实现文件的上传与下载
注意:上面的sshd_config配置文件中后添加的内容要放在文件的最后,否则可能出现错误如下:
/etc/ssh/sshd_config line 145: Directive 'Ciphers' is not allowed within a Match block
附加:
首先观察upload的属主和属组,如图:





从上图中可以看出,权限设置为755,属主sftpuser具备任意权限,属组sftpgroup只有读取权限,因此如果要将设置其他任意用户只具备下载权限,可将用户加入到sftpgroup中,演示如下:
1、创建一个用户,加入到组sftpgroup中,命令如下:
useradd -g sftpgroup -M -s /sbin/nologin sftpTemp
2、指定用户的家目录为上面创建的/sftp/sftpuser,如图:
usermod -d /sftp/sftpuser sftpTemp
3、配置用户密码,如下:
# 只做演示用,因此通过此方式配置密码,较快echo "sftpTemp" | passwd --stdin sftpTemp
4、通过客户端连接后,测试上传,可以发现无权限,下载正常,如图:

注意:为什么新增的用户的家目录也要设置为跟之前的一样为/sftp/sftpuser,因为在sshd_config中配置了ChrootDirectory %h,此参数的意思是限制SFTP用户能访问的路径,在这里设置为只能访问他自己的家目录,上面设置的upload目录是在/sftp/sftpuser路径下,因此只有在这个路径下活动的用户才有权限访问此路径,虽然新增用户加入了sftpgroup,但如果不设置家目录为/sftp/sftpuser,其活动范围还是/home下,会导致无法连接sftp




