2010年10月10日星期日

Ubuntu下用vsftpd架设FTP服务器

目的:

架设FTP服务器,并有三个帐户:
  • download: 下载帐号,主目录为/home/vsftpd, 在该目录下只有只读权限;
  • upload: 上传帐号,主目录为/home/vsftpd/upload, 在该目录下有读写权限,但是不能删除和修改已有文件;
  • admin: 管理员帐号,主目录为/home/vsftpd,有所有权限。

步骤:

1. 安装vsftpd和db4.8-util
sudo apt-get install vsftpd db4.8-util
2. 建立虚拟用户口令库文件(奇数行用户名,偶数行密码)。文件内容示例:
xxx@ubuntu:~$ cat /tmp/loguser.txt
download
downloadpass
upload
uploadpass
admin
adminpass
注意:不要有多余的空格和空行

3. 生成数据库文件,并设置其访问权限
sudo db4.8_load -T -t hash -f /tmp/loguser.txt /etc/vsftpd_login.db
sudo chmod 600 /etc/vsftpd_login.db
4. 修改文件/etc/pam.d/vsftpd,使其内容如下(注释掉原有内容):
xxx@ubuntu:~$ cat /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd_login
5. 为虚拟用户创建本地系统用户
新建一个系统用户vsftpd,用户家目录为/home/vsftpd, 用户登录终端设为/bin/false(即使之不能登录系统)
sudo useradd vsftpd -d /home/vsftpd -s /bin/false
sudo mkdir /home/vsftpd
sudo mkdir /home/vsftpd/upload
sudo chown vsftpd:vsftpd /home/vsftpd
sudo chown vsftpd:vsftpd /home/vsftpd/upload
6. 修改/etc/vsftpd.conf,一般要确保含有以下设置:
listen=YES
anonymous_enable=NO
pam_service_name=vsftpd
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd_user_conf
7. 创建虚拟用户权限配置文件夹和配置文件
sudo mkdir /etc/vsftpd_user_conf
cd /etc/vsftpd_user_conf
sudo touch download upload admin
download文件内容如下:
anon_world_readable_only=NO
local_root=/home/vsftpd
upload文件内容如下:
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
local_root=/home/vsftpd/upload
admin文件内容如下:
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/vsftpd
注意:不要有多余的空格(和空行)

8. 重启vsftpd:(phew~)
/etc/init.d/vsftpd restart
9. 测试一下:
lftp localhost -u download,downloadpass
lftp down@localhost:/>ls
应该可以看到目录下的文件(如果有的话)
 
其他:

1. 还有一些其他参数,如速度限制、登录数限制等都可以在vsftpd.conf进行相应设置,甚至可以针对每个用户进行相应的设置。

2. 按照以上方法进行配置,目前还有个问题:本地用户无法登陆。报的错误是:
Login failed: 530 Login incorrect.
根据Manpage of VSFTPD.CONF所说:
guest_enable
If enabled, all non-anonymous logins are classed as "guest" logins. A guest login is remapped to the user specified in the guest_username setting.
local_enable
Controls whether local logins are permitted or not. If enabled, normal user accounts in /etc/passwd (or wherever your PAM config references) may be used to log in. This must be enable for any non-anonymous login to work, including virtual users.
如果使用了虚拟用户,那么所有非匿名用户(包括本地用户)都会映射到guest_username,即vsftpd这个用户,这样就造成了冲突。就是说鱼与熊掌不可兼得,本地用户和虚拟用户不能同时得到支持。不知道我理解得对不对。

参考链接:

Manpage of VSFTPD.CONF
vsftpd用户权限设置
为VSFTPD配置虚拟用户(文本方式)
vsftpd的虚拟用户配置
Vsftpd虚拟用户设置