配置vsftpd.conf
下面来了解一下核心配置文件vsftpd.conf。它的地址为“/etc/vsftpd.conf”,控制语句格式为“语句=值”,注意不要在格式间加入任何空格和标点符号。man手册页中把控制语句分为布尔类(值为YES或NO)、数字类(值为数字)和字符串类(值为字符串)三种。为了管理方便、思路清晰,按照访问权(Access rights)、安全(Security)、功能(Features)和性能(Performance)分成四大类。下面是一个样本配置文件内容,用来说明常用的控制语句:
# Access rights
anonymous_enable=YES
/*若不想启用匿名访问请修改值为NO*/
local_enable=NO
/*关闭本地用户登陆服务,指所有非匿名用户*/
write_enable=NO
/*关闭任何用户的写权限*/
anon_upload_enable=NO
/*关闭匿名用户上传数据的能力*/
anon_mkdir_write_enable=NO
/*关闭匿名用户建立目录的能力*/
anon_other_write_enable=NO
/*关闭匿名用户执行建立和上传之外的写入类命令的操作,比如更
改名字和删除操作的能力*/
# Security
anon_world_readable_only=YES
/*开启匿名用户只能使用许可权为全部可读的资源*/
connect_from_port_20=YES
/*从标准端口20触发连接*/
hide_ids=YES
/*隐藏FTP服务器中用户的ID,用“FTP"取代*/
pasv_min_port=50000
pasv_max_port=60000
/*设置pasv传输模式下的端口范围为50000-60000*/
# Features
xferlog_enable=YES
/*开启日志,记录传输状态到文件/var/log/vsftpd.log*/
ls_recurse_enable=NO
/*关闭“ls -R"命令,该命令常被用于DoS攻击,非常浪费系统资源,
但“mirror"镜像工具会用到它*/
ascii_download_enable=NO
/*关闭ASCII模式下载,防止被用于DoS攻击,ASCII下载很消耗CPU负担*/
async_abor_enable=YES
/*开启支持早期FTP客户端“async ABOR"命令的能力*/
# Porformance
one_process_model=YES
/*开启每个IP单一进程模式,该模式仅支持具备一定能力的内核,
比如linux kernel 2.4*/
idle_session_timeout=120
/*踢出空闲了两分钟后的用户*/
data_connection_timeout=300
/*踢出空闲了五分钟后的下载*/
accept_timeout=60
/*踢出挂起了一分钟后的passive连接*/
connect_timeout=60
/*踢出挂起了一分钟后的活动连接*/
anon_max_rate=50000
/*限止单个用户的下载速度为不超过50kbytes每秒*/
至此,一个匿名服务器已经可以正常运行了,并且进行了安全方面的设置。实际中,根据FTP服务器不同的需求,比如想启用本地用户登录、想让某类用户具备上传能力、想让登录者看到一份友好的欢迎信息等,还可以在vsftpd.conf中进行相应的设置(用“man vsftpd.conf”参考man手册可获得更多的详细资料)。
有一些设置选项跟运行模式或外挂模块有关,还有一些选项必须依赖于另一个选项的启用状态。总之,只要精心搭配,完全可以定制出一个称心的FTP服务器。
tcp_wrappers的应用
要使用这项功能需要在安装编译之前构建包含tcp_wrappers的vsftpd。可通过编辑“builddefs.h”文件,将“#undef VSF_BUILD_TCPWRAPPERS”修改为“#define VSF_BUILD_TCPWRAPPERS”,然后重新构建编译,生成可执行代码。其次,要开启在配置文件vsftpd.conf中的选项“tcp_wrappers=YES”。该功能依赖于对文件“/etc/hosts.allow”的配置。以下是一个样例:
vsftpd: 192.168.1.3: setenv VSFTPD_LOAD_CONF /etc/vsftpd_tcp_wrap.conf
vsftpd: 192.168.1.4: DENY
其中,第一行表示如果一个客户端从192.168.1.3连接,那么vsftpd将应用“/etc/vsftpd_tcp_wrap.conf”的vsftpd配置文件给该连接。这些设置被应用在默认的vsftpd.conf之前。这一点十分有用,可用它为一些IP应用不同的访问限制(例如上传的能力);还可以指定某些IP有能力来超越连接限制(max_clients=0);或者为某些IP增减带宽限制。第二行表示拒绝192.168.1.4连接的能力。这一点对别有用心的连接者很有用。
PAM的应用
PAM应用也就是在开启了PAM的系统上应用“虚拟用户”功能。下面一个样例演示怎样利用“虚拟用户”来设置vsftpd的PAM。虚拟用户是指不像系统上的真实用户一样客观存在的用户。虚拟用户因此而比真实用户更安全,因为一个像这样有威胁系统安全的账户却仅能使用FTP服务。虚拟用户常用来服务那些不想开放给不被信任用户的内容,一般不影响正常的普通用户。
1.创建虚拟用户数据库
使用pam_userdb来鉴别虚拟用户。这需要一个“db”格式的用户名/密码文件。要创建一个“db”格式文件,首先要创建一个在交替行上写有用户名和密码的无格式文本文件,代码如下:
$ vi logins.txt
编辑文件内容如下:
tom
foo
fred
bar
上面的“tom”对应着密码“foo”,“fred”对应着密码“bar”。同时用root身份登陆,创建实际的数据库文件,代码如下:
$ db_load -T -t hash -f logins.txt /etc/vsftpd_login.db
# 要求已安装了Berkeley db 程序
这样即可创建“/etc/vsftpd_login.db”。如果想改变访问许可权限,可用如下命令:
$ chmod 600 /etc/vsftpd_login.db
此外,如果想了解更多有关如何维护登陆数据库的知识,可寻找在“Berkeley DB”上的文档资料,网址为http://www.sleepycat.com/docs/utility/index.html。
2.建一个使用新数据库的PAM文件
创建编辑文件vsftpd.pam,包含以下两行:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
accound required /lib/security/pam_userdb.so db=/etc/vsftpd_login
告诉PAM使用新数据库来鉴别用户。把该PAM文件保存到PAM目录(通常为“/etc/pam.d/cp vsftpd.pam /etc/pam.d/ftp”)。
3.为虚拟用户设置文件位置
接下来使用以下命令为为虚拟用户设置文件位置:
$ useradd -d /home/ftpsite virtual
$ ls -ld /home/ftpsite
将显示如下:
drwx------3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite
已经创建一个叫做“virtual”的用户,并且有一个主目录“/home/ftpsite”。增加一些内容到这个下载区域,代码如下:
$ cp /etc/hosts /home/ftpsite
$ chown virtual.virtual /home/ftpsite/hosts
4.定制vsftpd.conf配置文件
重新定制vsftpd.conf文件:
anonymous_enable=NO
local_enable=YES
# 由于安全因素应关闭匿名FTP,并开启非匿名FTP(虚拟用户需使用)。
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
# 出于安全目的写下这些确保命令,不许写命令执行
chroot_local_user=YES
# 限制虚拟用户到我们上面设置的虚拟FTP区域 /home/ftpsite。
guest_enable=YES
guest_username=virtual
# guest_enable很重要,能激活虚拟用户。guest_username表示所有
的虚拟用户都被映射到上面设置的真实用户“virtual”。这也将确定在文件系统上
虚拟用户的最终归宿,用户“virtual”的主目录“/home/ftpsite”。
listen=YES
listen_port=10021
# 这置vsftpd在“standalone”模式,不从inetd运行。这意味着仅需执行vsftpd
运行命令一次,它就开始运行起来。这也使得vsftpd监听在10021的非标准端口上
的FTP需求(FTP通常使用端口21)。
pasv_min_port=30000
pasv_max_port=30999
# 这些命令在被动FTP接收端放置一个端口序列。对配置防火墙很有用。
5.开始运行vsftpd
进入vsftpd源代码所在的目录,并执行“./vsftpd”,如果光标一直停在那里说明无误;否则将会看到一些错误信息。
6.测试
装载另一个Shell会话进程(或者把程序切换到后台运行,按CTRL+Z然后敲“bg”)。以下是一个FTP会话样例:
ftp localhost 10021
Connected to localhost (127.0.0.1).
220 ready, dude (vsFTPd 1.1.3: beat me, break me)
Name (localhost:chris): tom
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> ls
227 Entering Passive Mode (127,0,0,1,117,135)
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp> size hosts
213 147
ftp>
这里给出的密码是“foo”。不要因为出现“failed to open directory”而害怕,那是因为目录“/home/ftpsite”不全部可读。可以看到,通过size命令已经访问到复制进虚拟FTP区域的“hosts”文件。
功能扩充
虽然第一个vsftpd已经可以运行,但下面的内容可以扩充“VIRTUAL_USERS”,使设置变得稍微复杂一些。假定需要两类虚拟用户,一类仅仅能浏览和下载内容,另一种除能下载存在的内容之外还能上传新内容。可使用vsftpd强大的单用户使用配置能力(版本1.1.0以上)来完成这个设置。我们在早先的虚拟用户样例中创建了tom和fred两个用户,并设置fred拥有写权限,可访问上传的新文件;tom仅能下载。
1.激活单用户配置能力
要激活vsftpd的这个强大功能,增加下面的内容到“/etc/vsftpd.conf”:
user_config_dir=/etc/vsftpd_user_conf
并用“mkdir /etc/vsftpd_user_conf”创建目录。
2.给tom读取所有文件/目录的能力
在上个样例的末尾, 我们注意到虚拟用户仅能看全可读文件和目录。可以使“/home/ftpsite”目录全可读,并且上传有全可读许可的文件。但是做到这点的另一种方法是给tom下载非全可读文件的能力。
对于用户tom,强行提供一个配置设置给“anon_world_readable_only”,代码如下:
echo "anon_world_readable_only=NO" > /etc/vsftpd_user_conf/tom
然后检测一下,用tom登录,键入“ls”将返回目录清单。而用fred登录则应不显示。
可以重启vsftpd使刚才对“/etc/vsftpd.conf”文件的更改有效(高级用户可发送SIGHUP给vsftpd监听进程)。
3.给fred读取所有文件/目录和创建新文件/目录的权限,但是不具有干扰已经存在文件的能力,代码如下:
echo "anon_world_readable_only=NO" > /etc/vsftpd_user_conf/fred
echo "write_enable=YES" >> /etc/vsftpd_user_conf/fred
echo "anon_upload_enable=YES" >> /etc/vsftpd_user_conf/fred
最后检测一下,用tom登陆应该不能上传;而用fred登录能上传。并试着分别用tom和fred删除一个文件,应不能删除。
总结
以上实例均在Red Hat 8.0系统上试验通过,如遇到问题请仔细检查每个细节的正确性。实例中的内容可以根据具体环境进行增减、修改。相信稍加变通便可以打造出一个满意的、安全的FTP服务器。