关于SFTP的介绍
SFTP是SSH文件传输协议的缩写。顾名思义,它是一种使用加密的SSH连接在机器之间传输文件的安全方式。尽管名字如此,它是一个与FTP(文件传输协议)完全不同的协议,尽管它被现代的FTP客户端广泛支持。

在某些情况下,你可能希望只允许某些用户传输文件而不允许SSH访问。在本教程中,我们将设置SSH守护进程,将SFTP访问限制在一个目录中,而不允许每个用户访问SSH。
那么,让我们开始SFTP的设置。
步骤1:安装OpenSSH-server和SSH
如果你还没有这样做,在服务器上安装OpenSSH,你可以使用以下命令。
$ sudo apt install openssh-server
你还需要在你要访问SFTP服务器的系统上安装SSH。
$ sudo apt install ssh
第二步:创建SFTP用户账户
首先,我们需要创建一个新的用户,他将被授予对服务器的文件传输权限。
$ sudo adduser sftp_user
系统会提示你为该账户创建一个密码,然后是关于该用户的一些信息。用户信息是可选的,所以你可以按回车键,让这些字段留空。
Enter new UNIX password:
Retype new UNIX password:
.....
passwd: password updated successfully
现在你已经创建了一个新的用户,我们将被授予访问限制目录的权限。
在下一步,我们将创建用于文件传输的目录并设置必要的权限。
第3步:创建一个用于文件传输的目录
为了限制SFTP对一个目录的访问,首先,我们必须确保该目录符合SSH服务器的权限要求,这一点非常特别。
具体来说,该目录本身和它上面的所有目录在文件系统树中必须由root拥有,其他人不能写入。因此,不可能简单地对用户的主目录进行限制性访问,因为主目录是由用户而不是root拥有的。
这里,我们将创建并使用**/var/sftp/myfolder/data/作为目标上传目录。/var/sftp/myfolder将由root拥有,其他用户不能写入。
子目录/var/sftp/myfolder/data/将由sftp_user**(我们之前创建的)拥有,这样用户就可以向它上传文件。
首先,创建这些目录。
$ sudo mkdir -p /var/sftp/myfolder/data/
将/var/sftp/myfolder的所有者设为root。
$ sudo chown root:root /var/sftp/myfolder
给予root对同一目录的写权限,只给其他用户读和执行的权限。
$ sudo chmod 755 /var/sftp/myfolder
将uploads目录的所有权改为sftp_user。
$ sudo chown sftp_user:sftp_user /var/sftp/myfolder/data/
这里我们做了目录限制。
因此,我们的sftp_user将只使用下面路径中的**/data/**。sftp_user从不改变目录。
/var/sftp/myfolder/data/
第4步:sshd_config设置
在这一步,我们将修改SSH服务器的配置,禁止sftp_user的终端访问,但允许文件传输访问。
使用下面的命令打开SSH服务器的配置文件。
$ sudo nano /etc/ssh/sshd_config
或者你可以通过↓来做。
$ sudo vi /etc/ssh/sshd_config
滚动到文件的最底部,并附加以下配置片段。
/etc/ssh/sshd_config
Port <your_port_number>
Match User sftp_user
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp/myfolder
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
然后保存并关闭该文件。[按 :wq + enter]
下面是每个指令的作用
●Match User告诉SSH服务器只对指定的用户应用以下命令。这里,我们指定sftp_user。
●ForceCommand internal-sftp强制SSH服务器在登录时运行SFTP服务器,不允许shell访问。
●PasswordAuthenticationyes 允许该用户进行密码认证。
●ChrootDirectory /var/sftp/myfolder确保用户不会被允许访问/var/sftp/myfolder目录以外的任何东西。
AllowAgentForwarding no, AllowTcpForwarding no. 和 X11Forwarding no 禁用此用户的端口转发、隧道和X11转发。
在**匹配用户[user_name]**中,你也可以通过使用下面的命令使用组。
匹配组 [sftp_group]
注意:你需要创建一个新的组,叫做sftp_group。
步骤5:重新启动服务
为了应用配置的变化,重新启动服务。
$ sudo systemctl restart sshd
或者
$ sudo /etc/init.d/ssh restart
你现在已经将SSH服务器配置为只对sftp_user进行文件传输的访问限制。
步骤6:在AWS-EC2安全组中打开你的SFTP端口
如果你使用的是AWS-EC2实例,那么你需要在这里打开端口。
登录到你的AWS账户。
↓
进入服务,然后点击EC2菜单->运行实例。
↓
转到你的实例。
↓
打开安全组。
↓
在入站规则中,编辑入站规则
↓
请做以下设置
1.Type= Custom TCP2
.Protocol= TCP3
.Port range= your_port(与sshd_config文件中的设置相同)
4.Source= 你需要在这里将IP列入白名单,如果你不想要,就在任何地方设置。
5.描述 - 可选= 你可以在这里提到一些有用的信息。
最后一步是测试配置,以确保它能按预期工作。
第七步:验证配置
你可以在你的终端以及第三方软件中验证,如WinSCP。
疑难解答
如果你遇到了下面的错误,那么请做以下事情。
"no supported authentication methods available server sent: public key
Authentication Failed"
请运行下面的命令并再次检查连接情况。
sudo service sshd restart
(也许这个命令只在ubuntu 20中运行)
总结
你已经限制了一个用户对服务器上一个单一目录的SFTP-only访问,而没有完全的shell权限。虽然本教程只使用了一个目录和一个用户,但你也可以将这个例子扩展到多个用户和多个目录。SSH服务器允许更复杂的配置方案,包括限制组或多个用户同时访问,甚至限制对某些IP地址的访问。
我希望这篇文章能帮助你在Ubuntu上建立SFTP服务器。
如果你遇到了任何错误,那么请与我分享。