公司各个部门不在同一个城市,经常需要互相传一些大文件,百度网盘太慢,于是就想到了建一个FTP服务器。普通FTP可能有安全性隐患,所以决定搭建一个SFTP。刚好Ubuntu的SSL服务自带了SFTP功能,我们要做的就是根据实际需求,进行配置。
- 如果还没有安装SSH,先安装
sudo apt install ssh
-
创建和管理可以访问SFTP的账号
一般,我们会希望有两种账号:一种是可以读写整个SFTP目录的内部账号;另一种是外部账号, 外部账号可以对某些目录只读,对某些账号可读可写,并且不能使用SFTP之外的任何服务,比如shell登录。
内部账号一般就是ubuntu的默认登录账号,假设叫做manager
外部账号需要从头创建 -
首先创建一个用户组 sftp-users
sudo addgroup sftp-users
- 然后,创建新用户guest,将其添加到sftp-users用户组, 并且关闭其Shell访问。
sudo adduser guest
sudo usermod -G sftp-users -s /bin/false guest
- 创建SFTP的根目录及共享目录
重点来了, SFTP的根目录必须满足以下要求:所有者为root,其他任何用户都不能拥有写入权限。
首先,使用sudo创建根目录及需要的子目录
sudo mkdir /home/sftp_root
sudo mkdir /home/sftp_root/doc
sudo mkdir /home/sftp_root/media
然后,为了其他用户能访问及管理SFTP的目录和文件,修改目录权限
// 将子目录权限修改为manager所有, sft-users用户组可以访问
sudo chown manager:sftp-users /home/sftp_root/doc
sudo chown manager:sftp-users /home/sftp_root/media
// 将doc目录权限修改为sftp-users用户只读
sudo chmod 750 /home/sftp_root/doc
// 将media目录权限修改为sftp-users可读可写
sudo chmod 770 /home/sftp_root/media
如果还有更多子目录,可以如法炮制
以上,用户及目录添加就结束了。
- 修改SSH配置文件
sudo vim /etc/ssh/sshd_config
在sshd_config文件的最后,添加以下内容:
AllowGroups manager sftp-users
Match Group sftp-users
ChrootDirectory /home/sftp_root
AllowTcpForwarding no
X11Forwarding no
ForceCommand internal-sftp
然后重启ssh
sudo /etc/init.d/ssh restart
不出意外的话,大功就告成了,可以使用FileZilla等FTP客户端测试一下。
- 有些人可能还有个需求,比如,有很多想共享的文件在其它目录下,难道只能把他们一个个拷贝到SFTP目录下吗?首先我们想到了软链接,然后发现因为权限问题, 软链接过来的目录,无法被sftp-users用户访问。
幸好,我们还有Bind mount:
Use bind mounts:
mount -o bind sourcefolder targetfolder
将sourcefolder映射到targetfolder
比如,/home/manager/media目录下已经有很多多媒体内容,想要直接在SFTP目录下共享:
mount -o bind /home/manager/media /home/sftp_root/media
就可以了
如果要取消的话:
umount /home/sftp_root/media
参考:https://my.oschina.net/BearCatYN/blog/496880
https://www.cnblogs.com/MrListening/p/5821296.html
https://askubuntu.com/questions/550813/how-to-create-link-that-can-be-followed-in-sftp
https://blog.csdn.net/humanking7/article/details/87898889
https://www.cnblogs.com/xkkj/p/7277405.html