星期二, 三月 20, 2007

vsftpd website && sharing by users

vsftpd 为不同用户进行不同设置中,其主要目的为了可以将 apache 的不同虚拟主机赋予不同的人员进行管理,或者至少管理人员不需要使用 httpd 这个帐户来登录 ftp。那么有一个问题,就是 $htdocs_prefix/$site 的属主和权限应该如何设置(设对 $user 的 vsftpd local_root=$htdocs_prefix/$site, 即 DocumentRoot)。

我开始考虑能不能对不同的 VirtualHost/DocumentRoot 使用不同的 User/Group,于是在 httpd.conf 中进行了调整。但最终报错:
Syntax error on line 433 of /usr/local/apache2/conf/httpd.conf:
User cannot occur within "<"VirtualHost">" section
那么还是回到文件和目录权限这个思路上来。

$htdocs_prefix/$site 应该属于 httpd 用户(设 Apache 以该用户身份运行),还是应该属于 $user 这个用户?

我开始设想,如果设置属于 httpd 用户和组,因为 $user 是通过 ftp 上传文件的,而 vsftpd 这个进程是以 root 身份运行的,所以不需要另外再设置对它的系统权限,不论是否已经存在某个文件,都可以成功的进行上传(已存在则可选择是否覆盖)。而为了使 httpd 进程能够读写页面,就必须使其属主为 httpd。

这时唯一的问题是,上传后的文件的属主是 $user,而不是 httpd,所以为了使新上传的文件也能够被 httpd 正确读写,需要设置 vsftpd 的 chown_upload:
sh# vi /etc/vsftpd/vsftpd.conf
chown_uploads=YES
chown_username=httpd
但实际上这样也是不行的,因为 chown_* 只对 anonymous 用户有效,对其他用户是不行的。

所以我只能令其属于 $user 用户,并属于 httpd 组,并令 $user 也成为 httpd 的组成员,对目录增加权限:g+ws,因为如果目录拥有 g+s,则其创建的子目录也将拥有 g+s,对普通文件增加权限:g+w。这样 httpd 进程对目录和文件都具有操作能力,上传的文件也会自动属于 httpd 组。
sh# find . | xargs chmod g+w
sh# find . -type d | xargs chmod g+s

sh# vi /etc/vsftpd.conf
local_umask=002
umask 002 对普通文件及为 775,对目录即为 664。

除非在脚本中使用了 chown 这样的调用,否则这样就可以了。

对于更负责的需要,可能需要利用 cgiwrap 这样的 CGI 脚本了。在 sourceforge 上可以找到这个项目。

没有评论: