Vsftpd虚拟用户配置的实现

Vsftpd是在UNIX/Linux中非常安全且快速的FTP服务器,相对于本地(local_user)用户来说,虚拟用户只是相对于FTP服务器而言才有的用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取 FTP服务器中的文件,增加了对用户和下载的可管理性。对于考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。

Vsftpd是在UNIX/Linux中非常安全且快速的FTP服务器,vsftpd的官方网站:http://vsftpd.beasts.org/上说:Probably the most secure and fastest FTP server for UNIX-like systems。相对于本地(local_user)用户而言,虚拟用户只是相对于FTP服务器而言才有的用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。对于局域网来说,开放匿名用户也不会对安全影响过大,所以我们提供一种匿名用户和虚拟用户两种并存的解决方案。

本文档基于SuSE Linux 10.1和vsftpd-2.0.4测试成功,如果平台不同或者版本有异,可能稍有出入。本文参考了vsftpd官方的文档(英文)以及 www.chinaunix.net上的文章,感谢这些人的付出,因本人英文水平太低,所以如果有译文不当之处敬请指正,我的EMAIL: [email protected],也可到网站论坛上讨论:http://freeedu.kmip.net。

一、安装
下载软件包,解压后,
Shell>cd /srv/ftp/pub/vsftpd-2.0.4
shell>make
shell>make install
将会安装以下文件:
/usr/local/sbin/vsftpd;
/usr/local/man/man8/vsftpd.8
/usr/local/man/man5/vsftpd.conf.5
/etc/xinetd.d/vsftpd
程序要使用nobody用户,所以建立它
shell>useradd nobody
还要/usr/share/empey目录,建立它
shell>mkdir /usr/share/empty

二、配置
注意:vsftpd 有2种运行模式,一种是通过xinetd运行,一种是独立模式。个人认为独立模式更容易控制一些。
它的配置文件一般是在/etc/vsftpd.conf,我们在源码目录中复制就行了
shell>cp vsftpd.conf /etc/vsftpd.conf
下面是它的配置文件的官方说明:
http://vsftpd.beasts.org/vsftpd_conf.html

在源码目录中找到EXAMPLE目录,它包括了使用vsftpd 的各种示例(详细说明请参见该目录下的README文件)。
VIRTUAL_USERS How to set up virtual users with vsftpd.
VIRTUAL_USERS_2 Advanced virtual users - different access rights.
我们参考了最后的2个,用来实现虚拟用户以及高级虚拟用户-给予不同的访问权限。

(一)使用PAM实现虚拟用户
PAM的英文全称是Pluggable Authentication Module系统,即此程序是有关执行用户鉴别和帐号维护的服务。鉴别部分通常通过一(合法性)质询-回应的交互来完成的。使用PAM,管理员可以通过不重编辑鉴定程序来定制一些使用方法。
虚拟用户是指系统上并不存在的用户,相对于真实用户来说,它有更好的安全性。
1) 创建虚拟用户
我们准备使用pam_userdb来认识虚拟用户。这需要一个存储用户名/密码的”db”格式的通用数据库文件。要想创建一个”db”格式的通用数据库文件,首先要创建一个用户名和密码交互的文本文件,比如”logins.txt”,我们指定用户” download”使用密码” download”,” admin”使用密码” upanddownadnwrite”。我们创建了一个目录用来存储这些东西,/etc/vsftpd。
Shell>mkdir /etc/vsftpd
Shell>cd /etc/vsftpd
Shell>vi /etc/vsftpd/logins.txt
以下是logins.txt的内容
download
download
admin
upanddownadnwrite
现在我们创建数据库文件(为防止意外请使用root用户登录):
Shell>db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
(这要系统上已经安装Berkeley db程序,如果没有安装,请到这个站点上下载安装 http://dev.sleepycat.com/downloads/releasehistorybdb.html。注意: 很多系统上安装了多个版本的 "db" ,vsftpd官方原文说可能要db3_load,经过测试db4_load也可以用。)
这将会创建 /etc/vsftpd/vsftpd_login.db. 很明显你想要对它进行权限的限制
chmod 600 /etc/vsftpd/vsftpd_login.db
关于数据库的更多信息,查看以下文档:
http://www.sleepycat.com/docs/utility/index.html
2) 创建一个使用数据库的PAM文件
我们这个文件名是 vsftpd.pam. 它的内容:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
它告诉PAM使用我们新建的数据库来认证用户。将这个PAM放置到PAM目录中,通常是/etc/pam.d
cp vsftpd.pam /etc/pam.d/ftp
(注意 – 如果你已经在/etc/vsftpd.conf中将pam_service_name设置成了 vsftpd,你就要把它复制成 /etc/pam.d/vsftpd).
3) 设置虚拟用户的文件位置
useradd -d /ftp_server/ virtual
ls -ld /ftp_server
(将会出现如下结果):
drwx------ 3 virtual virtual 4096 Jul 30 00:39 /ftp_server/

我们已经创建了一个名叫 "virtual" 主目录是"/ftp_server/"的用户。
4) 创建你的vsftpd.conf 配置文件
下面是vsftpd.conf的配置文件内容,让我们一行一行来分析它:
anonymous_enable=NO
local_enable=YES

出于安全的角度禁用了匿名(anonymous)用户,启用非匿名用户—就是我们刚才我们创建的虚拟用户“virtual“。

write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

这些是出于安全的目的,写命令全部被禁用了。
chroot_local_user=YES

这个是确信能将虚拟用户限制在我们上述的/ftp_server/目录中。

guest_enable=YES
guest_username=virtual

这个 guest_enable是非常重要的—它用来激活虚拟用户! guest_username 是将所有虚拟用户映射成我们先前设置的真实用户"virtual"。这也决定了虚拟用户在文件系统中的位置,也就是"virtual"的主目录 /ftp_server/。

listen=YES
这个将vsftpd 设置成独立模式( "standalone" mode)也就是不通过 inetd或者xinetd来运行。这意味着你直接运行vsftpd的可执行命令就可以启动它了。
将vsftpd.conf复制到 /etc/vsftpd/:
cp vsftpd.conf /etc/vsftpd/
5) 启动 vsftpd.
shell>service vsftpd start
如果你想要让它在后台运行,可以输入vsftpd &
shell>vsftpd &
如果正常,不会有什么提示,如果不正常,你将会看到一些出错提示。
如果想退出,可以使用killall
shell>killall vsftpd
6)测试
开启另一个shell对话
Shell> ftp localhost
Trying 127.0.0.1...
Connected to localhost.
220 Welcome to FREEEDU FTP service.
Name (localhost:root): download
331 Please specify the password.
Password:(此处输入密码)
230 Login successful. Have fun.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp>bye

注解:
要密码时我们输入 "download",如果出现 "failed to open directory",不要着急,因为目录
/ftp_server/不是全局读属性(如果想更改,可以通过设置 anon_world_readable_only=NO来实现,这个默认是YES,它是用来设置匿名用户只能下载全局可读的文件)。

(二)高级虚拟用户-给予不同的访问权限
这个例子演示了如何拓展上面的例子来实现更为复杂的设置。
让我们来假设需要两类虚拟用户——一个只能浏览和下载内容,另一个不仅可以下载原有内容还可以上传新的内容。要完成这个目的,我们可以使用vsftpd强大的per-user(每用户)配置功能。
在上一个虚拟用户例子中我们创建了2个用户-- download and admin,我们想让admin 有写的权限和上传新文件的权限,同时,download 则只能下载。

1) 激活per-user 配置
要激活这个强大的功能,添加下面的一行到/etc/vsftpd.conf:
user_config_dir=/etc/vsftpd/vuser
如果没有目录请创建之(我们前面已经创建了,所以这步可省略)
shell>mkdir /etc/vsftpd/vuser
2) 给予download 访问/目录下所有文件的权限
在上一个例子的结尾,我们注意到虚拟用户只能访问有全局读属性的文件和目录。我们可以使用chmod命令来改变/ftp_server/目录的属性,然而我们还可以通过另一种方法来实现这个目的—让download有下载非全局读属性的文件的权利。
专门为用户download设置一个配置文件来覆盖anon_world_readable_only的值:
shell>echo "anon_world_readable_only=NO" > /etc/vsftpd/vuser/ download
让我们来检测一下:用download登录,使用ls命令来返回目录列表!使用admin则不能。
注意 – 如果改变了/etc/vsftpd/vsftpd.conf,就要重新启动vsftpd。 (高手级用户可以向vsftpd listener process发送 SIGHUP信号来达到目的)。
3) 给予 admin 读取 / 目录下所有文件的能力以及创建新文件的权力但不能对已经存在的文件进行干预。
shell>echo "anon_world_readable_only=NO" > /etc/vsftpd/vuser/admin
shell>echo "write_enable=YES" >> /etc/vsftpd/vuser/admin
shell>echo "anon_upload_enable=YES" >> /etc/vsftpd/vuser/admin

检测一下 – 使用download登录你不能上传,使用 admin登录你就可以!
试着使用这2个用户的身份来删除一个文件- 无论哪个都不能实现。

(三)在开放虚拟用户同时开放匿名用户
可以通过修改/etc/vsftpd.conf来开放匿名用户,这对于局域网用户来说很有用,而且也没有什么安全的影响。要开放匿名用户请修改成
anonymous_enable=YES
(四)可能出现的问题及解决
如果你的机器上总不能登录可能是因为没有安装pam-devel,请用ldd命令检查生成的vsftpd文件有没有加载 /lib/libpam.so.0,如果没有请安装pam-devel,可使用rpm,也可从源代码编译安装pam。安装后,回到vsftpd的源码目录中
# make clean
# make
#make install
再次用ldd检查vsftpd,看有没有libpam.so.0。

如果你在源码目录中执行过make install,将会安装几个文件到系统中,其中就有一个/etc/xinetd.d/vsftpd,要注意这个文件,如果它其中的内容disable=NO,那么,启动vsftpd时就会出错:
500 OOPS: could not bind listening IPv4 socket
所以请你把它改成disable=YES

相关文献:
vsftpd.conf官方配置文件说明
http://www.chinaunix.net/jh/15/586793.html

我的vsftpd.conf

anonymous_enable=NO
pasv_promiscuous=YES
port_promiscuous=YES
local_enable=YES
write_enable=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
listen=YES
user_config_dir=/etc/vsftpd/vuser
max_clients=40
max_per_ip=2