vsftpd配置chroot

原文来自我的博客,发表于2016/12/03,故文章中所提及的相对时间皆以此为原点。

鉴于信息技术类文章搬家计划,将其由主站移动至此。

一个半月前我曾为所在大学的英语课提供了网盘的镜像。博客上一篇文章便是记述配置网页程序与SSL的过程。如今,原先使用的360云盘不再允许上传文件,这个镜像或将成为主力……

这次配置是为达到以下目的

  1. 为教师提供单独用户,使教师能直接管理内容
  2. 教师用户不能访问或修改./USTB_English的上级目录及其中内容

这与虚拟主机提供商的需求十分相似——让一个用户只能通过FTP访问、修改自己的文件.


vsftpd所提供的chroot功能便可实现,官方对此功能给出了如下解释:

Place local users in a chroot() jail in their home directory after login

官方文档中与chroot有关的参数有三:chroot_local_userchroot_list_enablechroot_list_file。其中chroot_list_file定义chroot list所在路径。

而前二者共有四种组合,能实现如下功能

chroot_local_user=YESchroot_local_user=NO
chroot_list_enable=YES除chroot list中的用户,所有用户受限仅chroot list中的用户受限
chroot_list_enable=NO所有用户受限所有用户不受限

执行如下命令:

#添加名为teacher的用户,并使其不可登录Shell
useradd teacher -s /sbin/nologin
#为teacher设置密码
passwd teacher
#修改其主目录为课程内容所在目录
usermod teacher -d /var/www/hr98_tk/USTB_English
#将teacher设为该目录所有者
cd /var/www/hr98_tk
chown -R teacher ./USTB_English
#建立chroot_list
cd /etc
touch vsftpd.chroot_list
#将root用户添加至chroot_list
echo "root">>./vsftpd.chroot_list

并修改vsftpd配置文件:

# vim /etc/vsftpd.conf

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

重载vsFTPd配置文件:systemctl reload vsftpd


一切看似完成,问题却来了——使用root用户登录无任何问题,使用被chroot的teacher用户无法登录

500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

问题原因是chroot根目录对被chroot用户可写。但该目录必须对用户teacher可写。

最终在Stack Overflow的一个问题中找到了解决方法——在配置文件中添加一行:

vim /etc/vsftpd.conf

allow_writeable_chroot=YES

重载vsFTPd配置文件systemctl reload vsftpd后,用户teacher也可以正常登录并不能访问上一级目录,但可对所在目录进行写入操作.至此全部完成


尔后,我在vsFTPd官方文档里搜索allow_writeable_chroot,没有任何结果。官方文档竟然完全没提到这个参数.