500 OOPS: vsftpd: refusing to run with writable root inside chroot 原因及解决办法初析[ubuntu, vsftpd, ftp server]
在网络应用日益发达的今天 FTP无疑是继WWW网络之后最为流行的软件应用之一, 在linux世界中也同样如此, 使用的FTP 软件也不外乎wu-Ftp, proFtpd(不考虑win下的serv-U), vsFtpd, 这三款FTP软件各有千秋, 大致的功能特点详见另一篇文章, 作为流行度最高的FTP server来说, VSFTP的优势也是有目共睹的.VSFTP本身的含义就是very secure FTP, 安全性自然占有优势, 而且它的安装及配置比较简单, 功能也比较强大, 在本博的文章文章中有这方面的配置教程, 在经过简单的配置后,即可投入使用, 但是就目前的较新版本而言(不论是安装最新的版本,还是由旧版本升级而来都包括在内), 也许是考虑到安全方面的因素, 提高了它的安全级别, 但是同时也带来了一些问题. 最常见的就是如下的提示:
500 OOPS: vsftpd: refusing to run with writable root inside chroot
虽然这个问题已经在本博的其他文章中有所解释, 但是只是提供了比较简单的解决方案, 对于解决它更多的思路却没有更多地展现出来, 下面结合国外的相关资料就这个问题做一个综合性的总结.
新版本的vsftpd(含全新安装以及升级后的vsftpd 和vsftpd-ext)在登陆时出现如下的错误提示:
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
出现的原因是:
Add stronger checks for the configuration error of running with a writeable
root directory inside a chroot(). This may bite people who carelessly turned
on chroot_local_user but such is life.
据以上的内容可知, vsftpd提高了它的安全性, 以确定在用户的主目录可写性因用户启用了chroot_local_user选项而导致的权限问题, 但是这个也同时给用户的正常登陆带来了问题, 也就是说, 用户的主目录(一般是/home/user 如/home/wwufengg)是不可写的,如果你在设置用户权限时设置了可写权限,就会出现如上所示的500 OOPS错误. 归根到底就是由于vsftpd的用户权限设置过严导致的. 既然知道了它产生的根源, 解决办法就是给用户设置合适的权限即可, 命令如下:
chmod a-w /home/user //如我的用户: chmod a-w /home/user
或者
chmod 755 /home/user //如我的用户: chmod 755 /home/user
两个命令均可达到同样的效果. 在重启vsftpd后,
service vsftpd restart //推荐使用这个命令
或者
/etc/init.d/vsftpd restart
问题即可解决.
或者你可以通过修改配置文件中的选项来解决, 针对标准vsftpd(standonly)模式,
allow_writeable_chroot=YES
针对vsftpd-ext(xinet.d)模式的:
allow_writable_chroot=YES
从总体上来看, 通过限制用户的主目录写权限的方式来控制用户的访问并不是完美的解决方案, 因为当你在资料在上传到该目录时会发现即使FTP客户端软件提示已经上传完成, 实际上也不会上传成功的. 除非你开放写权限给用户.但是如果你这样做的话, 就会出现那个500 OOPS, 这是一个悖论, 目前来看, 比较好的解决方案就是给用户的根目录新建一个子目录, 然后赋予这个子目录一个可读,可写,可执行的权限. 以下是另外的3种解决思路, 一并列出, 供参考:
1. 在VSFTP的配置文件(/etc/vsftpd.conf)中添加一个 local_root选项, 在这个选项里定义一个可供FTP USER访问的目录, 须以绝对路径定义.
2. 在VSFTP的配置文件(/etc/vsftpd.conf)中添加一个 passwd_chroot_enable选项并启用, 即passwd_chroot_enable=YES, 同时在系统的密码文件(/etc/passwd)中找到对应的用户并修改如下的参数值,
/home/wwufengg => /home/./wwufengg
参考选项图1:
变为如图:
通过这种方法, 就可以把用户的主目录固定到指定的目录下.
3.下载vsftpd-ext资源,编译并覆盖已经存在的源码编译过vsftpd配置文件或者是直接编译已经存在的源码配置文件, 增加一个选项并配置为allow_writeable_root=YES, 注意配置选项中的YES要大写,并且和=中间没有空格. 切记.
需要说明的是, 虽然我经过以上几种方法的实验来看, 都不能完全解决这个问题, 目前比较有效的解决方法就是如wwufengg所说的, 给用户的根目录新建一个子目录, 然后赋予这个子目录一个可读,可写,可执行的权限. 虽然不能彻底解决, 现在来看,应该是最接近解决这个问题的方案了.
reference source: http://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/#comment-2051