导言
有很多方法,可实现在网络上分享文件。其中之一为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)