SFTP配置详解

导言

有很多方法,可实现在网络上分享文件。其中之一为FTP协议。但FTP通过明文传输数据,不安全。幸运的是,SSH协议族中包含了用于传输文件的SFTP协议。

事实上,任何远程主机的用户,通过SSH访问,均可以在远程主机与本地机器之间传输文件。如果我们只希望某个用户通过SFTP分享文件,像FTP那样,而不许可对方运行shell命令,如何操作?下面是我摸索出的方法,适用于运行Ubuntu Server的主机。

这里的原理很简单,即在远程主机上建立一个账户,将其shell设为nologin。再编辑SSH守护进程的配置文件,将该用户限制在某个目录。

前提条件

  • 具有远程主机的管理员账号
  • 服务器上已安装OpenSSH Server
  • 客户端上已安装SFTP客户端软件

详细步骤

1. 添加组、用户

我们希望所有SFTP用户都处于sftpusers组。首先添加该组:

sudo addgroup sftpusers

再新建一个用户guestuser,将其加入sftpusers组,并设置其shell为nologin,其主目录为/incoming:

sudo adduser --ingroup sftpusers --home /incoming --shell /usr/bin/nologin guestuser

注意,nologin已暗示了,它不是一个可登录的shell,因此该用户不能运行shell命令。此外,通过下面的配置,该用户的主目录要被ChrootDirectory指令限制。

也可以配置已有用户到sftpusers,这里不再赘述。

2. 配置SFTP权限

通过以下命令打开SSHD配置文档:

sudo vi /etc/ssh/sshd_config

找到这行Subsystem sftp /usr/libexec/openssh/sftp-server,将其注释掉,并在下方加上一行Subsystem sftp internal-sftp。结果如下:

#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp

接下来是关键部分:

Match Group sftpusers
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp
Match All

ChrootDirectory /sftp/%u限制了,用户guestuser能看到的根目录是/sftp/guestuser/,其主目录是/sftp/guestuser/incoming/。该用户是无法看到/sftp/guestuser/目录外部的。这是限制文件系统访问的关键。

还要注意,如果上面几条指令位于文件末尾,则可以去掉Match All。否者一定要加上Match All,以结束Match Group sftpusers语句块,否者会有意料不到的结果哦。

3. 建立目录

分别执行下面的命令:

sudo mkdir /sftp
sudo mkdir /sftp/guestuser
sudo mkdir /sftp/guestuser/incoming
sudo chown guestuser:sftpusers /sftp/guestuser/incoming

当然,不一定要遵循上面的文件结构啦。

4. 重启SSH守护进程

执行以下命令:

sudo service ssh restart

大功告成!打开你最喜欢的客户端软件,分享你的文件吧。

客户端软件

有很多客户端软件有SFTP功能。下面只列举几个好用、可靠且免费的软件。

SSH客户端的sftp命令,在Linux系统、BSD、macOS和Windows的Linux子系统上均可安装,且在大多数Linux发行版默认安装。缺点是只有命令行界面,不过常用的内置命令不多,且非常容易掌握。例如,对应服务器端的sftp内置命令为ls/pwd/cd/rm/mkdir/rmdir/rename,几乎就是常规命令的极简版。对应本地端的sftp内置命令有/lls/lcd/lpwd等,注意它们前面都有个字母l。上传文件用put,下载文件用get,直白得很。此外exit和bye能退出sftp,help是良师益友。

PSFTP是PuTTY的一个组件,非常轻量,可共用PuTTY主程序存储的会话,也能利用PAGENT等组件的功能。但与sftp命令一样,PSFTP只提供命令行界面,其操作并不直观。

FileZilla FTP Client是经典的FTP客户端,支持多种文件传输协议,兼容Windows、Linux和macOS等主流系统,具有直观的图形界面、标签页式会话,容易配置。其SFTP功能取自于PuTTY。

WinSCP基于PuTTY,其图形界面与Windows系统几近完美地集成。其它特性包括双面板、拖拽上传/下载、标签页式会话。

此外,notepad++, Visual Studio Code等编辑器都提供了相应的SFTP插件,可方便地编辑远程主机上的文件。

参考资料

How to Setup Chroot SFTP in Linux (Allow Only SFTP, not SSH)